玩转 ESP32 + Arduino (十六) 通过mqtt协议连接阿里云
2025-04-07 来源:jianshu
需要用到的库:
PubSubClient : 发送和接收MQTT消息
ArduinoJson : Json字符串转换库
AliyunMqttArduino: 阿里云相关
先做一件事!!!!!!
引入'PubSubClient.h'后
#include 'PubSubClient.h'
打开'PubSubClient.h'
修改如下内容:

一. 阿里云MQTT协议
关于MQTT协议, 请参考文章:https://zhuanlan.zhihu.com/p/89057819
请参考我之前整理的文档:
【腾讯文档】MQTT连接阿里云示例(1)https://docs.qq.com/sheet/DWXBaUE9nWmZVaGJX
如果使用了AliyunMqttArduino, 就不需要关系协议的报文和加密方式了
二. 主要函数
首先创建一个mqtt客户端
WiFiClient espClient; //创建网络连接客户端PubSubClient mqttClient(espClient); //通过网络客户端连接创建mqtt连接客户端
1. 连接阿里云 connectAliyunMQTT
connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET)
返回值: 连接结果
2. 判断是否连接了 mqttClient.connected()
mqttClient.connected()
3. mqtt客户端状态 mqttClient.state()
mqttClient.state()
返回: 状态码
| 状态码 | 含义 |
|---|---|
| 0 | 连接成功 |
| 1 | 不正确的协议版本 |
| 2 | 无效的登录信息 |
| 3 | 连接不上服务器 |
| 4 | 用户名密码错误 |
| 5 | 未授权 |
| 6~255 | 备用 |
4. 发布主题消息
mqttClient.publish(主题, 内容)
mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf)
5. setCallback-- 设置收到命令下发时的回调
mqttClient.setCallback(callback); //绑定收到set主题时的回调(命令下发回调)
6. 客户端监听消息队列 mqttClient.loop();
三. 一个点灯的例子(创建产品和设备)
首先, 创建产品:

其次, 为产品添加设备

第三, 查看设备关键信息:

四. 一个点灯的例子(ESP32连接上述产品和设备)
#include delay(10); Serial.println('连接WIFI'); WiFi.begin(WIFI_SSID, WIFI_PASSWD); while (!WiFi.isConnected()) { Serial.print('.'); delay(500); } Serial.println('OK'); Serial.println('Wifi连接成功');}//重连函数, 如果客户端断线,可以通过此函数重连void clientReconnect(){ while (!mqttClient.connected()) //再重连客户端 { Serial.println('reconnect MQTT...'); if (connectAliyunMQTT(mqttClient, PRODUCT_KEY, DEVICE_NAME, DEVICE_SECRET)) { Serial.println('connected'); } else { Serial.println('failed'); Serial.println(mqttClient.state()); Serial.println('try again in 5 sec'); delay(5000); } }}//mqtt发布post消息(上传数据)void mqttPublish(){ if (mqttClient.connected()) { //先拼接出json字符串 char param[32]; char jsonBuf[128]; sprintf(param, '{'LightSwitch':%d}', digitalRead(LED_B)); //我们把要上传的数据写在param里 postMsgId += 1; sprintf(jsonBuf, ALINK_BODY_FORMAT, postMsgId, ALINK_METHOD_PROP_POST, param); //再从mqtt客户端中发布post消息 if (mqttClient.publish(ALINK_TOPIC_PROP_POST, jsonBuf)) { Serial.print('Post message to cloud: '); Serial.println(jsonBuf); } else { Serial.println('Publish message to cloud failed!'); } }}//收到set主题的命令下发时的回调函数,(接收命令)void callback(char *topic, byte *payload, unsigned int length){ if (strstr(topic, ALINK_TOPIC_PROP_SET)) //如果收到的主题里包含字符串ALINK_TOPIC_PROP_SET(也就是收到/sys/a17lGhkKwXs/esp32LightHome/thing/service/property/set主题) { Serial.println('收到下发的命令主题:'); Serial.println(topic); Serial.println('下发的内容是:'); payload[length] = '




