终于要讲一讲MQTT应用!

本文应各位大佬邀请,详细讲解Air780EP模组MQTT应用的多个AT命令。

Air780EP是低功耗4G模组之一,支持全系列的AT指令以及LuatOS脚本二次开发。

一、准备工作 

1.1 硬件准备

  • 合宙EVB_Air780EP开发板一套,包括天线、SIM卡;

  • USB线

  • PC电脑

1.2 软件准备

  • 串口调试工具
    如果没有准备,推荐使用LLCOM:

  • AT固件下载

进入AT固件页面按下Ctrl+F,搜索AirM2M_780EP_LTE_AT,即可找到Air780EP模块所使用的AT固件。

本文示例为:
AirM2M_780EP_V1007_LTE_AT版本固件

推荐选用:相关型号固件名称后面数字版本号最高的最新relase版本进行调试。

二、MQTT应用流程 

合宙低功耗4G模块支持MQTT和MQTT SSl协议,MQTT应用的基本流程如下:

  1. 如果要支持SSL,配置SSL参数

  2. 通过TCP连接到MQTT服务器

  3. 发送MQTT CONNECT到服务器,打开会话连接

  4. 订阅或者发布消息

三、MQTT发布消息 

先来看个正常情况下的AT命令序列,如果不理解AT命令含义,请自行参考AT手册。

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+CPIN?
+CPIN: READY    //查询sim卡是否正常
OK
AT+CGATT?
+CGATT: 1        
//查询是否附着上数据网络,如果返回+CGATT: 0表示未附着上
OK
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OKAT+MSUB="mqtt/sub_topic",0
OK
SUBACK
AT+MPUB="mqtt/pub_topic",0,0,"publish 0 payload"
OK
AT+MPUB="mqtt/pub_topic",1,0,"publish 1 payload"
OK
PUBACK
AT+MPUB="mqtt/pub_topic",2,0,"publish 2 payload"
OK
PUBREC
PUBCOMP

发布消息示例演示效果:

相关注意事项:

01. 发送MIPSTART命令

收到OK仅仅表示4G模块开始处理这条命令,并不表示TCP已经连接成功;只有收到CONNECT OK才是成功的应答(其余错误应答,参考AT手册)。

02. 发送MCONNECT命令

收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经连接成功;只有收到CONNACK OK才是成功的应答(其余错误应答,参考AT手册)。

03. 发送MSUB命令

收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经订阅成功;只有收到SUBACK才是成功的应答(其余错误应答,参考AT手册)。

04. 发送MPUB命令

如果QOS不是0,则收到OK仅仅表示4G模块开始处理这条命令,并不表示MQTT已经发布成功;只有收到PUBACK(QOS为1时)或者PUBCOMP(QOS为2时)才是成功的应答(其余错误应答,参考AT手册)。

四、MQTT接收消息 

先来看下接收到订阅消息时的AT命令处理序列,如果不理解AT命令含义,请自行参考AT手册。

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
AT+MSUB="mqtt/sub_topic",0
OK
SUBACK
AT+MPUB="mqtt/sub_topic",0,0,"123456"
//在mqtt/sub_topic上收到订阅消息,payload为123456
//默认是直接输出收到的订阅消息,不做缓存
+MSUB: "mqtt/sub_topic",6 byte,123456
//设置订阅消息的处理模式,设置为缓存模式
//接下来收到订阅消息时,会提示订阅消息的缓存位置
AT+MQTTMSGSET=1
OK
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置0
+MSUB: 0
//主动读取缓存的所有订阅消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
OK
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置0
+MSUB: 0
//在mqtt/sub_topic上收到一条订阅消息,缓存到位置1
+MSUB: 1
//主动读取缓存的所有订阅消息
AT+MQTTMSGGET
+MSUB:mqtt/sub_topic,6 byte,123456
+MSUB:mqtt/sub_topic,6 byte,123456
OK

接收消息演示效果:

五、MQTT TCP被动断开

先来看下连接被动断开时的AT命令处理序列,如果不理解AT命令含义,请自行参考AT手册:

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
CLOSED        //此处TCP连接被动断开
AT+MIPCLOSE
+CME ERROR: 767    
//此处无论返回OK、ERROR还是CMEERROR,都直接跳过,不用做正确性判断
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK

六、MQTT PDP被动去激活

