admin 管理员组

文章数量: 1184232

ESP32 WiFi断开通知及时告警:技术实现与工程应用

你有没有遇到过这种情况?一个部署在工厂角落的ESP32传感器,突然“失联”了。没人知道它是不是还活着,数据不上传、远程控制没响应……直到几天后巡检才发现——原来是Wi-Fi断了,而设备自己啥也没做。

😅 别笑,这事儿太常见了!

在物联网的世界里, 连不上网 = 死机 。哪怕你的固件写得再完美,只要Wi-Fi一断,一切归零。更糟的是,很多开发者只关心“怎么连上”,却忽略了“连不上怎么办”。

今天咱们就来聊聊:如何让ESP32在Wi-Fi断开时,第一时间“尖叫报警”,甚至还能自救!


乐鑫的ESP-IDF其实早就为我们准备好了“耳朵”——事件系统(Event Loop)。它不像轮询那样傻乎乎地每隔几秒问一遍:“我连着吗?”而是像一只警觉的猫,一旦Wi-Fi出问题,立刻竖起耳朵告诉你:“主人!断了!”

关键就在于这个事件:

WIFI_EVENT_STA_DISCONNECTED

只要注册好回调,这个事件会在Wi-Fi断开的 毫秒级时间内触发 ,比你自己用 wifi_sta_get_status() 去查快多了,也省电多了。

来看一段核心代码👇

static void wifi_event_handler(void* arg, esp_event_base_t event_base,
                               int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        wifi_event_sta_disconnected_t* disconnected = 
            (wifi_event_sta_disconnected_t*) event_data;

        ESP_LOGE(TAG, "💔 Wi-Fi 断开!原因码: %d", disconnected->reason);

        // 🔴 点亮红灯警告!
        gpio_set_level(GPIO_NUM_2, 1);

        // 📢 串口吼一嗓子
        printf("[ALERT] 设备已离线,请检查网络!\n");

        // 🚨 启动重连任务(别卡主线程)
        xTaskCreate(&reconnect_task, "reconnect", 2048, NULL, 5, NULL);
    }
}

看到了吗?我们不仅知道了“断了”,还拿到了 原因码(reason code) !比如:

  • 200 : BEACON_TIMEOUT → 信号太差或AP挂了
  • 201 : AUTH_EXPIRE → 认证超时
  • 6 : NO_AP_FOUND → 根本找不到路由器

这些数字简直就是诊断神器啊!再也不用靠猜了 😎

当然,光靠Wi-Fi层还不够。有时候设备明明显示“已连接”,IP也拿到了,但就是上不了网——可能是路由器坏了、网关不通、DNS炸了……

这时候就得祭出 心跳保活机制

我们可以用ESP-IDF自带的 esp_ping 模块,定期ping一个公网地址(比如8.8.8.8),确认端到端通路是否正常。

esp_ping_config_t ping_config = {
    .target_addr = IP4_ADDR(8, 8, 8, 8),
    .interval_ms = 10000,   // 每10秒一次
    .timeout_ms  = 3000,
};

如果连续3次ping失败?那就不是小毛病了,该升级告警级别了!

💡 小技巧:电池供电的设备别太频繁ping,建议30~60秒一次,平衡功耗和灵敏度。

而且你可以玩点花的——把断开原因通过MQTT发到云端:

char msg[64];
snprintf(msg, sizeof(msg), "offline: reason=%d", disconnected->reason);
mqtt_publish("home/device/alarm", msg, 0, 1);

这样手机App立马就能收到推送:“你家阳台的温湿度计掉线啦,原因是BEACON_TIMEOUT(信号弱)!” 👌


等等,你以为这就完了?

真正的工业级设计还得考虑这些细节:

🚦 状态可视化

用不同颜色LED表达状态:
- 蓝色闪烁:正在尝试连接
- 绿色常亮:在线且健康
- 红色快闪:Wi-Fi断开告警
- 红蓝交替:OTA升级中

用户一眼就知道发生了什么。

🔁 自动重连策略

不要无限重试!设个上限,比如最多5次,然后进入“休眠-重试”循环,避免CPU空转烧资源。

还可以结合 随机退避算法 ,第一次等2秒,第二次4秒,第三次8秒……防止大量设备同时重连压垮AP。

🛡️ 安全提醒

日志里千万别打印SSID和密码!尤其是生产环境,谁也不知道串口有没有被人接走。

可以用哈希代替明文:

ESP_LOGI(TAG, "Connecting to SSID hash: %08x", crc32(ssid, len));

📊 故障回溯

把最后一次断开的原因和时间戳存在RTC memory或者NVS里,下次启动时报出来,方便运维排查。

nvs_handle_t nvs;
nvs_open("diag", NVS_READWRITE, &nvs);
nvs_set_u32(nvs, "last_reason", reason);
nvs_set_u64(nvs, "disconn_time", time(NULL));
nvs_commit(nvs);

实际项目中,我还见过有人加了个小喇叭,Wi-Fi断了就“滴滴滴”三声——虽然吵了点,但在嘈杂的车间里特别管用,一听就知道哪台设备有问题。

更有甚者,直接集成SIM800C模块,Wi-Fi挂了马上切蜂窝网络发短信报警……只能说,为了稳定,真是拼了!

🎯 所以说,一个好的IoT设备,不仅要会“干活”,更要会“喊救命”。

当你把这套机制部署下去之后,你会发现:

  • 运维成本降下来了,不再需要人工挨个检查设备;
  • 用户体验提升了,故障能被快速定位;
  • 产品口碑上去了,“这玩意儿真靠谱”成了常态评价。

最后划重点:

别用轮询检测连接状态 —— 浪费CPU还延迟高
一定要监听 WIFI_EVENT_STA_DISCONNECTED —— 最快最准
加上Ping心跳 —— 防止“伪在线”陷阱
多重告警输出 —— LED + 日志 + MQTT + 备用通道
记录断开原因码 —— 故障分析的黄金线索

如果你现在手头就有几个ESP32在跑,赶紧看看它们的Wi-Fi异常处理逻辑吧。说不定正默默地“死”在网络边缘呢……

🔔 好的系统,从不让设备“静默死亡”开始。

这种高度集成的设计思路,正引领着智能终端向更可靠、更高效的方向演进。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文标签: 通知 WiFi