Air系列4G模块AT版本MQTT应用说明

4G模块AT版本如何使用MQTT

一、应用概述

            4G模块支持MQTTMQTT SSl协议,  MQTT应用的基本流程如下:

         1、激活PDP(参考:http://oldask.openluat.com/article/937

         2、如果要支持SSL,配置SSL参数

         3、通过TCP连接到MQTT服务器

         4、发送MQTT CONNECT到服务器,打开会话连接

         5、订阅或者发布消息

         6、出现异常后:关闭TCP连接,有选择性的去激活PDP;然后再有选择性的激活PDP,从第2步开始执行       

二、应用流程和异常处理

            本章节分四部分来介绍MQTT应用的基本流程和异常处理

2.1、连接、订阅、发布

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

AT+CPIN?

 

+CPIN: READY    //查询sim卡是否正常

 

OK

AT+CGATT?

 

+CGATT: 1        //查询是否附着上数据网络,如果返回+CGATT: 0表示未附着上

 

OK

AT+SAPBR=3,1,"CONTYPE","GPRS"

 

OK

AT+SAPBR=3,1,"APN",""    //设置APN,此处""表示使用从网络端自动获取到的APN

 

OK

AT+SAPBR=1,1             //发起激活PDP的请求

 

OK

AT+SAPBR=2,1             //注意:此命令仅仅查询PDP地址,可以不执行

 

+SAPBR: 1,1,"10.159.1.145"    //请求到的PDP地址

 

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已经发布成功;只有收到PUBACKQOS1时)或者PUBCOMPQOS2时)才是成功的应答(其余错误应答,参考AT手册)

2.2、接收

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

......           //此处省略了PDP激活的过程,参考2.1章节

 

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

 

//mqtt/sub_topic上收到订阅消息,payload123456

//默认是直接输出收到的订阅消息,不做缓存

+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

 

         注意事项如下:

         1红色蓝色两部分演示了处理订阅消息的两种方式,用户根据产品需要自行决定使用何种方式

         2、使用蓝色的缓存方式处理订阅消息时,需要注意最多支持4条缓存,为了防止消息覆盖导致的丢失,收到订阅消息时,应及时主动读取处理

2.3TCP被动断开

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

......           //此处省略了PDP激活的过程,参考2.1章节

 

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     //此处无论返回OKERROR还是CME ERROR,都直接跳过,不用做正确性判断

 

AT+MCONFIG="866289037465624","user","password"

 

OK

AT+MIPSTART="lbsmqtt.airm2m.com","1884"

 

OK

 

CONNECT OK

AT+MCONNECT=1,60

 

OK

 

CONNACK OK

 

         参考2.1章节流程图,左下角的“收到CLOSED错误提示,表示MQTTTCP连接被动断开”为异常处理的触发点

2.4PDP被动去激活

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

......           //此处省略了PDP激活的过程,参考2.1章节

 

AT+MCONFIG="866289037465624","user","password"

 

OK

AT+MIPSTART="lbsmqtt.airm2m.com","1884"

 

OK

 

CONNECT OK

AT+MCONNECT=1,60

 

OK

 

CONNACK OK

 

+SAPBR 1: DEACT       //此处PDP被动去激活

AT+MIPCLOSE

 

OK                     //此处无论返回OKERROR还是CME ERROR,都直接跳过,不用做正确性判断

AT+SAPBR=0,1

 

+CME ERROR: 3         //此处无论返回OKERROR还是CME ERROR,都直接跳过,不用做正确性判断

......                //此处省略了PDP激活的过程,参考2.1章节

AT+MCONFIG="866289037465624","user","password"

 

OK

AT+MIPSTART="lbsmqtt.airm2m.com","1884"

 

OK

 

CONNECT OK

AT+MCONNECT=1,60

 

OK

 

CONNACK OK

 

         参考2.1章节流程图,右下角的“收到+SAPBR 1: DEACT错误提示,表示PDP被动去激活”为异常处理的触发点

三、常见问题

3.1MQTT支持多连接吗

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

3.2MQTT的遗嘱如何使用

         通过AT+MCONFIG命令可以设置遗嘱的qosretain标志、topicpayload;在如下几种(包含但是又不仅限于如下情况)情况下,服务器会主动发布遗嘱消息到订阅的客户端:

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

         2、模块主动执行AT+MDISCONNECT或者AT+MIPCLOSE

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

         模块设置了遗嘱topic/will_topic,遗嘱payloadofflinekeep alive时间为5分钟,模块关机后,等待2分钟,在等待的2分钟内,其他订阅了/will_topic的客户端没有收到遗嘱消息(这是正常的,因为还没有到达1.5倍的keep alive时间),2分钟后,模块开机mqtt重连成功后,其他客户端却收到了遗嘱消息,这是什么原因呢?这部分机制是服务器端设计的,和模块无关,个人认为:服务器端仍然在维持2分钟前的那个mqtt连接,现在模块开机,用同样的client id重连后,会断开之前维护的相同client idmqtt连接,断开时,就发布了一次遗嘱消息。那这种问题,如何解决呢?模块可以在AT+MCONNECT返回CONNACK OK之后,通过AT+MPUB一个topic/will_topicpayloadonline的消息,这样订阅了遗嘱topic的其他客户端就会收到这个online消息

3.3MQTT SSL如何使用

         本文主要描述了基本流程和异常处理,对于MQTT SSL使用方法没有做过多描述,这一部分,请自行参考AT手册MQTT章节下《使用方法举例》中的"SSL带证书验证流程"使用方法;支持的SSL参数,请自行参考AT+SSLCFG命令说明

         如果SSL的参数配置不变,则每次开机运行过程中,仅设置一次即可

3.4、重试多次PDPMQTT应用一直连接失败

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

         1、使用RESET引脚复位模块

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

  • 发表于 2019-09-05 18:21
  • 阅读 ( 6053 )

0 条评论

请先 登录 后评论
不写代码的码农
朱天华

软件工程师

19 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章