MQTT是一种基于 发布/订阅 模式的轻量级通信协议。MQTT专门针对 物联网设备 开发,是一种 低开销、低带宽占用的即时通讯协议。该协议构建于 TCP/IP 上,旨在为低带宽和不稳定网络环境中的物联网设备,提供可靠的网络服务。它的设计思想是简单、开放、规范,易于实现,这些特点使其非常适合 机器间通信(M2M)、物联网(IoT)等场景。因其协议简单、数据流量开销低、时延低、对网络条件的容忍度高等特点,特别适合于硬件受限的嵌入式设备。MQTT 最大优点在于,可以以极少的代码和有限的网络带宽,为远程设备连接提供实时可靠的消息服务。
HTTP连接并不适合于物联网设备通信,原因主要如下:
- 1. 流量、功耗大。HTTP可以看作是单向连接,所以需要设备定时查询状态,导致即使设备空闲还是会产生多余的流量开销,同时增大了空闲功耗。
- 2. 时延高。云服务器会限制HTTP接入的查询频率,例如OneNET将HTTP的最短刷新间隔限制在3s,以减轻服务器的压力。但导致从用户到设备会产生数秒的时延,用户体验非常不好。
上一章使用HTTP连接OneNET,但不建议产品中这么应用,仅作为了解。实际产品肯定要MQTT,体验好太多。
EC600S的MQTT指令支持阿里云、移动OneNET、华为IoT三种云平台,可实现云服务的快速接入,下面介绍如何用EC600S的AT指令以MQTT方式接入阿里云。
同样也适用于 EC200S。(EC200S不支持QuecPython,体积比EC600S略大,但便宜很多)
1. 准备
QCOM_V1.6
ma_MQTT.ini(QCOM的配置导入文件,包含我调试使用到的AT命令)
Quectel_EC200x&EC600S&EG912Y系列_MQTT_应用指导_V1.0.pdf
阿里云设备管理账号:阿里云创建产品、设备、获取三元组
以上工具和文档已上传GitHub:EC600S 文档及工具下载
对MQTT协议及帧构成有兴趣的,可以看下:(非必要可不看)
MQTT 3.1.1报文帧详解:MQTT报文帧详解
网络调试助手接入阿里云:MQTT接入阿里云,逐字节解析
2. MQTT接入阿里云 - AT操作流程
- 1. 开机,设置运营商信息,打开PDP场景。
- 2. 设置MQTT可选参数。例如:客户端标识、接收模式、阿里云 设备三元组。
- 3. 打开客户端,连接客户端到阿里云MQTT服务器。
- 4. 订阅/退订主题,接收/上发物模型数据报文。
- 5. 断开客户端与MQTT服务器的连接,关机。
3. 关键AT命令格式
-
3.1 AT+QMTCFG 配置MQTT可选参数
主要配置 客户端标识、接收模式、阿里云 设备三元组。
-
(
1)配置接收模式:
AT
+QMTCFG
=
"recv/mode",
0,0,1
-
(
2)配置阿里云设备三元组:
AT
+QMTCFG
=
"aliauth",
<client_idx
>,
<product_
key
>,
<device_name
>,
<device_secret
>
-
例:
-
AT
+QMTCFG
=
"aliauth",
0,
"a1wFylTxYeD",
"co_0001",
"7ab0c4b3532b5783df5fdc58a2895d7a"
<client_idx>:MQTT客户端标识符,范围0~5。(跟TCP使用的socket_id是差不多的意思)
<product_key>:阿里云设备三元组的 ProductKey。
<device_name>:阿里云设备三元组的 DeviceName。
<device_secret>:阿里云设备三元组的 DeviceSecret。
-
3.2 AT+QMTOPEN 打开MQTT客户端网络
-
(
1)查询已经打开的MQTT客户端:
AT
+QMTOPEN?
-
-
(
2)设置并打开MQTT客户端:
AT
+QMTOPEN
=
<client_idx
>,
<host_name
>,
<port
>
-
例:
-
AT
+QMTOPEN
=
0,
"iot-as-mqtt.cn-shanghai.aliyuncs.com",
1883
<client_idx>:MQTT客户端标识符,范围0~5。
<host_name>:MQTT服务器地址,可以是IP地址或者域名。最大长度100字节。
<port>:服务器端口。范围1~65535。MQTT的端口为 1883。
-
3.3 AT+QMTCONN 连接客户端到MQTT服务器
-
(
1)查询当前有哪些的连接:
AT
+QMTCONN?
-
(
2)设置客户端连接:
AT
+QMTCONN
=
<client_idx
>,
<clientid
>
-
例:
-
AT
+QMTCONN
=
0,
"clientExample_0"
<client_idx>:MQTT客户端标识符,范围0~5。
<clientid>:客户端标识符。字符串类型。(完全自定义)
-
3.4 AT+QMTSUB 订阅主题
该命令可订阅一个或多个主题。
-
(
1)订阅主题:
AT
+QMTSUB
=
<client_idx
>,
<msgid
>,
<topic
1
>,
<qos
1
>[,
<topic
2
>,
<qos
2
>...]
-
例:
-
AT
+QMTSUB
=
0,1,
"/sys/a1wFylTxYeD/co_0001/thing/service/property/set",
0
-
AT
+QMTSUB
=
0,1,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post",
0
<client_idx>:MQTT客户端标识符,范围0~5。
<msgid>:数据包标识符。范围1~65535。(完全自定义,可以与其他帧有重复,但相邻帧尽量不同,方便区分错误返回消息)
<topic>:订阅的主题。字符串类型。
<qos>:消息的QoS等级。默认0,各大厂的服务器一般也只支持0。
阿里云下发开关状态、上报温湿度消息,使用的是物模型中自带的主题。可在 " 产品 " - " Topic类列表 " 中查看。
设备上报:/sys/a1wFylTxYeD/${deviceName}/thing/event/property/post
阿里云下发:/sys/a1wFylTxYeD/${deviceName}/thing/service/property/set
-
3.5 AT+QMTUNS 退订主题
该命令可退订一个或多个主题。
-
(
1)退订一个或多个主题:
AT
+QMTUNS
=
<client_idx
>,
<msgid
>,
<topic
1
>[,
<topic
2
>...]
-
例:
-
AT
+QMTUNS
=
0,2,
"/sys/a1wFylTxYeD/co_0001/thing/service/property/set"
-
AT
+QMTUNS
=
0,2,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post"
<client_idx>:MQTT客户端标识符,范围0~5。
<msgid>:数据包标识符。范围1~65535。(完全自定义,可以与其他帧有重复,但相邻帧尽量不同,方便区分错误返回消息)
<topic>:退订的主题。字符串类型。
-
3.6 AT+QMTPUBEX 发布消息
设备通过该命令发布定长消息到服务器。
-
发布消息到服务器:
AT
+QMTPUBEX
=
<client_idx
>,
<msgid
>,
<qos
>,
<retain
>,
<topic
>,
<
length
>
-
例:
-
AT
+QMTPUBEX
=
0,0,0,0,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post",
103
-
报文内容:
-
{
"method":
"thing.event.property.post",
"id":
"1142523359",
"params":{
"PowerSwitch_1":
0},
"version":
"1.0.0"}
<client_idx>:MQTT客户端标识符,范围0~5。
<msgid>:数据包标识符。范围1~65535。(完全自定义,可以与其他帧有重复,但相邻帧尽量不同,方便区分错误返回消息)
<qos>:消息的QoS等级。默认0,各大厂的服务器一般也只支持0。
<retain>:消息发送到当前订阅者后,服务器是否保持该消息。0-不保存;1-保存。默认值为0。
<topic>:待发布的主题。
<length>:待发布消息的数据长度。单位字节。
4. MQTT接入阿里云平台
阿里云设备管理账号:阿里云创建产品、设备、获取三元组
上电后,短按POWKY,待串口接收到 RDY后,表示模块已经开机。
-
4.1 PDP场景配置
(设置运营商信息,与上两章TCP、HTTP连接的前半部分操作一样)
-
RDY
-
AT
-
-
OK
-
AT
+CPIN?
-
-
+CPIN: READY
-
-
OK
-
AT
+CREG?
-
-
+CREG:
0,1
-
-
OK
-
AT
+CGREG?
-
-
+CGREG:
0,1
-
-
OK
-
AT
+CEREG?
-
-
+CEREG:
0,1
-
-
OK
-
AT
+QICSGP
=
1
-
-
+QICSGP:
1,
"CMNET",
"",
"",
1
-
-
OK
-
AT
+QICSGP
=
1,1,
"CMNET",
"",
"",
1
-
-
OK
-
AT
+QIACT
=
1
-
-
OK
-
AT
+QIACT?
-
-
+QIACT:
1,1,1,
"10.189.73.246"
-
-
OK
-
4.2 设置MQTT可选参数
如:客户端标识、接收模式、阿里云 设备三元组。
-
AT
+QMTCFG
=
"recv/mode",
0,0,1
-
-
OK
-
AT
+QMTCFG
=
"aliauth",
0,
"a1wFylTxYeD",
"co_0001",
"7ab0c4b3532b5783df5fdc58a2895d7a"
-
-
OK
-
4.3 打开客户端
连接客户端到阿里云MQTT服务器。
-
AT
+QMTOPEN
=
0,
"iot-as-mqtt.cn-shanghai.aliyuncs.com",
1883
-
-
OK
-
-
+QMTOPEN:
0,0
-
AT
+QMTOPEN?
-
-
+QMTOPEN:
0,
"iot-as-mqtt.cn-shanghai.aliyuncs.com",
1883
-
-
OK
-
AT
+QMTCONN
=
0,
"clientExample_0"
-
-
OK
-
-
+QMTCONN:
0,0,0
-
AT
+QMTCONN?
-
-
+QMTCONN:
0,3
-
-
OK
登陆阿里云,查看设备连接前后的在线状态,在线状态发送改变。阿里云设备管理平台
-
4.4 订阅主题
订阅两条主题。一个用于接收阿里云下发,一个用于上报。
-
AT
+QMTSUB
=
0,1,
"/sys/a1wFylTxYeD/co_0001/thing/service/property/set",
0
-
-
OK
-
-
+QMTSUB:
0,1,0,1
-
AT
+QMTSUB
=
0,1,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post",
0
-
-
OK
-
-
+QMTSUB:
0,1,0,1
登陆阿里云设备管理平台。查看到刚刚的两条主题已经存在于设备列表。
-
4.5 退订主题。
退订刚刚订阅的两个主题。
-
AT
+QMTUNS
=
0,2,
"/sys/a1wFylTxYeD/co_0001/thing/service/property/set"
-
-
OK
-
-
+QMTUNS:
0,2,0
-
AT
+QMTUNS
=
0,2,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post"
-
-
OK
-
-
+QMTUNS:
0,2,0
查看Topic列表,退订成功。
为了之后的测试能够正常进行,重新订阅这两个主题。
-
4.6 接收阿里云下发的报文
打开 " 在线调试 ",下发一次开关状态。
几乎是与此同时,QCOM输出了阿里云下发的报文,JSON的格式。"PowerSwitch_1":1,一致。
+QMTRECV: 0,0,"/sys/a1wFylTxYeD/co_0001/thing/service/property/set",103,"{"method":"thing.service.property.set","id":"220958108","params":{"PowerSwitch_1":1},"version":"1.0.0"}"
-
4.7 上发报文到阿里云
将刚刚下发的 JSON报文,进行一下修改。主题改为上发,变化下开关状态,上发给阿里云。
-
AT
+QMTPUBEX
=
0,0,0,0,
"/sys/a1wFylTxYeD/co_0001/thing/event/property/post",
103
-
-
> {
"method":
"thing.event.property.post",
"id":
"1142523359",
"params":{
"PowerSwitch_1":
0},
"version":
"1.0.0"}
-
OK
-
-
+QMTPUBEX:
0,0,0
查看开关状态,从刚刚的1变为了0,上报成功。
再多发送几次,可以以列表的形式查看。
-
4.8 测试时延
时延测试,基本在100ms左右。算上从APP到云,再从云到设备,也不过几百ms,用户很难察觉,比HTTP方式动辄几s的延时好太多。
5. 总结
EC600S-CN 的MQTT指令支持阿里云、移动OneNET、华为IoT三种云平台,可实现快速接入,AT指令的操作步骤简单,有助于用户快速开发。