<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发送出去
心跳包也是存储到缓存管理里面