摘要:上篇内容我们已经可以连接至MQTT服务器,本篇主要内容为:使用ESP-01S实现MQTT的Publish和Subscribe功能。
上篇内容我们已经可以连接至MQTT服务器,本篇主要内容为:使用ESP-01S实现MQTT的Publish和Subscribe功能。
类似上篇中的方法,浏览官方文档,以及使用MQTTX、EMQX Dashboard和Wire Shark等工具,厘清Publish和Subscribe的报文格式。
注:本篇内容仅为学习,不对部分内容深入考虑。如这两种报文的property中,均默认为无属性,仅有Property Length一项内容(占1字节)。
根据上述报文格式创建对应的结构体
发送订阅报文之后,如果有其他客户端发布的对应topic的消息,MQTT服务器就会将消息转发过来,在此前的WiFi模块中,没有完全实现接收模块,这里需要先实现接收消息
之后就是Subscribe的实现:
发送了Subscribe报文之后,MQTT服务器会返回一个ACK报文,WiFi模块会接收并存储在缓冲区内,需要将数据取出并清除队列中对应的长度数据(使用xQueueReceive)。在Subscribe函数的末尾,调用了WiFi_SendStrForReceive函数,这个函数是在WiFi_SendStr基础上额外调用了WiFi_GetReceive函数。
最后是Publish的实现:
Publish报文发送后,服务器会根据发送的报文类型,决定是否返回ACK报文。当QoS=0时(此时HeaderFlags = 0x30),服务器不返回ACK报文;当QoS = 1(此时HeaderFlags = 0x32)时,服务器会返回ACK报文。本篇中QoS均为0,所以服务器不会返回ACK报文,在Publish的函数最后,直接调用WiFi_SendStr即可,不需要处理返回。
上面提到,我们使用WiFi_GetReceive来获取WiFi接收到的信息,但是该信息是被封装成报文的信息,需要对其解析,才能获取到想要的信息
上述代码仅对publish报文(Header Flags = 0x30)进行分析,其他类型的报文后续添加进去即可。
综上,编写运行的代码
使用MQTTX发送topic为DHT的信息,并且订阅aaa。观察MQTTX的结果以及串口工具打印的信息
可以看到数据都为预期结果,实验是成功的
ESP-01S相关的学习应该就到这里了,后面也不知道学些什么,等有想法了再说。
来源:汽车小挖掘机