设计ESP32 WiFi重连状态机时,核心原则是“非阻塞+状态驱动”。建议使用枚举定义状态(如IDLE、CONNECTING、WAIT_RETRY、CONNECTED),并在主循环中调用一个非阻塞的`wifi_state_machine()`函数。该函数内部通过`millis()`或`esp_timer_get_time()`记录时间戳,避免`delay()`。例如:在CONNECTING状态调用`WiFi.begin()`后立即返回,设置超时(如10秒),若超时未连接成功则进入WAIT_RETRY状态,等待指数退避时间(如2^n秒,最大30秒)后再尝试。同时,利用`WiFi.onEvent()`注册事件回调,在`SYSTEM_EVENT_STA_GOT_IP`时切换至CONNECTED,在`SYSTEM_EVENT_STA_DISCONNECTED`时触发重连逻辑。主循环只需周期性调用该状态机,并检查当前状态执行相应业务逻辑。注意:在状态机中避免使用阻塞式API,如`WiFi.waitForConnectResult()`,确保所有操作基于事件或超时判断。
mcuku 阿沐 · 2026-08-27