先来看下PDP被动去激活时的AT命令处理序列,如果不理解AT命令含义,请自行参考AT手册。

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
+CGEV: NW PDN DEACT 1      
//此处PDP被动去激活
AT+MIPCLOSE
OK                    
//此处无论返回OK、ERROR还是CME ERROR,都直接跳过,不用做正确性判断
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK

七、SSL带证书验证流程【单向认证】

先来看下SSL带证书验证(单向认证)时的AT命令处理序列,如果不理解AT命令含义,请自行参考AT手册。

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+CGATT?
+CGATT: 1
OK
AT+FSCREATE="ca.crt"//创建CA证书文件
OK
AT+FSWRITE="ca.crt",0,1212,15  
//1212是证书文件长度,15为超时时间,这里是举例说明,请填入实际数据,不要照抄 >
//此处填写证书数据
OK
AT+SSLCFG="cacert",88,"ca.crt"
//设置CA证书文件为ca.crt
OK
AT+SSLCFG="seclevel",88,1
//1表示设置认证模式为只对服务器认证
OK
AT+MCONFIG="868488076506128","user","password"
//这三个参数可以不加双引号,第一个参数需要开发者自己设置
//后两个参数可以不填,格式为:
AT+MCONFIG="868488076506128","",""
OK
AT+SSLMIPSTART="airtest.openluat.com",8883
//开发者请修改为自己的服务器地址和端口
OK
CONNECT OK
AT+MCONNECT=1,60
//在MIPSTART返回CONNECT OK后才能发MCONNECT命令
//而且要立即发,否则会被服务器踢掉
OK
CONNACK OK
--后面发布和接收与前面一样,直接参考

 八、SSL带证书验证流程【双向认证】

先来看下SSL带证书验证(双向认证)时的AT命令处理序列,如果不理解AT命令含义,请自行参考AT手册。

AT指令手册下载链接:
https://doc.openluat.com/article/4985

AT+CGATT?
+CGATT: 1
OK
AT+FSCREATE="ca.crt" //创建CA证书文件
OK
AT+FSWRITE="ca.crt",0,1212,15  
//1212是证书文件长度,15为超时时间,这里是举例说明,请填入实际数据,不要照抄 >
//此处填写证书数据
OK
AT+FSCREATE="client.crt"
//创建客户端证书文件
OK
AT+FSWRITE="client.crt",0,1127,15 >
//此处填写证书数据
OK
AT+FSCREATE="client.key"
//创建客户端key文件
OK
AT+FSWRITE="client.key",0,1679,15 >
//此处填写证书数据
OK
AT+SSLCFG="cacert",88,"ca.crt"
//设置CA证书文件为ca.crt
OK
AT+SSLCFG="clientcert",88,"client.crt"
//设置客户端证书文件为client.crt
OK
AT+SSLCFG="clientkey",88,"client.key"
//设置客户端密钥文件为client.key
OK
AT+SSLCFG="seclevel",88,2
//设置认证模式为双向认证
OK
AT+MCONFIG="868488076506128","user","password"
//这三个参数可以不加双引号,第一个参数需要开发者自己设置
//后两个参数可以不填,格式为:
AT+MCONFIG="868488076506128","",""
OK
AT+SSLMIPSTART="airtest.openluat.com",8883
//开发者请修改为自己的服务器地址和端口
OK
CONNECT OK
AT+MCONNECT=1,60
//在MIPSTART返回CONNECT OK后才能发MCONNECT命令
//而且要立即发,否则会被服务器踢掉
OK
CONNACK OK
--后面发布和接收与前面一样,直接参考

九、常见问题Q&A 

以下针对客户朋友们实际应用中的反馈,整理了MQTT应用中的常见问题:

01. MQTT支持多连接吗?

目前MQTT仅支持单连接,不支持多连接。

02. MQTT的遗嘱如何使用?

通过AT+MCONFIG命令可以设置遗嘱的qos、retain标志、topic、payload。

在如下(包含但不仅限于)情况下,服务器会主动发布遗嘱消息到订阅的客户端:

  • 模块和服务器通信异常(例如:模块突然关机、模块进入了一个没有网络信号的环境等)超过1.5倍(一般是1.5倍,但不排除服务器可以修改这个时间)的keep alive时间(可以通过AT+MCONNECT设置keep alive时间);

  • 模块主动执行AT+MDISCONNECT,或者AT+MIPCLOSE。

曾经有用户碰到过如下问题:

模块设置了遗嘱topic为/will_topic,遗嘱payload为offline,keep alive时间为5分钟,模块关机后,等待2分钟。

