ESA2GJK1DH1K基础篇: 移植官方+本人进行二次封装的MQTT包,让TCP实现MQTT功能(以GPRS模块为例)
作者:互联网
<iframe frameborder="0" height="800" name="ifd" scrolling="auto" src="https://mnif.cn/开发板/ESA2GJK1DH1K/基础篇/directory.html" width="100%"></iframe>
前言
该程序需要的基础知识: https://www.cnblogs.com/yangfengwu/category/1566194.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的连接是通过串口
我单片机往串口发数据,串口数据发给了GPRS,GPRS就会自动发给TCP服务器
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数组,所以我上面才那样写的
所以我直接可以
三,如果你的模块接收的数据缓存到别的数组了,但是数据有各种乱七八糟的数据
那么你需要先剔除
你可以先定义一个数组
然后
标签:GPRS,CompareValue,ESA2GJK1DH1K,TCP,break,MQTT,NULL 来源: https://www.cnblogs.com/yangfengwu/p/11766867.html