4、经典配网模式:SmartConfig(ESP-Touch)、蓝牙辅助配网、AP模式配网、二维码配网
配网,说白了就是让设备知道你家Wi-Fi的SSID和密码。我刚开始做物联网那会儿,设备还得用网线连电脑配置,用户体验差得离谱。后来各种无线配网方案冒出来了,今天咱们就把四种经典模式掰开揉碎讲清楚。
这四种模式各有各的适用场景,没有绝对的好坏。我个人的习惯是:量产产品优先考虑蓝牙辅助配网,低成本方案用SmartConfig,调试阶段用AP模式,固定场景用二维码。你想想看,选对了配网方式,用户第一印象就好了一大半。
核心观点:配网的本质是「信道协商」+「凭证传输」。设备不知道路由器的信道,也不知道密码,配网就是解决这两个未知数。
4.1 SmartConfig(ESP-Touch)
SmartConfig 是乐鑫最早推出来的一键配网方案,也叫 ESP-Touch。它的原理挺巧妙:手机把 SSID 和密码编码到 UDP 报文的长度字段里,设备在混杂模式下监听所有 Wi-Fi 包,从中解出配网信息。
说白了,就是设备还没连上路由器,但能「偷听」到空中的 Wi-Fi 数据包。我当年第一次调通这个流程时,觉得这招真绝——不需要设备先连上网络,就能把密码传过去。
经验之谈:SmartConfig 的成功率很大程度上取决于路由器。有些路由器会过滤组播包,或者加密方式特殊,导致设备收不到编码信息。我建议在产品说明里加一句:「如果配网失败,请尝试 AP 模式。」
ESP-Touch 的编码方式是这样的:
// 伪代码:ESP-Touch 编码逻辑
void encode_wifi_info(char *ssid, char *password) {
// 1. 将 SSID 和密码拼接成特定格式
char *data = malloc(strlen(ssid) + strlen(password) + 2);
sprintf(data, "%s:%s", ssid, password);
// 2. 对每个字节进行长度编码
for (int i = 0; i < strlen(data); i++) {
// 发送一个 UDP 包,包长 = 数据字节值 + 基准长度
send_udp_packet(data[i] + BASE_LEN);
delay(10); // 间隔 10ms
}
// 3. 发送结束标记
send_udp_packet(0xFF + BASE_LEN);
}
设备端收到后,按包长减去基准长度,就能还原出原始数据。嗯,这里要注意:基准长度的选择很关键,太短容易被其他网络包干扰,太长又浪费带宽。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 基准长度 | 100 字节 | 低于常见 TCP ACK 包长,减少误判 |
| 发送间隔 | 10-20 ms | 太快设备处理不过来,太慢用户体验差 |
| 重试次数 | 3-5 轮 | 防止丢包导致配网失败 |
| 超时时间 | 60 秒 | 超过此时间未收到视为失败 |
避坑指南:我曾经遇到过一个项目,SmartConfig 在测试环境百试百灵,到了用户家里死活配不上。查了两天才发现,用户的路由器开启了「WMM(Wi-Fi Multimedia)」模式,导致 UDP 包被优先调度,设备收不到稳定的编码序列。解决方案是在设备端增加滤波算法,只关注特定时间窗口内的包。
4.2 蓝牙辅助配网
蓝牙辅助配网是目前体验最好的方案之一。设备同时支持 BLE 和 Wi-Fi,手机先通过 BLE 与设备建立连接,然后把 Wi-Fi 凭证通过 GATT 服务写过去。
为什么说它体验好?因为 BLE 是双向通信,手机能实时知道设备是否收到了信息,还能做交互确认。我做的第一款带蓝牙配网的产品,用户反馈配网成功率从 SmartConfig 的 85% 直接飙到了 98%。
典型的蓝牙配网流程是这样的:
- 设备广播:设备上电后,BLE 广播特定 Service UUID,比如
0xFFE0 - 手机扫描:App 扫描到设备,发起连接
- 服务发现:手机发现 GATT 服务,找到配网 Characteristic
- 写入凭证:手机将 SSID + 密码写入设备
- 设备确认:设备收到后回复 ACK,然后切换 Wi-Fi 模式连接路由器
- 结果上报:设备通过 BLE 上报连接结果(成功/失败)
// 蓝牙配网 GATT 服务定义示例
// 配网服务 UUID: 0xFFE0
// 配网特征值 UUID: 0xFFE1
// 写入数据格式(JSON 或自定义协议)
{
"ssid": "MyWiFi",
"password": "12345678",
"token": "a1b2c3d4" // 可选,用于安全校验
}
// 设备端处理回调
void on_write_callback(uint8_t *data, uint16_t len) {
// 解析 JSON
cJSON *root = cJSON_Parse((char *)data);
char *ssid = cJSON_GetString("ssid");
char *password = cJSON_GetString("password");
// 保存到 NVS
nvs_save_wifi_config(ssid, password);
// 回复 ACK
send_ble_response("OK");
// 切换 Wi-Fi 模式
wifi_connect(ssid, password);
}
个人建议:蓝牙配网一定要做「超时回退」。如果设备在 30 秒内没有收到配网信息,应该自动进入低功耗休眠,而不是一直广播耗电。我习惯的做法是:广播 30 秒 → 休眠 5 分钟 → 再广播 30 秒,如此循环。
4.3 AP 模式配网
AP 模式是最「笨」但也最可靠的方法。设备自己开一个 Wi-Fi 热点,手机连上这个热点,然后通过 HTTP 或 Socket 把路由器信息传给设备。
你想想看,为什么它可靠?因为设备开热点是「自己说了算」,不存在路由器兼容性问题。我遇到过不少工业客户,他们宁愿多操作两步,也要用 AP 模式——稳定压倒一切。
AP 模式的标准流程:
- 设备启动 SoftAP,热点名通常叫
SmartDevice_XXXX - 手机 Wi-Fi 切换到该热点
- 手机访问设备 IP(通常是
192.168.4.1) - 在网页或 App 中输入路由器 SSID 和密码
- 设备收到后关闭热点,连接目标路由器
// AP 模式 HTTP 服务器伪代码
void start_ap_http_server() {
// 1. 启动 SoftAP
wifi_softap_config_t ap_config = {
.ssid = "SmartDevice_001",
.password = NULL, // 开放热点,方便连接
.channel = 6,
.max_connection = 1
};
wifi_softap_start(&ap_config);
// 2. 启动 HTTP 服务器
http_server_start(80);
// 3. 注册配网接口
http_register_handler("/config", HTTP_POST, [](request *req) {
char *ssid = req->get_param("ssid");
char *password = req->get_param("password");
// 保存并切换模式
save_and_switch(ssid, password);
return "OK";
});
}
避坑指南:我曾经犯过一个低级错误——AP 模式的热点没有设置超时关闭。结果用户配完网,设备连上路由器了,但热点还开着,白白耗电。后来我加了个逻辑:设备成功连接路由器后,立即关闭 SoftAP。另外,热点名最好带上设备 MAC 后四位,方便用户区分多个设备。
4.4 二维码配网
二维码配网是个「取巧」的方案。它把 Wi-Fi 信息直接编码成二维码,贴在设备上或显示在屏幕上,手机扫码后自动解析并连接。
说白了,就是省去了「传输」这一步——信息已经提前写好了。这个方案最适合固定网络环境,比如工厂、仓库、智能家居网关。我见过一个智能灯的项目,出厂时就把家里 Wi-Fi 信息烧进二维码,用户扫码即用,体验极好。
二维码的编码格式通常遵循 Wi-Fi 联盟的规范:
// 二维码 Wi-Fi 配置格式
WIFI:T:WPA;S:MyWiFi;P:12345678;;
// 字段说明:
// T: 加密类型(WPA/WPA2/WEP/nopass)
// S: SSID
// P: 密码
// ;; 结束符
// 示例:开放网络
WIFI:T:nopass;S:GuestWiFi;;
// 示例:WPA2 加密
WIFI:T:WPA;S:HomeWiFi;P:password123;;
手机端扫码后,解析出 SSID 和密码,直接调用系统 Wi-Fi API 连接。整个过程用户只需要「扫一下」和「点确认」两步。
| 场景 | 二维码配网适用性 | 备注 |
|---|---|---|
| 家庭环境 | 一般 | Wi-Fi 密码可能变更,二维码需重新生成 |
| 工厂/仓库 | 非常适合 | 网络固定,批量部署效率高 |
| 酒店/商场 | 适合 | 统一网络,二维码可印在房卡或宣传页上 |
| 户外设备 | 不适合 | 二维码易磨损,且网络环境多变 |
经验之谈:二维码配网有个隐藏坑——二维码的容错等级。我建议至少用 M 级(15% 容错),因为设备外壳上的二维码容易被刮花或沾灰。另外,二维码尺寸不要小于 2cm × 2cm,否则手机扫码距离太近反而对不上焦。
4.5 四种模式对比总结
好了,四种模式都讲完了。咱们来做个横向对比,方便你选型时参考:
| 维度 | SmartConfig | 蓝牙辅助 | AP 模式 | 二维码 |
|---|---|---|---|---|
| 用户体验 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
| 兼容性 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 硬件成本 | 最低 | 较高(需 BLE) | 低 | 低 |
| 安全性 | 低 | 高 | 中 | 中 |
| 部署效率 | 高 | 高 | 低 | 最高 |
| 适用场景 | 消费类 IoT | 中高端产品 | 工业/调试 | 固定网络 |
我个人建议:如果是做消费级产品,优先上蓝牙配网,用户体验是第一位的。如果成本敏感,SmartConfig 也能用,但一定要做好失败后的降级方案。AP 模式作为保底方案永远不要去掉——它虽然操作繁琐,但几乎不会失败。