在等待的2分钟内,其他订阅了/will_topic的客户端没有收到遗嘱消息(这是正常的,因为还没有到达1.5倍的keep alive时间)。

2分钟后,模块开机MQTT重连成功后,其他客户端却收到了遗嘱消息。这是什么原因呢?

这部分机制是服务器端设计的,和模块无关。个人认为:服务器端仍然在维持2分钟前的那个MQTT连接,现在模块开机,用同样的client id重连后,会断开之前维护的相同client id的MQTT连接。断开时,就发布了一次遗嘱消息。

那这种问题,如何解决呢?

模块可以在AT+MCONNECT返回CONNACK OK之后,通过AT+MPUB一个topic为/will_topic,payload为online的消息,这样订阅了遗嘱topic的其他客户端,就会收到这个online消息。

03. 重试多次PDP,MQTT应用一直连接失败?

如果重试多次PDP激活,PDP一直激活失败,或者MQTT一直连接失败,则尝试使用如下手段恢复:

  • 使用RESET引脚复位模块;

  • 极端情况下,直接给模块断电,再上电,POWER KEY引脚拉低开机。


04. MPUB命令中,payload包含"如何发送?

  • 消息中内嵌的双引号请用\22表达;

  • 控制字符 \r(0x0D)请用\0D表达;

  • 控制字符\n(0x0A)请用\0A表达;

  • 如果是MCU发消息,请用\\22,\\0D,\\0A来表达,即\需要转义成\\。


05. 连接服务器失败

  • 检查模块信号、网络注册、网络附着、PDP激活状态;

  • 检查SIM卡是否欠费;

  • 使用mqtt.fx,连接服务器确认是否可以连接成功,排除服务器故障;

  • 部分国外的开源项目提供免费的MQTT代理服务器,因为网络的原因,国内存在严重的延迟或者丢包现象,导致程序运行出现问题,此现象在AT开发时影响严重;

  • 确认是不是域名解析失败导致,可以通过AT+CDNSGIP=确认域名是否能正常解析(注意:该命令只有在执行完at+cstt、at+ciicr、at+cifsr后才能正常工作)。

    如不能正常解析,可以通过AT+CDNSCFG=ip1,ip2设置域名解析服务器。

  • 在MIPSTART /SSLMIPSTART返回CONNECT OK后,才能发MCONNECT命令,而且要立即发,否则会被服务器踢掉。


06. 数据接收缓存问题

不缓存:

通过AT+MQTTMSGSET=0设置;收到订阅的publish报文后,立即通过AT口输出主题、payload长度、payload内容,每个报文中支持的payload内容最长4100字节。

内存缓存:

通过AT+MQTTMSGSET=1设置;内存中有一个缓存表,一条消息最多4kb,最多支持缓存4条publish报文;收到订阅的publish报文后,插入缓冲表中的空闲位置,然后通过AT口输出存储位置;缓存表满之后,新收到的publish报文会覆盖最旧的publish报文。

注意事项:

缓存表位于内存中,断电或者重启后,缓存表中的数据会被清空;建议收到数据时,通过AT+MQTTMSGGET及时读取出来,以防缓冲区满覆盖丢失数据。

07. 数据发送问题

AT+MPUB最大publish 4100字节,AT+MPUBEX长度取值范围1-4100。

