ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)
前言
这节代码将在这一节的基础上实现

拷贝MQTT文件夹到当前工程


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

添加文件到里面



注意::::
实际源码拷贝位置



为了便于移植到各个模块上使用,我再次封装了一下
添加了 ConfigMqtt文件

添加头文件到 include.h

设置一下头文件路径

注意,如果不是用的我的工程底板,会报错一个地方
该函数是用来处理MQTT的数据.官方源码解析的固定写法.

这个Usart1ReadBuff 是缓存串口1数据的数组

注:我的模块是使用单片机串口和它通信
单片机程序会配置模块作为透传模式
单片机串口发送的数据传给模块,模块自动发给服务器
模块从服务器接收的数据直接通过串口传给单片机
如果大家使用的模块不是把数据直接传到了Usart1ReadBuff
可以定义一个新的数组


这节就使用这个定义的数组操作下链接MQTT实现通信
因为这样的话,大家无论使用的什么模块都可以参考
控制模块TCP连接上MQTT
自行根据自己的模块设置模块连接TCP (MQTT服务器软件)
case ://关闭移动场景,彻底关闭TCP/IP 连接
SendConfigFunction("AT+CIPSHUT\r\n",NULL,"SHUT OK",NULL,FunctionParseCompare,CompareValue);break;
case ://读取SIM状态正常
SendConfigFunction("AT+CPIN?\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
case ://GPRS注册状态
SendConfigFunction("AT+CGREG?\r\n",NULL,"+CGREG: 0,1",NULL,FunctionParseCompare,CompareValue);break;
case ://是否附着了GPRS
SendConfigFunction("AT+CGATT?\r\n",NULL,"+CGATT: 1",NULL,FunctionParseCompare,CompareValue);break;
case ://设置为单链接
SendConfigFunction("AT+CIPMUX=0\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
case ://透传模式
SendConfigFunction("AT+CIPMODE=1\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
case ://设置APN
SendConfigFunction("AT+CSTT\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
case ://激活移动场景
SendConfigFunction("AT+CIICR\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
case ://连接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的,不过是用另一块板子
这节有些唠叨....
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,
要想做的稳定,没有这么简单,我这节只是说说流程.
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,
ESA2GJK1DH1K基础篇: 移植官方MQTT包,让TCP实现MQTT功能(以GPRS模块为例)的更多相关文章
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- ESA2GJK1DH1K基础篇: 移植源码中SmartConfig程序到自己的项目
前言: 说明两个地方 1.点击按钮启动SmartConfig的地方 2.最终跳转的地方 说明 这节说明一下,如何把本人源码里面的SmartConfig程序移植到自己的工程 我要把所有的全部拿出来讲,让 ...
- ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT
首先你需要知道MQTT并不是什么高大上的事物,它只是一个软件,对就是一个软件.其实就是个TCP服务器 一,既然是TCP服务器,这个TCP服务器和咱平时做的有什么不一样呢. 首先,平时的时候咱做的TCP ...
- ESA2GJK1DH1K基础篇: Android实现MQTT封装源码使用说明
说明 这一节说明一下基础篇APP源码里面MyMqttCilent.java这个文件的使用 新建工程 安装MQTT的jar包 implementation 'org.eclipse.paho:org.e ...
- ESA2GJK1DH1K基础篇: 测试APP扫描Air202上面的二维码绑定通过MQTT控制设备(兼容SIM800)
前言 此程序兼容SIM800 如果想绑定SIM800,请把其IMEI号,生成二维码,用手机APP扫描. 实现功能概要 APP通过扫描二维码获取GPRS设备的IMEI号,然后设置订阅的主题:device ...
- ESA2GJK1DH1K基础篇: 阿里云物联网平台: 测试MQTT连接阿里云物联网平台
前言 这节看一下在阿里云上实现MQTT通信是个怎样的流程 看了很多网上的教程,感觉讲的迷迷糊糊.... 其实感觉他们是对MQTT不够透彻,所以写的文章就是个比着葫芦画瓢的感觉 在我面前这东西就是玩具. ...
- ESA2GJK1DH1K基础篇: 测试APP使用SmartConfig绑定Wi-Fi 设备并控制设备
前言 实现功能概要 STM32控制WI-Fi模块以AT指令TCP透传方式连接MQTT服务器, 实现MQTT通信控制. 测试准备工作(详细下载步骤请参考 硬件使用说明 ) 一,下载单片机程序 二,安装A ...
- ESA2GJK1DH1K基础篇: Android连接MQTT简单的Demo
题外话 我老爸也问我物联网发展的趋势是什么!!!!!! 我自己感觉的:(正在朝着 "我,机器人" 这部电影的服务器方向发展) 以后的设备都会和服务器交互,就是说本地不再做处理,全部 ...
- ESA2GJK1DH1K基础篇: 关于各大物联网平台的MQTT通信
前言 这节稍微唠叨点 其实我很长时间都没有出怎么连接现成的物联网平台的教程, 一直写的是教给大家自己搭建服务器,主要原因是因为我感觉连接现有的学不到东西. 现在出这种教程,是因为发现确实很多人喜欢用. ...
随机推荐
- MySQL 5.7.26安装及配置--windows10系统下
安装过程省略,下载包解压即可 一.配置my.ini在解压目录下,新建一个my.ini [mysql] default-character-set=utf8 [mysqld] port = 3306 b ...
- [转帖]Linux date命令的用法(转)
Linux date命令的用法(转) https://www.cnblogs.com/asxe/p/9317811.html 1.命令:date 2.命令功能:date 可以用来显示或设定系统的日期与 ...
- scala中停止循环的三种方式
1:使用return关键字 object BreakLoop { //1.使用return关键字 def add():Unit= { for(i <- 1 to 10){ if(i==7){ / ...
- 解决mac/win双系统,mac原生读写NTFS分区重启后失效的问题
安装mac/win双系统,然后在mac下启用原生的NTFS分区读写功能,并将分区创建桌面快捷方式后,会发现有时候进入win后再进mac,原来创建的分区桌面快捷方式是白色的图标,并且分区也无法打开,这个 ...
- Prometheus监控学习笔记之prometheus 版本1.7 常用启动参数
日志类: -log.level 可选值 [debug, info, warn, error, fatal] 例:-log.level "info" -log.format 可选 ...
- WMware Workstation Pro安装教程
[1]右键单击WMware Workstation Pro的可执行文件(.exe),选择以管理员身份运行 [2]点击下一步 [3]勾选我接受许可协议中的条款,点击下一步 [4]点击更改,选择安装位置( ...
- Natasha V1.3.6.0 的升级日志
开源库满足于个人,而完善于大众. Natasha 自稳定版发布之后,众多老铁参与增强改进,感谢如下老铁的反馈: 1. 异常搜集 在 wenjq0911 建议下,添加了异常捕获,现 Natasha 的编 ...
- drf--搜索、过滤、排序组件
目录 drf--搜索.过滤.排序组件 过滤 DjangoFilterBackend 自定义过滤器django-filter模块 自定义过滤类 搜索SearchFilter 排序OrderingFilt ...
- javascript实现blob加密视频源地址
一.HTML代码: <video id="my-video" class="video-js" playsinline controls preload= ...
- 用JSON.stringify去实现深拷贝的弊端
无法处理function啦还有RegExp啦,还有无法处理循环引用对象(这个我还没有test) 就前两点的话 var a={ a:, b:new RegExp('test'), c:function( ...