You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter应用中通过热点向ESP32发送Wi-Fi凭证

家庭Wi-Fi凭证配网(SoftAP模式)Flutter实现方案

核心流程回顾

你的配网逻辑是标准SoftAP模式,关键节点:

  1. IoT设备启动专属热点
  2. 手机App切换连接该热点
  3. App通过热点内网发送家庭Wi-Fi SSID/密码到设备
  4. 设备断开热点,连接目标Wi-Fi
  5. 设备反馈配网结果(可选)

Flutter端落地步骤

1. 先补全权限配置

这是很多包失效的核心原因,务必配全Android/iOS权限:

  • Android(AndroidManifest.xml):
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 10+ 强制要求,用于扫描热点 -->
    <uses-permission android:name="android.permission.INTERNET" />
    
  • iOS(Info.plist):
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>需要获取位置权限以扫描Wi-Fi热点</string>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/> <!-- 允许无网热点内的HTTP请求 -->
    </dict>
    

2. 基于wifi_iot的实操方案

你之前试过这个包,大概率是没结合设备端通信逻辑,以下是完整链路:

步骤1:扫描并连接设备热点

import 'package:wifi_iot/wifi_iot.dart';

// 扫描周边热点
List<WifiNetwork> networks = await WifiIoT.loadWifiList();
// 定位你的IoT设备热点(比如SSID为"MyDevice_AP")
var deviceAp = networks.firstWhere((n) => n.ssid == "MyDevice_AP", orElse: () => null);
if (deviceAp == null) {
  // 提示用户设备未启动热点
  return;
}
// 连接设备热点(设备热点一般是开放或有固定初始密码)
bool isConnected = await WifiIoT.connect(
  deviceAp.ssid,
  password: "device_ap_default_pass",
  security: NetworkSecurity.WPA,
);

步骤2:通过TCP/UDP发送Wi-Fi凭证

IoT设备在SoftAP模式下默认网关为192.168.4.1,设备端需提前监听对应端口(比如8080):

import 'dart:io';
import 'dart:convert';

// TCP方式发送(可靠性更高)
try {
  Socket socket = await Socket.connect('192.168.4.1', 8080);
  // 发送JSON格式的凭证
  socket.write(jsonEncode({
    "ssid": "YourHomeWiFi",
    "password": "YourHomeWiFiPass"
  }));
  await socket.flush();
  socket.close();
  // 提示用户等待设备切换网络
} catch (e) {
  // 处理连接失败(设备未开启服务/IP错误)
}

3. ESP系列设备专属优化

如果你的IoT设备是ESP32/ESP8266,可直接对接官方SoftAP配网逻辑:
连接设备热点后,通过HTTP POST请求发送凭证(设备端需实现/config接口):

import 'package:http/http.dart' as http;

var response = await http.post(
  Uri.parse('http://192.168.4.1/config'),
  body: {
    'ssid': 'YourHomeWiFi',
    'password': 'YourHomeWiFiPass',
  },
);
if (response.statusCode == 200) {
  // 配网请求发送成功,等待设备连接家庭Wi-Fi
}

4. 常见问题排查

  • Android连接热点失败:检查位置权限是否授予(Android 10+必须开启位置服务才能扫描热点)
  • iOS无法自动连接热点:iOS系统限制App自动切换热点,需引导用户手动跳转设置页:
    import 'package:url_launcher/url_launcher.dart';
    
    await launchUrl(Uri.parse('app-settings:wifi'));
    
  • 发送凭证无响应:确认设备端已开启对应端口的服务,且手机IP处于192.168.4.x网段

内容的提问来源于stack exchange,提问作者webaddicted

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:43:18