基础资料
基于Air780E开发板:Air780E文档中心
简介:AT开发
探讨重点
本系列主要探讨MQTT手动接入腾讯云物理网平台的基本操作及手动鉴权步骤、信息订阅及发布的基本原理。
参考阅读:物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤
实现功能
MQTT手动接入腾讯云物理网平台的基本操作及手动鉴权。
硬件准备
Air780E开发板1块,SIM卡1张。
软件版本
Revision: AirM2M_780E_V1108_LTE_AT
任意串口调试工具(本文使用llcom1.1.1.9,波特率9600)
1、新建项目
阿里云物联网平台入口
DeviceName可以自定义。
这里采用sim卡的IMEI(8615510564*****)作为DeviceName,便于后期维护。
设备的证书信息
1. MQTT连接官方说明:
连接参数说明如下,本文主要从一机一密注册认证的方式进行介绍。
2、配置文件基本模式
根据物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤,首先要确定MQTT连接的配置文件,根据,官方文档,可知,基本模式为:
AT+MCONFIG="clientId|securemode=2,signmethod=加密方式,timestamp=时间戳|","DeviceName&ProductKey","passwd"
而passwd是由形如:
'clientIdi0m26pL****.861551056*****deviceName8615510564*****productKeyi0m26p*****timestamp16706417*****'的字符串通过signmethod指定的加密方式计算而的,DeviceSecret作为计算的key。
方式1:采用平台给定的MQTT连接参数
平台给定的参数中的clientId采用'clientId'+'.'+'deviceName'组合的方式确定,hmac_sha256加密方式。可以直接使用。需要注意的是,passwd大小写系统都能够认可。
按基本模式,组合出的配置参数,之后按步骤认证后建立连接。
方式2:采用平台给定的MQTT连接工具计算相关参数
平台帮助文档中给出了javascript编写password工具(MQTT_Password)。
支持hmacsha1和hmacmd5方法。这里可以采用产品名称作为clientId,该工具能够简易的计算出主要的连接参数,但该工具的时间戳字段不能够自由修改。
方式3:示例,采用Python实现连接参数生成
参考博文:python3 HMAC/SHA256/BASE64/MD5
import time
import hmac
import hashlib
#1、时间戳生成及基本注册数据
timestamp=int(time.time()*1000)+60*60 #60*60有效时间3600s,可按需延长
pk = "i0m26pL****"
dn = "861551056*****"
ds = "25dacc9ca202cf11ecda2541d7*****"
ts = timestamp
ci = "air780e"
sm1 = "hmacsha1" #加密方式选择,不参与计算
sm5 = "hmacmd5"
sm6 = "hmacsha256"
#2、passwd计算字符串生成
contentStr='clientId'+ci+'deviceName'+dn+'productKey'+pk+'timestamp'+str(ts)
#print(contentStr)
def hmac_sha256(key, value):
"""
hmacsha256加密
return:加密结果转成16进制字符串形式
"""
message = value.encode('utf-8')
return hmac.new(key.encode('utf-8'), message, digestmod=hashlib.sha256).hexdigest()
def hmac_md5(key, value):
"""
hmacmd5加密
return:加密结果转成16进制字符串形式
"""
message = value.encode('utf-8')
return hmac.new(key.encode('utf-8'), message, digestmod=hashlib.md5).hexdigest()
def hamc_sha1(key,value):
message = value.encode('utf-8') # 加密内容
# key = key.encode('utf-8') # 加密的key
return hmac.new(key.encode('utf-8'), message, digestmod=hashlib.sha1).hexdigest()
#3、不同加密方式下的passwd计算及AT+MCONFIG参数生成
#官方sign程序生成的passwd全部大写,实测大小写均可被系统识别,不影响鉴权。
#3.1 hmac_md5
print("hamc_md5:",hmac_md5(ds, contentStr).upper())
print("AT+MCONFIG=",'"'+ci + "|securemode=2,signmethod=" + sm5 + ",timestamp=" + str(ts) + "|\""+",\""+dn + "&" + pk+'","'+hmac_md5(ds, contentStr).upper()+'"')
#3.2 hamc_sha1
print("hamc_sha1",hamc_sha1(ds, contentStr).upper())
print("AT+MCONFIG=",'"'+ci + "|securemode=2,signmethod=" + sm1 + ",timestamp=" + str(ts) + "|\""+",\""+dn + "&" + pk+'","'+hamc_sha1(ds, contentStr).upper()+'"')
#3.2 云平台MQTT参数的验证
ci= pk+"."+dn
ts=1670641794482
contentStr='clientId'+ci+'deviceName'+dn+'productKey'+pk+'timestamp'+str(ts)
print("hamc_sha256",hmac_sha256(ds, contentStr).upper())
print("AT+MCONFIG=",'"'+ci + "|securemode=2,signmethod=" + sm6 + ",timestamp=" + str(ts) + "|\""+",\""+dn + "&" + pk+'","'+hmac_sha256(ds, contentStr).upper()+'"')
3、一型一密AT方式连接
一型一密与一机一密的主要区别在于第一次连接的时候需要根据协议请求秘钥,连接前在阿里云打开动态注册开关。具体连接方式请参考官方开发者文档。
4、接入云平台及订阅、发布主题示例
←代表串口工具发送指令,→代表串口工具接收到的指令或信息。
基本连接情况确定程序见物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤。
#接入云平台参数指定
[2022/12/10 18:20:08.9715] ← AT+MCONFIG= "air780e|securemode=2,signmethod=hmacsha1,timestamp=16706450*****|","861551056420391&i0m26p*****","5B4117DE87575D98D9D12364235EB76C********"
[2022/12/10 18:20:09.0793] → AT+MCONFIG= "air780e|securemode=2,signmethod=hmacsha1,timestamp=16706450*****|","861551056420391&i0m26******","5B4117DE87575D98D9D12364235EB76C4*******F"
OK
[2022/12/10 18:20:10.2153] ← AT+MIPSTART="iot-06z00gm80emf6to.mqtt.iothub.aliyuncs.com",1883
[2022/12/10 18:20:10.3217] → AT+MIPSTART="iot-06z00gm80emf6to.mqtt.iothub.aliyuncs.com",1883
OK
[2022/12/10 18:20:10.6112] →
CONNECT OK
[2022/12/10 18:20:12.4242] ← AT+MCONNECT=1,120
[2022/12/10 18:20:12.5412] → AT+MCONNECT=1,120
OK
[2022/12/10 18:20:12.7432] →
CONNACK OK
[2022/12/10 18:20:15.4216] ← AT+MSUB="/ext/ntp/i0m26p*****/8615510564*****/response",0
[2022/12/10 18:20:15.5267] → AT+MSUB="/ext/ntp/i0m26****/861551056*****/response",0
OK
[2022/12/10 18:20:15.6557] →
SUBACK
#发布NTP时间订阅
#开发板规则,AT命令中"(双引号)应由\22替代。
#(由AT+MPUB="/ext/ntp/i0m26pLx83v/8615510564*****/request",0,0,{"deviceSendTime":"1670145990689"} 转写得到)
[2022/12/10 18:20:16.7899] ← AT+MPUB="/ext/ntp/i0m26p****/8615510564****1/request",0,0,{\22deviceSendTime\22:\221670145990689\22}
[2022/12/10 18:20:16.8949] → AT+MPUB="/ext/ntp/i0m26p*****/861551056*****1/request",0,0,{\22deviceSendTime\22:\221670145990689\22}
OK
[2022/12/10 18:20:17.0273] →
+MSUB: "/ext/ntp/i0m26p*****/861551056*****1/response",100 byte,{"deviceSendTime":"1670145990689","serverSendTime":"1670667616579","serverRecvTime":"1670667616579"}