ESP-IDF使用MQTT接入物联网平台
[简介]
对于 IDF环境的使用,多数人还是被劝退的,但是当了解这些的底层之后还是觉得IDF写得巧妙。今天我就写篇日志来记录一下IDF使用MQTT接入阿里云的物联网平台(其他平台也大体相似,后面有说),其实一两年前我就想写的,但是都没啥空,而现在对IDF的了解也多些,也就做一点分享(这次我由于做毕设用到就只写物模型的消息上报,订阅有时间再补充)。
[如何实现]
【实现前讲的一些东西】
MQTT是什么我就不赘述了,简而言之就是一个消息传输协议。
【具体实现步骤】现在就大概讲一下IDF怎么去配置MQTT。
首先,连接wifi的部分我就不讲了,我是直接用官方写的那个例程protocol_examples_common,主要是MQTT的配置--也就是结构体esp_mqtt_client_config_t的配置,IDF的底层关于这个结构体的每个参数也写有注释,不过是英文的,相信大家都能看得懂的。如果只是连接市面上的这些物联网平台,主要就需要配置以下几个东西
这里值得注意的点是,port端口的类型是整形的,不要写成字符串。其余的都是字符串类型的。这些参数具体怎么配置是在物联网平台的设备MQTT连接参数那里,比如阿里云的
我是写成宏定义的形式如下:
#define BROLER_ADDRESS "******" /* your PC ipv4 ip */ #define BROLER_PORT 1883 /* port */ #define USER_NAME "*****" /* client name */ #define PASSWARD "*****" /* passward */ #define CLIENT_ID "****" /* cliend id */
上边的结构体配置好之后,再初始化,这样就启动ESP32的MQTT了(这里只是运行mqtt,如果想要订阅主题,还需写一个注册主题的回调。我这里以为只用到上报所以就不写了,往后有空再回来填坑)
esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg);
esp_mqtt_client_start(client);
运行mqtt之后就可以上报消息到对于的主题了,具体是使用esp_mqtt_client_publish这个函数来上报
参数: client – *MQTT* client handle (这个就是刚才配置的结构体) topic – topic string (这个就是上报的主题) data – payload string (set to NULL, sending empty payload message) (这个是上报的消息数据--注意:这个是json格式的数据,需要参考平台的手册来) len – data length, if set to 0, length is calculated from payload string (这个就是字符串的长度) qos – QoS of publish message (QOS是消息服务质量,对于的有0,1,2,具体意思mqtt的协议有讲,我这里使用的是0,没用消息返回,适用于网络环境差一点的) retain – retain flag
上报主题参考阿里云的是这样(需要注意的是 ${deviceName} 需要改成自己要上报到的设备的名字)
消息上报数据格式参考阿里云的手册是这样的
我的是这样写的(格式一样的)
char mqtt_publish_data3[] = "\ {\ \"id\":\ \"1\",\ \"version\":\ \"1.0\",\ \"params\":\ {\ \"RMSVoltage\":220.12,\ }\ }";
如果上报的格式不一样的话,会在日志里面有格式错误的内容(错误码6207),如下:
如果上报格式正确的话会返回200的操作码,且物模型里面的数据也会更新(需要注意上报的物模型属性标识符一定要正确),如下:
其实,做到这里算是上报的已经做完了。
【闲聊】
想写这个就是想记录一下,一开始写的时候想写得很详细,但写下来都不知道写什么好。就当随笔写的了,对于入门学习IDF有帮助就最好了。