MQTT应用:Air780EP低功耗4G模组AT开发的更多相关文章

  1. 制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

    实现的功能: l  APP控制月球灯 l  本地月球灯控制 l  APP控制"大白"颜色,实现各种颜色变身 l  门状态传感器状态APP显示 l  网络状态指示灯,连接服务器长亮, ...

  2. NFC模组,开发NFC功能 仅仅要几条指令的事情

    特点:实现NFC透明传输.内置NFC协议栈,支持UART串口直接读写,用于门禁能够同一时候兼容手机和卡片开门,还能实现动态密钥,读到的NFC数据自己主动串口输出,会串口就能开发NFC,不须要研究LLC ...

  3. 手把手教你基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台

    摘要:本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,实现对华为云物联网平台的设备通信与控制 本文分享自华为云社区<基于luatos的4G(LTE Cat.1)模组接入华为云物 ...

  4. 最全的NB-IoT芯片厂商、模组厂商信息

    NB-IoT作为LPWAN(低功耗广域网)的新兴技术,因为具有低功耗.低成本.广覆盖.海量节点等优势,并且在授权频段可以与2G.3G无缝连接而被运营商所青睐且接受.特别是到了2017年,据统计全球有5 ...

  5. 中国移动推出NB-IoT/eMTC/GSM多模通信模组Qualcomm调制解调器支持

    亚洲电子消费展(CES Asia)在上海举行.期间,中国移动正式推出NB-IoT/eMTC/GSM三模通信模组A9500.该通信模组采用Qualcomm MDM9206 LTE IoT调制解调器,具有 ...

  6. BC26模组UDP调试

    BC26模组调试 数据上报AT流程 [15:33:46.819]收←◆ F1: 0000 0000 V0: 0000 0000 [0001] 00: 0006 000C 01: 0000 0000 U ...

  7. openwrt编译加载龙尚U9300模组上网

    硬件平台:MT7628A openwrt版本:MTK_SDK 1.添加模组信息 /build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/linux ...

  8. 异构智联Wi-Fi+蓝牙模组,连接快、准、稳!

    下班回家打开门,电灯.电视.空调.音响.电动窗帘.扫地机器人--一呼百应,有序开工,原本冰冷的房子立刻变成了温暖港湾.可以说,舒适便捷的智能设备已经完全融入了我们的生活中. 从单一场景.单一设备,到现 ...

  9. MTK 平台上查询当前使用的摄像头模组及所支持预览分辨率

    1,MTK 平台如何查询当前使用的是哪颗摄像头及相关的模组信息? 在该目录下可以查到当前平台及相关项目的配置文件 ProjectConfig.mk \ALPS.JB.MP.V1_W_20120919\ ...

  10. android camera(一):camera模组CMM介绍

    一.摄像头模组(CCM)介绍: 1.camera特写 摄像头模组,全称CameraCompact Module,以下简写为CCM,是影像捕捉至关重要的电子器件.先来张特写,各种样子的都有,不过我前一段 ...

随机推荐

  1. Kubernetes 初体验

    在 DigitalOcean 创建一个 Kubernetes 集群 下载集群 Config 文件到 ~/.kube 目录 通过环境变量 KUBECONFIG 设置本地 kubectl 工具使用下载的配 ...

  2. 查看 Linux 系统信息

    查看系统信息 查看发行版信息 cat /etc/os-release lsb_release -a 查看公网 IP 地址 curl -4 icanhazip.com 查看系统架构 uname -m # ...

  3. SpringBoot 引入 WebSocket

    maven 添加websocket ,按照一篇博文引入 websocket https://www.cnblogs.com/likun10579/p/5450209.html 在浏览器控制台测试是否连 ...

  4. elementUI实现月、季度、年 时间选择框

    elementUI实现月.季度.年 时间选择框 一.通过 el-date-picker 组件来实现月.年的选择 代码如下: <el-date-picker v-if="dateType ...

  5. C++ STL(标准模版库)—— vector 与 迭代器

    STL 基本概念 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称. STL 从广义上讲分为三类:algorithm(算法).containe ...

  6. 图解YUV420、YUV420(YUY2)、YUV422(YVYU)

    Y:亮度分量    UV:色度分量 1.  标准yuv指的是yuv420 一般看文章,会出现下面的公式,但不涉及具体的yuv格式,其实这一定指的是yuv420 Y与RGB的演算关系为:Y = 0.21 ...

  7. java基础 -反射笔记

    710,反射快速入门 代码: 先创建一个 re.properties 文件: classfullpath=com.hspedu.Cat method=hi Cat.java package com.h ...

  8. 对 LLM 工具使用进行统一

    我们为 LLM 确立了一个跨模型的 统一工具调用 API.有了它,你就可以在不同的模型上使用相同的代码,在 Mistral.Cohere.NousResearch 或 Llama 等模型间自由切换,而 ...

  9. 2022年9月中国数据库排行榜:榜眼、探花纷纷易主,AnalyticDB蝉联榜单十强

    夏去秋来清风至,榜首前三起涟漪. 2022年9月的 墨天轮中国数据库流行度排行榜火热出炉,相比上月新增两个数据库, 本月榜单前十名可以用一句话概括为:OceanBase新版发布先声夺人,达梦低调做事暂 ...

  10. vue前端开发仿钉图系列(7)底部数据列表的开发详解

    底部数据列表主要是记录图层下面对应的点线面数据,点击单元行或者查看或者编辑,弹出右侧编辑页面,点击单元行地图定位到相应的绘图位置.里面的难点1是动态绑定字段管理编辑的字段以及对应的value值,2是点 ...