无线传感网

将AM22E连接至OneNET平台

作者:陈广
日期:2021-5-8


之前我们已经了解了连接至OneNET平台的基本步骤和流程,上一篇文章使用了软件模拟一个设备连接至OneNET平台,今天我们尝试使用AT指令将AM22E连接至OneNET进行各类操作。

在OneNET中添加一个AM22E设备

首先我们需要在OneNET平台中增加一个AM22E所对应的设备。如下图所示:

接下来要根据该设备的key计算登录密码:

使用AT指令登录OneNET

首先介绍MQTT中关于登录需要使用到的AT指令。

AT+MQTTCFG

该命令配置 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命令释放资源,然后再设置。

AT+MQTTOPEN

连接 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 消息体

AT+MQTTSTAT

该命令查询 MQTT 连接状态。 语法:

查询命令
AT+MQTTSTAT?

响应:
+MQTTSTAT:<stat>
OK

参数说明:
当前连接状态:

  • 0:client 参数未初始化
  • 1:client 参数已初始化
  • 2:和服务器已断开
  • 3:发送 Connect 包,等待接收服务器 ack
  • 4:正在重连服务器
  • 5:和服务器已连接
  • 6:建立 TCP 连接中
  • 7:TCP 连接已建立

AT+MQTTDISC

该命令主动断开连接,并发送 DISCONNECT 包。

语法:

AT+MQTTDISC

登录OneNET

//按下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

该命令订阅消息。

语法:

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>:服务器反馈码:
    • 0x00:订阅成功 QoS 0
    • 0x01:订阅成功 QoS 1
    • 0x02:订阅成功 QoS 2
    • 0x80:失败
  • <subscrible list>:已订阅列表

示例:

AT+MQTTSUB="dev/gsm/u",2
OK
+MQTTSUBACK:2,2,dev/gsm/u

AT+MQTTSUB?
+MQTTSUB:
dev/gsm/u
OK

AT+MQTTPUB

该命令发布消息

语法:

AT+MQTTPUB=<topic>,<qos>,<retain>,<dup>,<msg_len>,<message>

参数说明:

  • <topic>:订阅的主题
  • <qos>:订阅的消息的QoS等级,支持0-2
  • <retain>:服务器是否储存该消息,并向新订阅者发送最新订阅消息,0-1。
  • <dup>:重发标志,0-1。
  • <msg_len> 输入消息类型或长度
    • 0:字符串格式输入
    • 大于等于1:16进制字串长度
  • <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.fx,使用上一篇文章的连接信息连接至mqtt_001设备,打开Subscribe面板,输入如下订阅脚本:

$sys/423266/mqtt_001/cmd/request/+

点击【Subsbcribe】按钮订阅消息,如下图所示:

接下来进入到OneNET平台的设备列表,点击mqtt_001右边的【更多操作】标签下的【下发命令】菜单打开【下发命令】面板,如下所示:

按下图所示下发命令:

加到MQTT.fx,可以发现已经收到平台下发的命令:

使用AM22E开发板订阅

接下来我们尝试使用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来下发命令,从而实现电脑或手机控制开发板的功能。这一块等我制作了新的开发板再学习吧。

;

© 2018 - IOT小分队文章发布系统 v0.3