合宙720开发板连接阿里云MQTT

今天来给大家分享一下720开发板通过AT命令连接阿里云物联网平台的方法,阿里云物联网平台支持很多种连接协议,后台非常强大,可以清楚、直观的了解当前设备的连接状况。
本文主要介绍的是连接、发送部分,阿里云物联网平台还可以实现规则引擎、边缘计算、设备影子等非常强大的功能,感兴趣的小伙伴自行研究下。


首先,我们先来了解一下阿里云物联网平台,这里是官方介绍链接:
https://www.aliyun.com/product/iot-deviceconnect
这是关于设备端开发协议的官方文档:
https://help.aliyun.com/document_detail/30540.html


本教程对应阿里云中“MQTT客户端域名直连”部分,主要是讲解连接域名、设备ID、用户名、密码的计算步骤

一、阿里云平台设备创建

1、登陆阿里云,进入控制台->物联网平台


2、进入设备管理-产品

3、创建产品



关于基础版和高级版可以参考阿里云文档,这里以创建基础版为例

4、添加设备



此处DeviceName建议填写IMEI号,也可填写其他可以保证唯一的号码(比如SN、MAC等)

5、得到设备证书(三元组数据)

这个设备证书里面有三个参数,稍后计算请求信息会用到,非常重要

6、配置Topic类

回到刚刚创建的产品,在消息和通信选项卡下,创建Topic类


Topic类分为发布、订阅、发布和订阅,发布是指可以向平台发送消息,订阅是指可以从平台接收消息,发布和订阅是指发送消息到平台并从平台接收消息(设备发布的消息平台会返回相同信息)

阿里云Topic规则如下:
Topic格式必须以“/”进行分层,区分每个类目。其中前两个类目已经规定好,第一个代表产品标识productKey,第二个${deviceName}通配deviceName。简单来说,Topic类:/pk/${deviceName}/update是具体Topic: /pkTopic格式必须以“/”进行分层,区分每个类目。其中前两个类目已经规定好,第一个代表产品标识productKey,第二个${deviceName}通配deviceName。简单来说,Topic类:/pk/${deviceName}/update是具体Topic: /pk/mydevice/update 或者 /pk/yourdevice/update 的集合

这里我们先添加一个发布和订阅的test Topic类

二、计算请求信息

本教程示范步骤采用的是“MQTT客户端域名直连”方法,如采用“使用HTTPS认证再连接模式”需要先调用HTTP请求获取设备iotId和密钥iotToken,其余步骤基本相同
这里假设我的设备三元组信息如下:
ProductKey: a1hahpgAs3s
DeviceName: test
DeviceSecret: qIpssQEfjxuGoiDHCiQ6PZb1vUJ7SsAM

1、请求域名

