|
|
《启蒙之路》ESP32 入门教程 —ESP32 连接 MQTT Broke
今天这份教程主要讲怎么让 ESP32 单片机连上 MQTT 服务器,实现物联网数据收发。整个实验分成电脑端调试准备、ESP32 代码开发、联合测试三大部分。
第一部分:准备公共 MQTT 服务器与电脑调试工具
想要调试 MQTT 通信,我们需要一台 MQTT 代理服务器 Broker。自己搭建服务器比较麻烦,所以直接选用国内可用的公共免费服务器 broker-cn.emqx.io,不用安装部署,拿来直接测试。
同时电脑上安装 MQTTX 客户端软件,作用相当于调试助手。我们在 MQTTX 里新建连接,填写服务器地址、端口 1883,名称、客户端 ID、账号密码可以随便自定义。连接成功之后,订阅主题/test/topic1,QoS 等级选择 1。
后面 ESP32 和电脑之间所有收发的数据,都能在 MQTTX 上直观看到,方便排查通信故障。
第二部分:ESP32 程序设计思路
ESP32 想要连接 MQTT 有一个前提:必须先连上 WiFi。所以程序第一步先完成 WiFi STA 模式联网。
我在 WiFi 驱动里写了事件回调函数,用来捕捉 WiFi 启动、成功连上路由器、意外断开等状态。一旦 WiFi 掉线,程序会自动发起重连,保证网络稳定性。
这里用到 FreeRTOS 事件组做任务同步。主函数上电之后,先初始化 NVS 存储,再启动 WiFi。主线程会持续等待,直到 WiFi 成功拿到 IP 地址,才允许启动 MQTT 客户端,避免网络没就绪就发起 MQTT 连接导致报错。
WiFi 联网成功后,调用mqtt_start()初始化 MQTT 客户端。代码里配置好服务器地址、端口、客户端 ID、账号密码,并且注册 MQTT 事件回调函数。
MQTT 回调函数负责处理各类事件:
- MQTT 成功连上服务器:立刻订阅主题 /test/topic1;
- MQTT 断开连接:更新连接状态标志;
- 收到订阅应答、发布应答:打印日志,方便观察流程;
- 收到主题消息:直接把主题字符串和消息内容从串口打印输出;
- 发生通信错误:打印错误提示。
主循环里面每隔 2 秒自动向/test/topic1发送一条心跳消息,携带设备运行时间戳,模拟设备周期性上传传感器数据。
第三部分:整体运行效果
程序烧录进 ESP32 开发板之后:
- 开发板自动连接 WiFi;
- 网络就绪后连接 emqx 公共 MQTT 服务器;
- 电脑 MQTTX 可以持续收到 ESP32 定时发上来的心跳数据;
- 同时我们在 MQTTX 手动向同一个主题发送消息,ESP32 串口能打印收到的内容。
这样就实现了双向通信:ESP32 可以上传数据,电脑端也能下发指令控制设备。
学到的核心要点
- MQTT 基于 TCP,ESP32 必须保证 WiFi 网络正常,才能建立连接;
- ESP-IDF 的 MQTT 采用事件回调方式处理所有通信事件;
- 发布者、订阅者必须使用完全一致的 Topic 主题名称,才能收到消息;
- 使用公共 MQTT Broker 适合前期学习调试,不用本地搭建服务器;
- 通过事件组同步任务顺序,保证 “先联网、再连 MQTT”,规避时序 bug
|
|