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的,不过是用另一块板子

这节有些唠叨....

大家一定要看我的下一篇,

大家一定要看我的下一篇,

大家一定要看我的下一篇,

要想做的稳定,没有这么简单,我这节只是说说流程.

大家一定要看我的下一篇,

大家一定要看我的下一篇,

大家一定要看我的下一篇,

 

posted on 2019-10-30 18:43  广源时代  阅读(1400)  评论(0编辑  收藏  举报

导航

支付宝 QQ群