${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883
${YourProductKey}请替换为您的产品key。
${YourRegionId}请参考地域和可用区替换为您的Region ID。

目前阿里云物联网平台在国内只有华东2(上海)节点是开放的,对应的Region ID 为 cn-shanghai

因此我的请求域名为:a1hahpgAs3s.iot-as-mqtt.cn-shanghai.aliyuncs.com

2、请求端口

阿里云物联网平台请求端口都为1883,与地域、产品、设备无关

3、请求ID

我的请求ID:test|securemode=3,signmethod=hmacsha1,timestamp=1544257319|

其中test为DeviceName;securemode可选值有2 (TLS直连模式)和3(TCP直连模式)我们这里采用TCP直连模式因此选3;signmethod是加密方法,我们这里采用哈希SHA1加密,官方支持的还有hmacmd5、hmacsha256;timestamp是时间戳,代表当前时间

4、请求username用户名

我的请求用户名:test&a1hahpgAs3s

其中test为DeviceName;a1hahpgAs3s为我的产品ProductKey

5、请求password密码

我的请求密码:c65de7069643b59fc972e8884fede9aaffeada38

请求密码计算方法如下:

(1)拼接签名原文

此处{ {} }中表示对应变量

clientId{ {DeviceName} }deviceName{ {DeviceName} }productKey{ {ProductKey} }timestamp{ {time} }
例如,我的签名原文为:clientIdtestdeviceNametestproductKeya1hahpgAs3stimestamp1544257319

(2)计算签名

签名密钥为DeviceSecret
根据哈希SHA1方法计算得出签名值为c65de7069643b59fc972e8884fede9aaffeada38

签名计算部分比较复杂,因此我用JS开发了一个签名计算工具,地址:
http://lhb.ink/mqtt
工具采用JS计算签名值,所有信息在本地计算不会经过网络,可放心使用

三、合宙720连接MQTT

连接之前,建议将固件版本升级为最新版本

1、连接MQTT

AT+CGREG? 查询注册状态

AT+CGATT? 查看当前GPRS附着状态

AT+CSTT="3GWAP" 设置APN 我这里用的是联通卡,如果是电信卡换成AT+CSTT="CMNET"

AT+CIICR 激活移动场景

AT+CIFSR 查询当前IP

AT+MCONFIG="test|securemode=3,signmethod=hmacsha1,timestamp=1544257319|","test&a1hahpgAs3s","c65de7069643b59fc972e8884fede9aaffeada38" 设置当前连接参数,包括请求客户端ID、用户名、密码,此处请根据实际设备参数填写

AT+MIPSTART="a1hahpgAs3s.iot-as-mqtt.cn-shanghai.aliyuncs.com","1883"设置当前连接参数,包括请求地址、端口,此处请根据实际设备参数填写

AT+MCONNECT=1,600 建立连接会话,此处600为MQTT保活时间

设备端在保活时间间隔内,至少需要发送一次报文,包括ping请求。
如果服务端在保活时间内无法收到任何报文,物联网平台会断开连接,设备端需要进行重连。
设置保活时间的取值,取值范围为30至1200秒,建议取值300秒以上。

AT+MSUB="/a1hahpgAs3s/test/test",0 订阅消息,第一个test为设备DeviceName,第二个test为消息路径(在一、6中创建的,可在物联网平台配置)

AT+MPUB="/a1hahpgAs3s/test/test",0,0,"helloworld"发布消息helloworld到test路径中

AT+MDISCONNECT 关闭MQTT连接

此部分前后关联较强,附我测试的AT命令交互:

16:39:24.390]发→◇AT+CGREG?
[16:39:24.391]收←◆AT+CGREG?
+CGREG: 2,1,”2317”,”0a541706”
OK
[16:39:25.590]发→◇AT+CGATT?
[16:39:25.592]收←◆AT+CGATT?
+CGATT: 1
OK
[16:39:27.048]发→◇AT+CSTT=”3GWAP”
[16:39:27.050]收←◆AT+CSTT=”3GWAP”
OK
[16:39:27.844]发→◇AT+CIICR
[16:39:27.847]收←◆AT+CIICR
[16:39:28.137]收←◆
+CGEV: ME PDN ACT 7
OK
[16:39:29.510]发→◇AT+CIFSR
[16:39:29.513]收←◆
AT+CIFSR
10.69.48.127
[16:39:48.025]收←◆+UPGRADEIND: 0
[16:39:54.611]收←◆+UPGRADEIND: -1002
[16:39:56.309]收←◆
+CGEV: NW MODIFY 5,2
[16:39:56.339]收←◆
+CGEV: NW MODIFY 7,2
[16:41:35.502]发→◇AT+MCONFIG=”test|securemode=3,signmethod=hmacsha1,timestamp=1544257319|”,”test&a1hahpgAs3s”,”c65de7069643b59fc972e8884fede9aaffeada38”
[16:41:35.505]收←◆
AT+MCONFIG=”test|securemode=3,signmethod=hmacsha1,timestamp=1544257319|”,”test&a1hahpgAs3s”,”c65de7069643b59fc972e8884fede9aaffeada38”
OK
[16:41:36.960]发→◇AT+MIPSTART=”a1hahpgAs3s.iot-as-mqtt.cn-shanghai.aliyuncs.com”,”1883”
[16:41:36.962]收←◆AT+MIPSTART=”a1hahpgAs3s.iot-as-mqtt.cn-shanghai.aliyuncs.com”,”1883”
OK
[16:41:37.271]收←◆
CONNECT OK
[16:41:38.519]发→◇AT+MCONNECT=1,600
[16:41:38.522]收←◆AT+MCONNECT=1,600
OK
[16:41:38.720]收←◆
CONNACK OK
[16:41:58.578]发→◇AT+MSUB=”/a1hahpgAs3s/test/test”,0
[16:41:58.582]收←◆AT+MSUB=”/a1hahpgAs3s/test/test”,0
OK
[16:41:58.791]收←◆
SUBACK
[16:42:06.912]发→◇AT+MPUB=”/a1hahpgAs3s/test/test”,0,0,”helloworld”
[16:42:06.915]收←◆AT+MPUB=”/a1hahpgAs3s/test/test”,0,0,”helloworld”
OK
[16:42:07.073]收←◆
+MSUB: “/a1hahpgAs3s/test/test”,10 byte,helloworld
[16:42:17.258]发→◇AT+MDISCONNECT
[16:42:17.261]收←◆
AT+MDISCONNECT
OK
[16:42:19.824]收←◆
CLOSED

注:实际请求请使用根据设备计算的参数进行连接

2、在阿里云后台查看设备连接情况


激活设备:首次连接连接后设备由未激活变为激活状态

3、查看设备日志

内容较长难免出现纰漏,如有错误欢迎批评指正

上次更新 2021-01-28