作者:陈广
日期:2021-5-8
之前我们已经了解了连接至OneNET平台的基本步骤和流程,上一篇文章使用了软件模拟一个设备连接至OneNET平台,今天我们尝试使用AT指令将AM22E连接至OneNET进行各类操作。
首先我们需要在OneNET平台中增加一个AM22E所对应的设备。如下图所示:
接下来要根据该设备的key计算登录密码:
首先介绍MQTT中关于登录需要使用到的AT指令。
该命令配置 MQTT 连接参数。
语法:
AT+MQTTCFG=<host>,<port>,<id>,<keepAlive>,<user>,<passwd>,<clean>[,<encrypt>]
参数说明:
<host>
:mqtt 服务器 IP 或域名地址。<port>
:mqtt 服务器端口<id>
:客户端ID<keepalive>
:keepalive 时间<user>
:用户名(OneNET中的设备名称)<passwd>
:使用设备key计算的密码<clean>
:是否删除session,0表示不删除,1表示删除<encrypt>
:是否开启TLS加密(暂不支持),所以此值设备为0或不写注意: 使用
AT+MQTTCFG
设置连接参数后,在模组没有重启的情况下,如果再次调用此命令进行重新设置,则会返回失败。如果想重新设置,需要首先调用AT+MQTTDEL
命令释放资源,然后再设置。
连接 MQTT 服务器。
语法:
AT+MQTTOPEN=<usrFlag>,<pwdFlag>,<willFlag>,<willRetain>,<willQos>,<will-topic>,<will-mesg>
参数说明:
usrFlag
:该标志位被设置表示一个客户端需使用用户名。<pwdFlag>
:该标志位被设置表示一个客户端需使用密码<willFlag>
:被设置为 1 后,当服务器与客户端通信遇到 I/O 错误或客户端没有在一定时间计划内保持连接时,会发布一个message。服务器从客户端接收到 DISCONNECT 消息时,并不会触发服务器发送一条 Will message。<willRetain>
:当客户端意外的断开连接时,服务器是否应该保留被服务器发布的 Will message。<willQos>
:指定要发布的消息使用 Qos 级别。<will-topic>
:Will message 的主题名称<will-mesg>
:will 消息体该命令查询 MQTT 连接状态。 语法:
查询命令
AT+MQTTSTAT?
响应:
+MQTTSTAT:<stat>
OK
参数说明:
该命令主动断开连接,并发送 DISCONNECT 包。
语法:
AT+MQTTDISC
//按下PWR键后模块正常启动显示
*ATREADY: 1
+CFUN: 1
+CPIN: READY
>>>>>>>>>> AT
AT
OK
>>>>>>>>>> ATE0 //关闭回响
ATE0
OK
+IP: 100.89.175.131 //成功连上网络
>>>>>>>>>> AT+CMSYSCTRL=0,1 //打开浅睡眠指示
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1 //打开深度睡眠指示
OK
//设置登录参数
>>>>>>>>>> AT+MQTTCFG="mqtts.heclouds.com",1883,"AM22E_01",60,"423266","version=2018-10-31&res=products%2F423266%2Fdevices%2FAM22E_01&et=1735660800&method=sha1&sign=By6iFr6jEdz6%2BiI9Tlz2h%2B9L%2FTo%3D",1,0
OK
>>>>>>>>>> AT+MQTTOPEN=1,1,0,0,0,"","" //连接服务器
OK
+MQTTOPEN: OK //表示连接成功
>>>>>>>>>> AT+MQTTSTAT? //查询OneNET平台连接状态
+MQTTSTAT: 5 //表示和OneNET服务器已连接
OK
现在在OneNET平台上查看设备状态,可以发现设备已经处于在线状态。
接下来可以输入以下命令关闭连接:
>>>>>>>>>> AT+MQTTDISC //关闭连接
OK
+MQTTDISC: OK //表明断开连接成功
首先介绍AT指令。
该命令订阅消息。
语法:
AT+MQTTSUB=<topic>,<qos>[,<index>]
响应:
OK
如果收到服务器订阅 ACK 信息,会收到 URC
+MQTTSUBACK: <packId>,<code>,<topic>
读取命令
AT+MQTTSUB?
响应:
+MQTTSUB:
<subscrible list>
参数说明:
<topic>
:订阅的主题<qos>
:订阅的消息交付质量等级,0-2。(OneNET平台文档上标明了不支持QoS 2)<packId>
:数据包Id<Index>
:接收到 topic 发布信息时的操作索引,目前仅支持 0,从 AT 口输出发布信息。<code>
:服务器反馈码:
<subscrible list>
:已订阅列表示例:
AT+MQTTSUB="dev/gsm/u",2
OK
+MQTTSUBACK:2,2,dev/gsm/u
AT+MQTTSUB?
+MQTTSUB:
dev/gsm/u
OK
该命令发布消息
语法:
AT+MQTTPUB=<topic>,<qos>,<retain>,<dup>,<msg_len>,<message>
参数说明:
<topic>
:订阅的主题<qos>
:订阅的消息的QoS等级,支持0-2<retain>
:服务器是否储存该消息,并向新订阅者发送最新订阅消息,0-1。<dup>
:重发标志,0-1。<msg_len>
输入消息类型或长度
<message>
:消息内容示例:
AT+MQTTPUB="dev/gsm/u",2,1,0,0,"update message"
OK
+MQTTPUBREC:10,0
+MQTTPUBCOMP:10,0
AT+MQTTPUB="dev/gsm/u",2,1,0,2,"1890"
OK
+MQTTPUBREC:11,0
+MQTTPUBCOMP:11,0
*ATREADY: 1
+CFUN: 1
+CPIN: READY
>>>>>>>>>> AT
AT
OK
+IP: 100.119.138.235
>>>>>>>>>> ATE0
ATE0
OK
>>>>>>>>>> AT+CMSYSCTRL=0,1
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1
OK
>>>>>>>>>> AT+SM=LOCK //关闭睡眠模式
OK
//配置连接参数
>>>>>>>>>> AT+MQTTCFG="mqtts.heclouds.com",1883,"AM22E_01",60,"423266","version=2018-10-31&res=products%2F423266%2Fdevices%2FAM22E_01&et=1735660800&method=sha1&sign=By6iFr6jEdz6%2BiI9Tlz2h%2B9L%2FTo%3D",1,0
OK
>>>>>>>>>> AT+MQTTOPEN=1,1,0,0,0,"","" //连接OneNET
OK
+MQTTOPEN: OK //表明连接成功
>>>>>>>>>> AT+MQTTSUB="$sys/423266/AM22E_01/dp/post/json/+",0 //订阅消息
OK
+MQTTSUBACK: 1,0,$sys/423266/AM22E_01/dp/post/json/+ //表明订阅成功
//发布 QoS 0 消息
>>>>>>>>>> AT+MQTTPUB="$sys/423266/AM22E_01/dp/post/json",0,0,0,0,"{'id': 001,'dp': {'temperatrue': [{'v': 30,}],'power': [{'v': 4.5,}]}}"
OK
+MQTTPUBLISH: 0,0,0,0,$sys/423266/AM22E_01/dp/post/json/accepted,8,{"id":1} //收到之前订阅的消息
//发布 QoS 1 消息
>>>>>>>>>> AT+MQTTPUB="$sys/423266/AM22E_01/dp/post/json",1,0,0,0,"{'id': 011,'dp': {'temperatrue': [{'v': 30,}],'power': [{'v': 4.5,}]}}"
OK
+MQTTPUBACK: 3,0 //QoS 1 的消息回复
+MQTTPUBLISH: 0,0,0,0,$sys/423266/AM22E_01/dp/post/json/accepted,9,{"id":11} //收到订阅的消息
//发布 QoS 1 消息
>>>>>>>>>> AT+MQTTPUB="$sys/423266/AM22E_01/dp/post/json",1,0,0,0,"{'id': 012,'dp': {'temperatrue': [{'v': 23,}],'power': [{'v': 4.5,}]}}"
OK
+MQTTPUBACK: 4,0 //QoS 1 的消息回复
+MQTTPUBLISH: 0,0,0,0,$sys/423266/AM22E_01/dp/post/json/accepted,9,{"id":12} //收到订阅的消息
>>>>>>>>>> AT+MQTTDISC //断开连接
OK
+MQTTDISC: OK
OneNET平台可以下发命令,让我们能够在远程操控IOT设备。平台下发的命令需要订阅才能接收到,系统向设备下发命令的topicc规则如下:
$sys/{pid}/{device-name}/cmd/request/{cmdid}
首先使用MQTT.fx来试验这个功能。打开MQTT.fx,使用上一篇文章的连接信息连接至mqtt_001设备,打开Subscribe面板,输入如下订阅脚本:
$sys/423266/mqtt_001/cmd/request/+
点击【Subsbcribe】按钮订阅消息,如下图所示:
接下来进入到OneNET平台的设备列表,点击mqtt_001右边的【更多操作】标签下的【下发命令】菜单打开【下发命令】面板,如下所示:
按下图所示下发命令:
加到MQTT.fx,可以发现已经收到平台下发的命令:
接下来我们尝试使用AM22E开发板实现上一小节相同的功能。
启动开发板,输入如下命令:
*ATREADY: 1
+CFUN: 1
+CPIN: READY
>>>>>>>>>> ATE0
ATE0
OK
>>>>>>>>>> AT+CMSYSCTRL=0,1
OK
>>>>>>>>>> AT+CMSYSCTRL=1,1
OK
+IP: 100.101.252.173 //表明已经连上网络
>>>>>>>>>> AT+SM=LOCK //关闭睡眠模式
OK
//设置连接OneNET的参数
>>>>>>>>>> AT+MQTTCFG="mqtts.heclouds.com",1883,"AM22E_01",60,"423266","version=2018-10-31&res=products%2F423266%2Fdevices%2FAM22E_01&et=1735660800&method=sha1&sign=By6iFr6jEdz6%2BiI9Tlz2h%2B9L%2FTo%3D",1,0
OK
>>>>>>>>>> AT+MQTTOPEN=1,1,0,0,0,"","" //连接OneNET平台
OK
+MQTTOPEN: OK //表明连接成功
>>>>>>>>>> AT+MQTTSUB="$sys/423266/AM22E_01/cmd/request/+",0 //订阅下发命令消息
OK
+MQTTSUBACK: 1,0,$sys/423266/AM22E_01/cmd/request/+ //收到这条消息表明订阅成功
接下来,登录OneNET平台,进入到【设备列表】,尝试在AM22E_01设备上下发命令,观察设备开发板串口数据,可以看到收到了以下数据:
+MQTTPUBLISH: 0,0,0,0,$sys/423266/AM22E_01/cmd/request/8f24a3e3-3852-4bef-b2d7-ad09d047c3f6,6,123456
+MQTTPUBLISH: 0,0,0,0,$sys/423266/AM22E_01/cmd/request/7adf25dd-52f6-438d-ba76-44bbbeb42e54,7,abcdefg
表明在开发板上收到了平台下发的命令。实际上,我们也可以使用HTTP协议在电脑端调用平台API来下发命令,从而实现电脑或手机控制开发板的功能。这一块等我制作了新的开发板再学习吧。
;