把一颗 ESP32 放上电,第一件想干的事永远是——让它联网。但 Wi-Fi 模式那么多,Station、AP、SmartConfig,到底哪个该先学?本文用一张图、三段代码、五个坑,把 ESP32 入网三件套讲透。
一、目标:能联网,才有 IoT
ESP32 的灵魂是 Wi-Fi。无论是上传温湿度数据、被 App 远程控制、还是 OTA 升级,第一步都是把它接入网络。ESP-IDF 给 Wi-Fi 模块定义了 3 种最常用工作模式,对应三类场景:
|
STA
连家里路由器
|
AP
自建热点配网
|
SC
手机广播配网
|
下面这张图把三种模式的角色关系画在一起:
二、Station 模式:让 ESP32 当客户端
STA 是最常用的模式。ESP32 把自己当成一台手机,去连家里的路由器。ESP-IDF 把入网流程拆成 5 个步骤,记住这条主干线,其他模式都是它的变种:
2.1 五步入网模板
// 1. 初始化 NVS(存 Wi-Fi 凭据)
nvs_flash_init();
// 2. 初始化 TCP/IP + 事件循环
esp_netif_init();
esp_event_loop_create_default();
esp_netif_create_default_wifi_sta();
// 3. 初始化 Wi-Fi 驱动
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
// 4. 设置模式 + 配置 SSID/密码
wifi_config_t wifi_cfg = {
.sta = { .ssid = "MyWiFi", .password = "12345678" },
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_cfg);
// 5. 启动 + 连接
esp_wifi_start();
esp_wifi_connect();
2.2 事件机制:别在 main 里 while 等 IP
连不连得上、IP 拿没拿到,全靠事件回调,不是阻塞返回。三个事件必须挂:
| 事件 | 触发时机 | 该做什么 |
|---|---|---|
| WIFI_EVENT_STA_START | 驱动启动完成 | 调 esp_wifi_connect |
| WIFI_EVENT_STA_DISCONNECTED | 连接丢失/失败 | 重连或退避 |
| IP_EVENT_STA_GOT_IP | DHCP 拿到 IP | 业务可以起来了 |
IP_EVENT_STA_GOT_IP 才算真正联网成功,仅仅触发 STA_CONNECTED 只代表二层关联完成,业务层还不能发 TCP/UDP。三、AP 模式:让 ESP32 自己造个热点
AP(Access Point)模式下,ESP32 自己变成路由器,手机/电脑可以直接连它。最典型的场景是 首次开机配网:设备没存过家里 Wi-Fi 凭据时,先开个热点让用户连,再通过网页表单或 App 把 SSID/密码灌进来。
3.1 关键参数
| 参数 | 含义 | 建议值 |
|---|---|---|
| ssid | 热点名 | ESP32-XXXX |
| authmode | 加密方式 | WPA2_PSK |
| channel | 信道 | 1/6/11 |
| max_connection | 最多接几台 | ≤ 4 |
| password | 密码长度 | ≥ 8 字节 |
3.2 最小代码片段
wifi_config_t ap_cfg = {
.ap = {
.ssid = "ESP32-AP",
.ssid_len = 0,
.channel = 6,
.password = "12345678",
.max_connection = 4,
.authmode = WIFI_AUTH_WPA2_PSK,
},
};
esp_wifi_set_mode(WIFI_MODE_AP);
esp_wifi_set_config(WIFI_IF_AP, &ap_cfg);
esp_wifi_start();
192.168.4.1,不是 192.168.1.1。手机连上后访问网页配网要敲这个地址,不少新手在这里卡半小时。四、SmartConfig:让手机把密码"喊"给设备
SmartConfig 是乐鑫和 TI 推广的一键配网方案。原理简单粗暴:手机连着家里 Wi-Fi,把 SSID 和密码编码进 UDP 组播/广播包的 长度字段或目的 MAC 中疯狂往外发;ESP32 进入 STA 模式后开混杂监听,逐个信道嗅探,解码出凭据,再走标准 STA 流程联网。
4.1 三种协议怎么选
| 类型 | App | 特点 |
|---|---|---|
| ESPTOUCH | 乐鑫 EspTouch | 通用,最快 |
| AIRKISS | 微信小程序 | 免 App,腾讯生态 |
| ESPTOUCH_AIRKISS | 两个都支持 | 兼容模式 |
4.2 流程骨架
// STA 模式跑起来后启动 SC
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_start();
esp_smartconfig_set_type(SC_TYPE_ESPTOUCH);
smartconfig_start_config_t scfg =
SMARTCONFIG_START_CONFIG_DEFAULT();
esp_smartconfig_start(&scfg);
// 事件回调里收到 SC_EVENT_GOT_SSID_PSWD
// → 取出 ssid/password → esp_wifi_connect()
五、三大常见翻车现场
下面这 3 个坑,几乎人人都踩过一次:
esp_wifi_init,直接 ESP_ERR_NVS_NOT_INITIALIZED。Wi-Fi 凭据默认存 NVS,必须先 nvs_flash_init()。WIFI_EVENT_STA_DISCONNECTED 里无限快速重连,几秒就把路由器干懵。正确做法是指数退避,1s → 2s → 4s → 上限 30s。esp_netif_create_default_wifi_sta() 创建 netif,结果根本没 AP 的 DHCP 服务器。AP 要用 esp_netif_create_default_wifi_ap(),两个函数名只差 3 个字母。六、模式选型口诀
实际项目中最稳妥的组合是「AP+STA 共存」:开机先 STA 连存档凭据,连 3 次失败就同时开 AP 让用户重新配,配完保存 NVS、关 AP、转纯 STA,鲁棒性最佳。
《ESP32 ADC 的坑:为什么测出来的电压不准》