ESA2GJK1DH1K基础篇: 移植官方+本人进行二次封装的MQTT包,让TCP实现MQTT功能(以GPRS模块为例)

 

前言

  该程序须要的基础知识:  https://www.cnblogs.com/yangfengwu/category/1566194.html   全部源码开源,请自行学习html

  

 

 

这节代码将在这一节的基础上实现

 

 

 

 

拷贝第一节测试里面的MQTT文件夹到当前工程

 

 

 

当前工程建个MQTT的文件夹,用于存放那个MQTT文件夹里面的内容

 

 

 

 

添加文件到里面

 

 

 

 

 

 

 

 

 

 

 

 

 

添加头文件到 include.h

 

 

 

 

 

设置一下头文件路径数组

 

 

 

 

注意,若是不是用的个人工程底板,会报错一个地方,本身去定义一个数组去数组大小先设置200吧,放到这里,缓存

这个数组是存放服务器发过来的数据.服务器

具体看我后面的介绍.网络

 

 

 

 

控制模块TCP链接上MQTT

注意,我是AT指令经过串口控制GPRS链接的TCP服务器(MQTT软件)函数

你们若是用的其它不是经过串口控制链接的,请本身写控制模块链接TCP的函数学习

            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软件),而后说注意的地方

一,先说明测试

  我设置的模块是透传模式,我和GPRS的链接是经过串口spa

  我单片机往串口发数据,串口数据发给了GPRS,GPRS就会自动发给TCP服务器3d

  TCP服务器发给GPRS数据,GPRS就会把数据发到本身的串口,而后就发给单片机了

  他们之间的数据不夹杂着乱七八糟的东西,发的什么就是什么.

  个人数据所有存到了

  

 

 

 

 

 

如今发送链接MQTT协议

 

一,调用MqttConnectMqtt函数,我注释已经写的很明白了哈...

 

 

 

二,我为了更形象一点,我只用个人底层架子控制模块链接上TCP服务器

  你们根据本身的模块链接上TCP服务器

    

 

 

 

 

 

三,而后主函数里面把打包的数据发给TCP服务器(我刚才说了,我串口发送的数据GPRS会自动转发给TCP服务器)

  你们根据本身的修改,找到本身TCP发送数据的地方,把数据发出去

 

 

 

四,判断是否链接上了

MqttConnectMqttAck

该函数没有参数,全部的数据是靠 transport_getdata 这个函数提供

先看一下里面的这个函数MQTTPacket_read    这个函数就是处理MQTT数据的

他把从transport_getdata函数里面提取的数据,拷贝到了 MqttAnalyzeStruct.buff 数组里面了

最后面的== XXXX是判断这个数据是什么类型的数据  CONNACK  就是说是接收的链接成功的应答数据

 

 

 

 

实质上就是传递函数指针而已,若是你C语言很差,你就先别深究,先学会用

 

 

 

而后看transport_getdata函数, 这个函数是整个MQTT包里面的重点

 

一,这个函数是固定写法 ,

 

   

 

 

 

二,全部的MQTT解析数据都是利用这个函数,

  你所作的事情就是,把TCP服务器传过来的数据缓存到一个数组,而后把数组名字放到那里

  我设置的个人模块是串口透传

  个人数据所有缓存到了Usart1ReadBuff数组,因此我上面才那样写的

  

 

  

  因此我直接能够

  

 

 

三,若是你的模块接收的数据缓存到别的数组了,可是数据有各类乱七八糟的数据

  那么你须要先剔除

  你能够先定义一个数组

  

 

 

 

    而后

      

 

链接上之后,订阅主题

一,订阅一个主题

 

 

二,订阅两个主题

 

三,看一下订阅主题的封包的那个函数

 

 

判断是否成功订阅了主题

一,调用 MqttSubscribeAck函数判断

 

 

二,程序里面就是

 

 

 

三,而后呢咱发送一条消息

 

 

 

 

 如今呢我测试下,

注意哈,实际上没有什么难的,

第一:先链接TCP

第二: 调用链接MQTT的封包函数,封装好链接的数据,而后把数据用TCP发出去

第三: 判断服务器返回的是否是链接成功

第四: 链接之后就能够订阅主题了,其实何时均可以订阅,随意

第五 根据服务器返回的数据,判断下是否是订阅成功了

主要是你们必定要把本身接受的数据传到这里

 

 

 

 

 

 

 

 

 

解析接收的MQTT数据 

把接收的数据返回回去

 

 

 

而后稍微动了下

 

 

 

 

 

 

 

 

 

 

 

最后一个心跳包

你设置的心跳包多少时间,你就多少时间发送一次心跳包!完了没有了

 

 

 

 

 

 

结语

你脑海里面永远记得,先链接TCP 服务器

必须把TCP服务器返回的数据写到那个数组里面

 

 

 

而后就是链接,判断,订阅判断,发送数据,解析数据啦.最后定时发个心跳包.仅此而已

各类平台的MQTT封包解包

https://docs.emqx.io/sdk_tools?category=MQTT_Clients

 

注意:注意:注意:注意:注意:注意:

我给你们提供的都是网络模块串口透传的代码(8266,Air202,SIM800),后面我会提供个W5500的,不过是用另外一块板子

这节有些唠叨....

你们必定要看个人下一篇,

你们必定要看个人下一篇,

你们必定要看个人下一篇,

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

你们必定要看个人下一篇,

你们必定要看个人下一篇,

你们必定要看个人下一篇,

相关文章
相关标签/搜索