电路研究9.3.5——合宙Air780EP中的AT开发指南:MQTT 应用指南

        应用概述

        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 已经发布成功;只有收到 PUBACKQOS 1 时)或者 PUBCOMPQOS 为 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
        //此处无论返回 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
        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
        //此处无论返回 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
        常见问题
        1、MQTT 支持多连接吗
        目前 MQTT 仅支持单连接,不支持多连接
        2、MQTT 的遗嘱如何使用
        通过 AT+MCONFIG 命令可以设置遗嘱的 qosretain 标志、topicpayload;在如下几种(包 含但是又不仅限于如下情况)情况下,服务器会主动发布遗嘱消息到订阅的客户端:
        1、模块和服务器通信异常(例如模块突然关机、模块进入了一个没有网络信号的环境 等)超过 1.5 倍(一般是 1.5 倍,但不排除服务器可以修改这个时间)的 keep alive 时 间(可以通过 AT+MCONNECT 设置 keep alive 时间)
        2、模块主动执行 AT+MDISCONNECT 或者 AT+MIPCLOSE
        曾经有用户碰到过如下问题: 模块设置了遗嘱 topic /will_topic,遗嘱 payload offlinekeep 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_topicpayload 为 online 的消息,这样订阅了遗嘱 topic 的其他客户端就会收到这个 online 消息
        3、MQTT SSL 如何使用
        本文主要描述了基本流程和异常处理,对于 MQTT SSL 使用方法没有做过多描述,这一部分, 请自行参考 AT 手册 MQTT 章节下《使用方法举例》中的"SSL 带证书验证流程"使用方法;支 持的 SSL 参数,请自行参考 AT+SSLCFG 命令说明 如果 SSL 的参数配置不变,则每次开机运行过程中,仅设置一次即可
        4、重试多次 PDPMQTT 应用一直连接失败
        如果重试多次 PDP 激活,PDP 一直激活失败,或者 MQTT 一直连接失败,则尝试使用如下手段恢复:
        1、使用 RESET 引脚复位模块
        2、极端情况下,直接给模块断电,再上电,POWER KEY 引脚拉低开机
        5、MPUB 命令中,payload 包含"如何发送?
        消息中内嵌的双引号请用\22 表达;控制字符 \r(0x0D)请用\0D 表达;控制字符\n0x0A) 请用\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+csttat+ciicrat+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
        这个我这里就是贴出来相关资料,因为不知道,也没有实际应用所以没太多信息。加上最近身体有些不舒服,所以就囫囵吞枣的弄了上来,便于大家研究一下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

esmember

感谢大家喜欢我遇到的问题分享。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值