ESA2GJK1DH1K基础篇: 移植MQTT底层包到自己的项目(V0.1)
前言
这节代码将在这一节的基础上实现
拷贝MQTT文件夹到当前工程
当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容
添加文件到里面
注意::::
实际源码拷贝位置
为了便于移植到各个模块上使用,我再次封装了一下
添加了 ConfigMqtt文件
添加头文件到 include.h
设置一下头文件路径
注意,如果不是用的我的工程底板,会报错一个地方
该函数是用来处理MQTT的数据.官方源码解析的固定写法.
这个Usart1ReadBuff 是缓存串口1数据的数组
注:我的模块是使用单片机串口和它通信
单片机程序会配置模块作为透传模式
单片机串口发送的数据传给模块,模块自动发给服务器
模块从服务器接收的数据直接通过串口传给单片机
如果大家使用的模块不是把数据直接传到了Usart1ReadBuff
可以定义一个新的数组
这节就使用这个定义的数组操作下链接MQTT实现通信
因为这样的话,大家无论使用的什么模块都可以参考
控制模块TCP连接上MQTT
自行根据自己的模块设置模块连接TCP (MQTT服务器软件)
case 0://关闭移动场景,彻底关闭TCP/IP 连接 SendConfigFunction("AT+CIPSHUT\r\n",NULL,"SHUT OK",NULL,FunctionParseCompare,CompareValue);break; case 1://读取SIM状态正常 SendConfigFunction("AT+CPIN?\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 2://GPRS注册状态 SendConfigFunction("AT+CGREG?\r\n",NULL,"+CGREG: 0,1",NULL,FunctionParseCompare,CompareValue);break; case 3://是否附着了GPRS SendConfigFunction("AT+CGATT?\r\n",NULL,"+CGATT: 1",NULL,FunctionParseCompare,CompareValue);break; case 4://设置为单链接 SendConfigFunction("AT+CIPMUX=0\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 5://透传模式 SendConfigFunction("AT+CIPMODE=1\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 6://设置APN SendConfigFunction("AT+CSTT\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 7://激活移动场景 SendConfigFunction("AT+CIICR\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 8://连接TCP 服务器 SendConfigFunction("AT+CIPSTART=\"TCP\",\"47.92.31.46\",1883\r\n",NULL,"CONNECT",NULL,FunctionParseCompare,CompareValue);break;
无论如何你必须先用TCP连接上TCP服务器(MQTT软件)
现在发送连接MQTT协议
一,调用MqttConnectMqtt函数,我注释已经写的很明白了哈...
二,打包连接数据,然后发给TCP服务器(我刚才说了,我串口发送的数据GPRS会自动转发给TCP服务器)
大家根据自己的修改,找到自己TCP发送数据的地方,把数据发出去
三,判断是否连接上了
MqttConnectMqttAck
连接上以后,订阅主题
一,订阅一个主题
注:实际订阅的时候可用一个数组存储订阅的主题
假设是 char SubTopic[20]="wwwww"
二,订阅两个主题
判断是否成功订阅了主题
一,调用 MqttSubscribeAck函数判断
二,然后呢咱发送一条消息
注:以后发布消息
可直接
MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//组合发送的消息,消息:"online",消息个数6个
UsartOutStr(MqttSendData,MainLen);//发送MQTT协议数据(根据自己的TCP发送函数更改)
如果想改变消息等级为1
MqttPublishTopicStruct.qos = 1;
MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//组合发送的消息,消息:"online",消息个数6个
UsartOutStr(MqttSendData,MainLen);//发送MQTT协议数据(根据自己的TCP发送函数更改)
现在呢我测试下,
注意哈,实际上没有什么难的,
第一:先连接TCP
第二: 调用连接MQTT的封包函数,封装好连接的数据,然后把数据用TCP发出去
第三: 判断服务器返回的是不是连接成功
第四: 连接以后就可以订阅主题了,其实什么时候都可以订阅,随意
第五 根据服务器返回的数据,判断下是不是订阅成功了
注:这节代码不一定会测试通过,这节代码只是为了说明怎么让大家的模块连接MQTT的流程而已
解析接收的MQTT数据
把接收的数据返回回去
最后一个心跳包
你设置的心跳包多少时间,你就多少时间发送一次心跳包!
结语
你脑海里面永远记得,先连接TCP 服务器
必须把TCP服务器返回的数据写到那个数组里面
然后就是连接,判断,订阅判断,发送数据,解析数据啦.最后定时发个心跳包.仅此而已
各种平台的MQTT封包解包
https://docs.emqx.io/sdk_tools?category=MQTT_Clients
注意:注意:注意:注意:注意:注意:
我给大家提供的都是网络模块串口透传的代码(8266,Air202,SIM800),后面我会提供个W5500的,不过是用另一块板子
这节有些唠叨....
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,
要想做的稳定,没有这么简单,我这节只是说说流程.
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,