2-STM32+CH395Q(以太网)基本控制篇(自建物联网平台)-移植单片机MQTT包,编写stm32+CH395Q连接MQTT服务器程序
<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/CH395Q/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
说明
这节说明一下详细的编写程序实现stm32+CH395Q连接MQTT服务器
大家伙一定要始终记住一件事情,MQTT服务器就是个TCP服务器.
和MQTT服务器通信实质上就是TCP通信,通信的数据只要是按照MQTT协议发给服务器
MQTT服务器就可以把数据进行转发.
如果还不知道MQTT是什么,请用户先学习MQTT协议部分
用户只需要了解协议,不需要深挖各个打包函数内部!深挖是我的工作,大家伙面向的是使用.
用户只需要了解协议,不需要深挖各个打包函数内部!深挖是我的工作,大家伙面向的是使用.
用户只需要了解协议,不需要深挖各个打包函数内部!深挖是我的工作,大家伙面向的是使用.
移植准备工作
1.准备好已经实现TCP通信的工程(我就使用下面的工程)
该工程已经有了基本的自动连接,接收发送数据
2.把下面的两个文件夹放到工程里面
注:一般我的工程都使用了mem,可以选择替换
3.把文件添加到工程
4.在mqtt.c里面替换自己的tcp发送函数
上面那个0是因为我使用的模组的socket0作为的tcp通信,所以写的0
这个地方我就把 mymqtt.timer_out_send = 0; 放到TCP发送完成的地方
5.根据提示把mqtt_time_data(&mymqtt);放到1ms定时器里面 (记得添加 #include "mqtt.h")
5.根据提示把以下内容添加到主函数(记得添加 #include "mqtt.h")
6,根据自己的MQTT服务器修改TCP连接的服务器的IP地址和端口号
7,修改TCP函数,tcp接收的数据是存储在recv_buff,然后增加一个接收到数据的标志位 recv_data_flag,接收个数recv_data_len
当recv_data_flag为1的时候就说明服务器返回了数据,然后咱们再去处理数据
8,把以下内容放到while(1)循环里面
根据当前实际的程序修改一下
增加了一个延时变量,每隔一段时间发送一次连接MQTT服务器协议
9,现在就完成了MQTT的连接,现在下载程序测试下
为便于观察,在连接成功回调函数里面打印下
把模块用网线和路由器或者交换机
10,现在再捋一捋整个过程
首先是进行tcp连接
初始化底层的mqtt变量和注册一些回调函数
调用TCP发送函数,发送MQTT连接协议给服务器
服务器返回了数据
判断服务器返回的数据是不是连接成功数据,如果是连接成功消息就会调用设置的连接成功回调函数
正常通信就会轮训下面的程序
11,订阅主题
这里有提示
一般呢是在连接上MQTT服务器回调函数里面订阅主题,为方便观察,我加了个打印
12,把接收的消息打印出来
建议用户使用下面的方式提取数据,或者使用额外的数组先把数据拷贝出来,然后再去处理.
13,把现在的程序下载到开发板测试下
打开MQTT调试助手,用调试助手发送数据给开发板
14,发布消息
15,到这里其实就移植完了,现在接着说一下内部消息处理流程
只要是连接上了MQTT服务器,后面的订阅,发布函数是把消息存储在了缓存管理里面
如果用户没有学过我写的这套缓存管理务必学一下.
先学习环形队列,再学习缓存管理
提取缓存管理里面的数据,并通过TCP发送出去
心跳包也是存储到缓存管理里面
处理MQTT数据
消息处理呢,用户就不用研究了,接收到什么数据就执行什么回调函数,还包括消息等级1,2的处理
大家伙不要去研究哈,不光需要彻底知道mqtt协议.还需要C语言底子.
结语
其实MQTT就是个TCP服务器,想连接上MQTT服务器,就需要先使用TCP连接上
然后发送MQTT连接协议给服务器,然后就可以连接上了.
后期订阅主题,发布消息啥的都是按照MQTT协议打包好,然后通过TCP发给服务器.
接收的数据呢根据MQTT协议解析下.