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通信
前言 这节稍微唠叨点 其实我很长时间都没有出怎么连接现成的物联网平台的教程, 一直写的是教给大家自己搭建服务器,主要原因是因为我感觉连接现有的学不到东西. 现在出这种教程,是因为发现确实很多人喜欢用. ...
随机推荐
- Linux命令随手记
随手记录常用的Linux命令. tar 解压. tar -xzvf tar 压缩:tar -czvf .tgz (z是压缩格式,x为解压,v为显示过程,f指定备份文件) tar -zc ...
- 运行带参数的python脚本
问题描述: 要执行python脚本,有哪几种方法. 特别是看书的时候,书上只讲解了如何在linux下运行,windows根本就没有那些命令,该怎么办呢? 方法1:python自带的IDLE编辑器 Ru ...
- JavaScript 内存回收机制
引用 垃圾回收算法主要依赖引用的概念,例如一个对象如果有另外一个对象的访问权限,这里就叫做一个对象引用另外一个对象,不论这里是显式还是隐式 回收机制 Js具有自动垃圾回收机制.垃圾收集器会按照固定的时 ...
- java跳出循环break;return;continue使用
for(int i=0;i<5;i++){ if(i==2){ System.out.println("i==2时忽略了"); continue;//忽略i==2时的循环 } ...
- centos7.x下环境搭建(三)—nodejs安装
有3种方式可以安装nodejs yum安装 源码包安装 nvm方式安装 一.方式1:yum安装 这里我们指定安装8.x以上的版本 # curl --silent --location https:// ...
- ImageView的adjustViewBounds属性
adjustViewBounds属性的定义如下: 调整ImageView的边界,使得ImageView和图片有一样的宽高比 这个属性只有在ImageView一边如宽度或高度固定,一边为wrap_con ...
- RecyclerView预览数据
我们在布局文件里定义RecyclerView时,可以使用tools属性预览数据,如下: <android.support.v7.widget.RecyclerView android:layou ...
- 使用RunTime.getRunTime().addShutdownHook优雅关闭线程池
有时候我们用到的程序不一定总是在JVM里面驻守,可能调用完就不用了,释放资源. RunTime.getRunTime().addShutdownHook的作用就是在JVM销毁前执行的一个线程.当然这个 ...
- WPF MainWindow的TopMost,Resizemode
Topmost -[true,false] The default is false, but if set to true, your Window will stay on top of othe ...
- C#利用newtonsoft.json读取.so配置文件内容
今天花 了点时间来使用 C#读取json文件 ,文件后缀为 .so文件 ,也是基于文件流的形式 获取 对象 ,然后解析; 之所以尝试 使用 json读取 ,是因为其配置文件的格式 更为友好 和方便,直 ...