基础资料
基于Air780E开发板:Air780E文档中心
简介:AT开发
探讨重点
本系列主要探讨MQTT手动接入腾讯云物理网平台的基本操作及手动鉴权步骤、信息订阅及发布的基本原理。
参考阅读:物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤
实现功能
MQTT手动接入腾讯云物理网平台的基本操作及手动鉴权。
硬件准备
Air780E开发板1块,SIM卡1张。
软件版本
Revision: AirM2M_780E_V1108_LTE_AT
任意串口调试工具(本文使用llcom1.1.1.9,波特率9600)
1、新建项目
腾讯云的物联网开发平台登录 - 腾讯云
2、新建产品
点击项目名称,新建产品,名称:智能开关(1路),自定。其他参数选择如下图(这个产品已经建立过了,新建可以参考此参数)。通信方式选2G/3G/4G,其他默认。点击确定。
3、添加设备
点进我们刚新建的产品的链接,设备调试页面,点击新建设备。
填写设备名称,建议用设备imei等唯一标识,
记录设备信息:
4、接入方式选择
MQTT 协议支持通过设备证书和密钥签名两种方式接入物联网通信平台,本文介绍密钥签名方式。
接入参数如下所示:
密钥认证 |
MQTT 服务器连接地址与证书认证一致;端口:1883 |
· KeepAlive:保持连接的时间,取值范围为0-900s; |
5、官方密钥认证设备接入指引
username 字段的格式为:
${productId}${deviceName};${sdkappid};${connid};${expiry}
注意:${} 表示变量,并非特定的拼接符号。
其中各字段含义如下:
3.用 base64 对设备密钥进行解码得到原始密钥 raw_key。
4.用第3步生成的 raw_key,通过 HMAC-SHA1 或者 HMAC-SHA256 算法对 username 生成一串摘要,简称 Token。
按照物联网通信约束生成 password 字段,password 字段格式为:
password 字段格式为:
${token};hmac 签名方法
其中 hmac 签名方法字段填写第三步用到的摘要算法,可选的值有 hmacsha256 和 hmacsha1。
6、示例,采用Python实现,HMAC-SHA1 算法。
涉及隐私信息已局部替换为*号,请按各自注册信息替换。
import base64
import hashlib
import hmac
import random
import string
import time
import sys
# 生成指定长度的随机字符串
def RandomConnid(length):
return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(length))
# 生成接入物联网通信平台需要的各参数
def IotHmac(productID, devicename, devicePsk):
# 1. 生成 connid 为一个随机字符串,方便后台定位问题
connid = RandomConnid(5)
# 2. 生成过期时间,表示签名的过期时间,从纪元1970年1月1日 00:00:00 UTC 时间至今秒数的 UTF8 字符串
expiry = int(time.time()) + 60 * 60
# 3. 生成 MQTT 的 clientid 部分, 格式为 ${productid}${devicename}
clientid = "{}{}".format(productID, devicename)
# 4. 生成 MQTT 的 username 部分, 格式为 ${clientid};${sdkappid};${connid};${expiry}
username = "{};12010126;{};{}".format(clientid, connid, expiry)
# 5. 对 username 进行签名,生成token
secret_key = devicePsk.encode('utf-8') # convert to bytes
data_to_sign = username.encode('utf-8') # convert to bytes
secret_key = base64.b64decode(secret_key) # this is still bytes
#用第3步生成的 raw_key,通过 HMAC-SHA1 或者 HMAC-SHA256 算法对 username 生成一串摘要,简称 Token。
token = hmac.new(secret_key, data_to_sign, digestmod=hashlib.sha1).hexdigest()
# 6. 根据物联网通信平台规则生成 password 字段
password = "{};{}".format(token, "hmacsha1")
return {
"clientid" : clientid,
"username" : username,
"password" : password
}
if __name__ == '__main__':
productID='XJTD6I****' //按自己的注册信息替换
devicename='861551056*****' //按自己的注册信息替换
devicePsk='lgflte6w5jy/Zy********==' //按自己的注册信息替换
loc=productID +".iotcloud.tencentdevices.com"+":1883"
access = IotHmac(productID, devicename, devicePsk)
print('认证参数为:',access)
print('链接地址为:', loc)
结果输出:
认证参数为: {'clientid': 'XJTD6I****861551056*****', 'username': 'XJTD6I****861551056*****;12010126;YERH1;1670553717', 'password': '466b5ff7515842f*******51e2768124de1eafc3;hmacsha1'}
链接地址为: XJTD6I****.iotcloud.tencentdevices.com:1883
7、AT手动连接并订阅topic示例:
[2022/12/09 11:07:52.1671] ← AT+MCONFIG="XJTD6IOCPD8615510*******,"XJTD6IOCPD86155105*******;12010126;WRY6T;1670558319","fb525bba65d246d1a9597560f573277c86661766;hmacsha1"
[2022/12/09 11:07:52.2760] → AT+MCONFIG="XJTD6IOCPD86155105******","XJTD6IOCPD8615510*******;12010126;WRY6T;1670558319","fb525bba65d246d1a9597560f573277c86661766;hmacsha1"
OK
[2022/12/09 11:07:57.1502] ← AT+MIPSTART="XJTD6IOCPD.iotcloud.tencentdevices.com",1883
[2022/12/09 11:07:57.2562] → AT+MIPSTART="XJTD6IOCPD.iotcloud.tencentdevices.com",1883
OK
[2022/12/09 11:07:57.8283] →
CONNECT OK
[2022/12/09 11:08:00.6623] ← AT+MCONNECT=1,240
[2022/12/09 11:08:00.7678] → AT+MCONNECT=1,240
OK
[2022/12/09 11:08:00.9436] →
CONNACK OK
[2022/12/09 11:08:06.6297] ← AT+MSUB="$thing/down/property/XJTD6*****/861551056******",0
[2022/12/09 11:08:06.7359] → AT+MSUB="$thing/down/property/XJTD6*****/86155105*******",0
OK
[2022/12/09 11:08:06.8859] →
SUBACK