应用概述
4G 模块支持 MQTT 和 MQTT SSl 协议, MQTT 应用的基本流程如下:
1、如果要支持 SSL,配置 SSL 参数
2、通过 TCP 连接到 MQTT 服务器
3、发送 MQTT CONNECT 到服务器,打开会话连接
4、订阅或者发布消息
发布消息示例
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 OK
AT+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
在这个过程中,注意事项如下:
1、发送 MIPSTART 命令后,收到 OK 仅仅表示 4G 模块开始处理这条命令,并不表示 TCP 已经连接成功;只有收到 CONNECT OK 才是成功的应答(其余错误应答,参考 AT 手册)
2、发送 MCONNECT 命令后,收到 OK 仅仅表示 4G 模块开始处理这条命令,并不表示 MQTT已经连接成功;只有收到 CONNACK OK 才是成功的应答(其余错误应答,参考 AT 手册)
3、发送 MSUB 命令后,收到 OK 仅仅表示 4G 模块开始处理这条命令,并不表示 MQTT 已经订阅成功;只有收到 SUBACK 才是成功的应答(其余错误应答,参考 AT 手册)
4、发送 MPUB 命令后,如果 QOS 不是 0,则收到 OK 仅仅表示 4G 模块开始处理这条命 令,并不表示 MQTT 已经发布成功;只有收到 PUBACK(QOS 为 1 时)或者 PUBCOMP(QOS 为 2 时)才是成功的应答(其余错误应答,参考 AT 手册)
接收消息示例
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
TCP 被动断开示例
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 还是 CME ERROR,都直接跳过,不用做
正确性判断
AT+MCONFIG="866289037465624","user","password"
OK
AT+MIPSTART="lbsmqtt.airm2m.com","1884"
OK
CONNECT OK
AT+MCONNECT=1,60
OK
CONNACK OK
PDP 被动去激活示例
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
常见问题
1、MQTT 支持多连接吗
目前 MQTT 仅支持单连接,不支持多连接
2、MQTT 的遗嘱如何使用
通过 AT+MCONFIG 命令可以设置遗嘱的 qos、retain 标志、topic、payload;在如下几种(包 含但是又不仅限于如下情况)情况下,服务器会主动发布遗嘱消息到订阅的客户端:
1、模块和服务器通信异常(例如模块突然关机、模块进入了一个没有网络信号的环境 等)超过 1.5 倍(一般是 1.5 倍,但不排除服务器可以修改这个时间)的 keep alive 时 间(可以通过 AT+MCONNECT 设置 keep alive 时间)
2、模块主动执行 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 消息
3、MQTT SSL 如何使用
本文主要描述了基本流程和异常处理,对于 MQTT SSL 使用方法没有做过多描述,这一部分, 请自行参考 AT 手册 MQTT 章节下《使用方法举例》中的"SSL 带证书验证流程"使用方法;支 持的 SSL 参数,请自行参考 AT+SSLCFG 命令说明 如果 SSL 的参数配置不变,则每次开机运行过程中,仅设置一次即可
4、重试多次 PDP,MQTT 应用一直连接失败
如果重试多次 PDP 激活,PDP 一直激活失败,或者 MQTT 一直连接失败,则尝试使用如下手段恢复:
1、使用 RESET 引脚复位模块
2、极端情况下,直接给模块断电,再上电,POWER KEY 引脚拉低开机
5、MPUB 命令中,payload 包含"如何发送?
消息中内嵌的双引号请用\22 表达;控制字符 \r(0x0D)请用\0D 表达;控制字符\n(0x0A) 请用\0A 表达 如果是 MCU 发消息,请用\\22,\\0D,\\0A 来 表达,即\需要转义成\\
6、连接服务器失败
1. 检查下模块信号、网络注册、网络附着、PDP 激活状态
2. 检查下 SIM 卡是否欠费【4G 模块有一种欠费表现:无法注册 4G 网络,可以注册 2G网络】
3. 使用 mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障
4. 部分国外的开源项目提供免费的 MQTT 代理服务器,因为网络的原因,国内存在严 重的延迟或者丢包现象,导致程序运行出现问题,此现象在 AT 开发时影响严重
5. 确认是不是域名解析失败导致,可以通过 AT+CDNSGIP=<domain name>确认一下 域名是否能正常解析(注意:该命令只有在执行完 at+cstt、at+ciicr、at+cifsr 后才能正常工作),不能正常解析,可以通过 AT+CDNSCFG=ip1,ip2 设置域名解析服务器。
6. 在 MIPSTART /SSLMIPSTART 返 回 CONNECT OK 后 才 能 发 MCONNECT 命令, 而且要立即发,否则会被服务器踢掉。
7、数据接收缓存问题
1. 不缓存:通过 AT+MQTTMSGSET=0 设置;收到订阅的 publish 报文后,立即通过 AT 口输出主题、payload 长度、payload 内容,每个报文中支持的 payload 内容最长 4100 字节。
2. 内存缓存:通过 AT+MQTTMSGSET=1 设置;内存中有一个缓存表,一条消息最多 4kb,最多支持缓存 4 条 publish 报文;收到订阅的 publish 报文后,插入缓冲表中的空闲位 置,然后通过 AT口输出存储位置;缓存表满之后,新收到的 publish 报文会覆盖最旧的 publish 报文。
注意:缓存表位于内存中,断电或者重启后,缓存表中的数据会被清空;建议收到数据 时,通过 AT+MQTTMSGGET 及时读取出来,以防缓冲区满覆盖丢失数据
8、数据发送问题
AT+MPUB 最大 publish 2384 字节,AT+MPUBEX 长度取值范围 1-4100
这个我这里就是贴出来相关资料,因为不知道,也没有实际应用所以没太多信息。加上最近身体有些不舒服,所以就囫囵吞枣的弄了上来,便于大家研究一下。

被折叠的 条评论
为什么被折叠?



