该程序须要的基础知识: https://www.cnblogs.com/yangfengwu/category/1566194.html 全部源码开源,请自行学习html
设置一下头文件路径数组
注意,若是不是用的个人工程底板,会报错一个地方,本身去定义一个数组去数组大小先设置200吧,放到这里,缓存
这个数组是存放服务器发过来的数据.服务器
具体看我后面的介绍.网络
注意,我是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;
一,先说明测试
我设置的模块是透传模式,我和GPRS的链接是经过串口spa
我单片机往串口发数据,串口数据发给了GPRS,GPRS就会自动发给TCP服务器3d
TCP服务器发给GPRS数据,GPRS就会把数据发到本身的串口,而后就发给单片机了
他们之间的数据不夹杂着乱七八糟的东西,发的什么就是什么.
个人数据所有存到了
一,调用MqttConnectMqtt函数,我注释已经写的很明白了哈...
二,我为了更形象一点,我只用个人底层架子控制模块链接上TCP服务器
你们根据本身的模块链接上TCP服务器
三,而后主函数里面把打包的数据发给TCP服务器(我刚才说了,我串口发送的数据GPRS会自动转发给TCP服务器)
你们根据本身的修改,找到本身TCP发送数据的地方,把数据发出去
四,判断是否链接上了
MqttConnectMqttAck
该函数没有参数,全部的数据是靠 transport_getdata 这个函数提供
先看一下里面的这个函数MQTTPacket_read 这个函数就是处理MQTT数据的
他把从transport_getdata函数里面提取的数据,拷贝到了 MqttAnalyzeStruct.buff 数组里面了
最后面的== XXXX是判断这个数据是什么类型的数据 CONNACK 就是说是接收的链接成功的应答数据
实质上就是传递函数指针而已,若是你C语言很差,你就先别深究,先学会用
一,这个函数是固定写法 ,
二,全部的MQTT解析数据都是利用这个函数,
你所作的事情就是,把TCP服务器传过来的数据缓存到一个数组,而后把数组名字放到那里
我设置的个人模块是串口透传
个人数据所有缓存到了Usart1ReadBuff数组,因此我上面才那样写的
因此我直接能够
三,若是你的模块接收的数据缓存到别的数组了,可是数据有各类乱七八糟的数据
那么你须要先剔除
你能够先定义一个数组
而后
一,订阅一个主题
二,订阅两个主题
三,看一下订阅主题的封包的那个函数
一,调用 MqttSubscribeAck函数判断
二,程序里面就是
三,而后呢咱发送一条消息
如今呢我测试下,
注意哈,实际上没有什么难的,
第一:先链接TCP
第二: 调用链接MQTT的封包函数,封装好链接的数据,而后把数据用TCP发出去
第三: 判断服务器返回的是否是链接成功
第四: 链接之后就能够订阅主题了,其实何时均可以订阅,随意
第五 根据服务器返回的数据,判断下是否是订阅成功了
主要是你们必定要把本身接受的数据传到这里
把接收的数据返回回去
而后稍微动了下
你设置的心跳包多少时间,你就多少时间发送一次心跳包!完了没有了
你脑海里面永远记得,先链接TCP 服务器
必须把TCP服务器返回的数据写到那个数组里面
而后就是链接,判断,订阅判断,发送数据,解析数据啦.最后定时发个心跳包.仅此而已
各类平台的MQTT封包解包
https://docs.emqx.io/sdk_tools?category=MQTT_Clients
我给你们提供的都是网络模块串口透传的代码(8266,Air202,SIM800),后面我会提供个W5500的,不过是用另外一块板子
这节有些唠叨....
你们必定要看个人下一篇,
你们必定要看个人下一篇,
你们必定要看个人下一篇,
要想作的稳定,没有这么简单,我这节只是说说流程.
你们必定要看个人下一篇,
你们必定要看个人下一篇,
你们必定要看个人下一篇,