Wi-Fi连接需严格按序调用esp_netif_init()、esp_netif_create_default_wifi_sta()、wifi_init_config_t初始化、esp_wifi_init()、esp_wifi_set_mode()、esp_wifi_set_config()和esp_wifi_start(),缺一不可;SSID与密码须为C字符串且长度合规;断开重连应延时并检查状态;IP获取须监听IP_EVENT_STA_GOT_IP而非仅WIFI_EVENT_STA_CONNECTED。

Wi-Fi连接配置必须调用 wifi_init_config_t 并传入有效 esp_netif_t*
ESP32 的 Wi-Fi 初始化不是直接调用 esp_wifi_start() 就能连上的。你得先创建网络接口(esp_netif_t*),再初始化 Wi-Fi 驱动,顺序错了会卡在 WIFI_REASON_NO_AP_FOUND 或根本无日志输出。
常见错误是跳过 esp_netif_init() 或重复调用它(导致内存泄漏)。正确流程是:
- 调用
esp_netif_init()一次(通常在app_main()开头) - 用
esp_netif_create_default_wifi_sta()获取 STA 接口指针 - 用
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT()初始化 Wi-Fi 驱动 - 再调用
esp_wifi_init(&cfg),之后才能esp_wifi_set_mode(WIFI_MODE_STA)
设置 SSID 和密码必须用 esp_wifi_set_config() 并触发 esp_wifi_start()
很多人以为填完 wifi_config_t 结构体就自动连接了,其实只是“配置”,不显式启动就不会发 Probe Request。而且 ssid 和 password 字段必须是 C 风格字符串(以 \0 结尾),长度不能超 32 字节(SSID)或 64 字节(密码),否则连接时返回 ESP_ERR_WIFI_SSID_INVALID。
实操建议:
立即学习“C++免费学习笔记(深入)”;
wifi_config_t wifi_config = {.sta = {.ssid = "MyWiFi", .password = "12345678"}};- 调用
esp_wifi_set_config(WIFI_IF_STA, &wifi_config)(注意第二个参数是指针) - 必须紧接着调用
esp_wifi_start(),否则配置不生效 - 不要在中断或高优先级任务里调用这些 API,它们是阻塞且依赖事件循环的
掉线重连不能只靠 WIFI_EVENT_STA_DISCONNECTED,要检查 reason 并防重复触发
监听 WIFI_EVENT_STA_DISCONNECTED 是对的,但直接在里面调 esp_wifi_connect() 很容易引发崩溃——因为断开事件可能在 Wi-Fi 驱动未完全清理状态时就抛出,此时立刻重连会返回 ESP_ERR_WIFI_NOT_STARTED 或卡死。
更稳妥的做法是:
- 在事件回调中仅记录断开原因(
event_info->reason),比如WIFI_REASON_AUTH_EXPIRE、WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT等 - 用
xEventGroupSetBits()唤醒一个独立的任务来处理重连逻辑 - 该任务里先延时 1–2 秒(让底层状态归位),再判断是否已连接(
esp_wifi_is_connected()),未连才调esp_wifi_connect() - 避免在 5 秒内连续重试超过 3 次,否则可能被 AP 拉黑或耗尽 RAM(每次失败都会堆积 event handler 上下文)
自动重连必须配合 SYSTEM_EVENT_STA_CONNECTED 和 DHCP 获取状态
连上 Wi-Fi 不等于能上网。WIFI_EVENT_STA_CONNECTED 只表示 802.11 关联成功,IP 地址还没拿到。如果业务代码紧跟着这个事件发 HTTP 请求,大概率失败——因为 ip_event_got_ip 还没触发。
正确做法是监听 IP_EVENT_STA_GOT_IP,并在其回调里启动你的业务逻辑:
- 从
ip_event_got_ip_t*中取出ip_info->ip.addr才算真正可用 - 若长时间没收到该事件(比如 DHCP 超时),应主动调用
esp_netif_dhcpc_stop()+esp_netif_dhcpc_start()重试 - 别用
ping或gethostbyname()来判断“网络通”,它们依赖 DNS 和路由,而IP_EVENT_STA_GOT_IP才是协议栈就绪的唯一可靠信号
重连逻辑最易忽略的一点:Wi-Fi 配置在重启后不会自动恢复,除非你显式调用了 esp_wifi_set_config() ——哪怕之前连过,掉线再上电也得重新 set_config,不然 esp_wifi_connect() 会用空 SSID 尝试连接。


















