概述
目录
基础资料
探讨重点
实现功能
硬件准备
软件版本
一、创建产品
1.1在onenet上创建产品
1.2创建设备
查看onenet接入协议
二、设备安全认证
1. 鉴权参数
2. Token算法
3、sign算法
示例如下:
4、参数编码
5、Token生成
Python版Token算法实现:
6. Token生成工具
三、连接onenet
3.1 MQTT直连onenet
初始化步骤参考阅读:
3.2 发布与订阅消息
发布
基础资料
基于Air780E开发板:Air780E文档中心
简介:AT开发
探讨重点
本系列主要探讨MQTT手动接入OneNET(中国移动物联网开放平台)的基本操作及手动鉴权步骤、信息订阅及发布的基本原理。
参考阅读:物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤
实现功能
MQTT手动接入OneNET(中国移动物联网开放平台)的基本操作及手动鉴权。
硬件准备
Air780E开发板1块,SIM卡1张。
软件版本
Revision: AirM2M_780E_V1108_LTE_AT
任意串口调试工具(本文使用llcom1.1.1.9,波特率9600)
一、创建产品
1.1在onenet上创建产品
https://open.iot.10086.cn/
产品名称、所属省市、产品类别根据自己需求填写,物模型没有要求可以选择标准物模型
节点类型选择直连设备、接入协议选择MQTT、数据协议固定为OneJson、联网方式选择蜂窝
1.2创建设备
填入设备名,选择产品,这里我使用的是模块的IMEI或IMSI来做设备名称
查看onenet接入协议
MQTT设备连接_开发者文档_OneNET (10086.cn))
可以看到,登入onenet时,mqtt的clientID、username和password都有指定
clientId即为刚才创建的设备名称
username为创建的产品ID
password是需要经过加密计算得来的鉴权token
二、设备安全认证
1. 鉴权参数
设备鉴权参数(鉴权三元组)如下:
参数 | 描述 |
---|---|
ProductId | 产品ID,平台生成唯一ID |
DeviceName | 设备名称 |
Token | 鉴权token |
2. Token算法
Token由多个参数构成,如下表:
名称 | 类型 | 是否必须 | 参数说明 | 参数示例 |
---|---|---|---|---|
version | string | 是 | 参数组版本号,日期格式,目前仅支持"2018-10-31" | 2018-10-31 |
res | string | 是 | 访问资源 resource格式为:products/{产品id}/devices/{设备名字} | 'products/ft6uTZ****/devices/4600112503*****' |
et | int | 是 | 访问过期时间 expirationTime,单位秒,unix时间当一次访问参数中的et时间小于当前时间时,平台会认为访问参数过期从而拒绝该访问 | '1670846247510'表示:北京时间 2022-12-12 19:57:27 |
method | string | 是 | 签名方法 signatureMethod支持hmacmd5、hmacsha1、hmacsha256 | sha1(代表使用hmacsha1算法) |
sign | string | 是 | 签名结果字符串signature | sign_Device:ah4jKmujuN11+Edt7*****==sign_Product:lwsm/g+PrJZz/WbpP*****== |
3、sign算法
参数sign的生成算法为:
sign = base64(hmac_<method>(base64decode(key), utf-8(StringForSignature)))
其中: Key为OneNET为资源分配的访问密钥(产品级、设备级均可),其作为签名算法参数之一参与签名计算,为保证访问安全,请妥善保管 Key参与计算前应先进行base64decode操作 用于计算签名的字符串 StringForSignature的组成顺序按照参数名称进行字符串排序,以'n'作为参数分隔,当前版本中按照如下顺序进行排序:et、method、res、version StringForSignature组成示例如下:
StringForSignature = et + 'n' + method + 'n' + res+ 'n' + version
注意:每个参数均为key=value格式组成,但是仅参数中的value参与计算签名的字符串 StringForSignature的组成。
示例:'1670846247510nmd5nproducts/ft6uTZ****/devices/4600112503*****
2018-10-31'
用于计算签名的字符串StringForSignature为(按照et、method、res、version的顺序)
计算出sign后,将每个参数均采用key=value的形式表示,并用'&'作为分隔符,
示例如下:
'version=2018-10-31&res=products%2Fft6uTZ****%2Fdevices%2F4600112503*****&et=1670846247510&method=md5&sign=ah4jKmujuN11%2BEdt7*****%3D%3D'
4、参数编码
Token中key=value的形式的value部分需要经过URL编码,可使用quote或urlencode。需要进行编码的特殊符号如下
序号 | 特殊符号 | URL编码 |
---|---|---|
1 | + | %2B |
2 | 空格 | %20 |
3 | / | %2F |
4 | ? | %3F |
5 | % | %25 |
6 | # | %23 |
7 | & | %26 |
8 | = | %3D |
编码后,上例中实际传输Token为:
version=2018-10-31&res=products%2F123123%2Fdevices%2Fche1&et=1537255523&method=sha1&sign=ZjA1NzZlMmMxYzIOTg3MjBzNjYTI2MjA4Yw%3D
5、Token生成
需要注意:官方文档中的Python算法示例有误,需修改后使用,注意对照文档方法自行甄别。
详见:OneNET - 中国移动物联网开放平台
基本步骤思路:将平台生成的ProductKey或DeviceKey重新编码为base64格式,按文档规则生成StringForSignature,之后就行选定算法的计算,得到sign。最后生成MQTT的AT+MCONFIG连接配置。
Python版Token算法实现:
import time
import hmac
import hashlib
import base64
from urllib.parse import urlencode
def hmac_sha256(key, value):
"""
hmacsha256加密
return:加密结果转成16进制字符串形式
"""
message = value.encode('utf-8') # 加密内容
sign_b=hmac.new(key, message, digestmod=hashlib.sha256)
sign = base64.b64encode(sign_b.digest()).decode('UTF-8')
return sign
def hmac_sha1(key, value):
"""
hmacsha1加密
return:加密结果转成16进制字符串形式
"""
message = value.encode('utf-8') # 加密内容
sign_b=hmac.new(key, message, digestmod=hashlib.sha1)
sign = base64.b64encode(sign_b.digest()).decode('UTF-8')
return sign
def hmac_md5(key,value):
message = value.encode('utf-8')
sign_b=hmac.new(key, message, digestmod=hashlib.md5).digest()
sign_t = base64.b64encode(sign_b)
sign=sign_t.decode('UTF-8')
return sign
#1、时间戳生成及基本注册数据
et=str(int(time.time()*1000)+60*60) #60*60有效时间3600s,可按需延长
version = "2018-10-31"
ProductId = "ft6uTZ****"
ProductKey=base64.b64decode("YRHzukQHuV0md3djYjiwT0zWQqB1m5qxRENkB*****=")
DeviceName = "4600112503*****"
DeviceKey =base64.b64decode("XKY7QG/xOJRjEbySZkYTdOjXnxJukxf2ObHoi/*****=")
sm1 = "sha1" #加密方式选择,不参与计算
sm5 = "md5"
sm6 = "sha256"
#2、res及StringForSignature组成
res = "products"+"/"+ProductId+"/"+"devices"+"/"+DeviceName
StringForSignature =str(et) + "n" + sm5+ "n" + res+ "n" + version
#3、sign鉴权计算
sign_Product=hmac_md5(ProductKey, StringForSignature)
sign_Device=hmac_md5(DeviceKey, StringForSignature)
#4、 token参数拼接
token_Product=urlencode([('version',version),('res',res),('et',et),('method',sm5),('sign',sign_Product)])
token_Device=urlencode([('version',version),('res',res),('et',et),('method',sm5),('sign',sign_Device)])
#5、MQTT的AT+MCONFIG连接配置生成
print('AT+MCONFIG="'+DeviceName+'","'+ProductId+'","'+token_Product+'"')
print('AT+MCONFIG="'+DeviceName+'","'+ProductId+'","'+token_Device+'"')
6. Token生成工具
为便于开发者开发,平台提供Token生成工具(点击下载)
-
打开生成工具 token.exe
填写对应参数,点击generate
-
生成Token如下:
三、连接onenet
3.1 MQTT直连onenet
初始化步骤参考阅读:
物联网模组AT命令接入云平台(1)-MQTT基本原理及步骤
采用产品级:
← AT+MCONFIG="4600112503*****","ft6uTZ****","version=2018-10-31&res=products%2Fft6uTZ****%2Fdevices%2F4600112503*****&et=1670846247510&method=md5&sign=lwsm%2Fg%2BPrJZz%2FWbpP*****%3D%3D"
或者采用设备级参数:
← AT+MCONFIG="4600112503*****","ft6uTZ****","version=2018-10-31&res=products%2Fft6uTZ****%2Fdevices%2F4600112503*****&et=1670846247510&method=md5&sign=ah4jKmujuN11%2BEdt7*****%3D%3D"
← AT+MIPSTART="studio-mqtt.heclouds.com",1883
→ AT+MIPSTART="studio-mqtt.heclouds.com",1883
OK
→
CONNECT OK
← AT+MCONNECT=1,120
→ AT+MCONNECT=1,120
OK
→
CONNACK OK
可以从平台上看到设备已经在线了
3.2 发布与订阅消息
onenet studio有固定的通信TOPIC,可以到官网查看,这里演示下设备属性上报与响应的主题
通信主题_开发者文档_OneNET (10086.cn)
订阅
[2022/12/12 19:45:16.9790] ← AT+MSUB="$sys/ft6uTZ****/4600112503*****/thing/property/post/reply",0
[2022/12/12 19:45:17.0845] → AT+MSUB="$sys/ft6uTZ****/4600112503*****/thing/property/post/reply",0OK
[2022/12/12 19:45:17.2683] → SUBACK
发布
向设备上报属性的主题发布消息,消息携带设备的属性,不同的产品具有不同的属性,可以在设备物模型处查看
例如:在文章开始创建的产品具有如下图所示的属性
温度、湿度和地理位置
[2022/12/12 19:45:21.7628] ← AT+MPUB="$sys/ft6uTZ****/4600112503*****/thing/property/post",0,0,"{22id22:2212522,22params22:{22CurrentTemperature22:{22value22:-25.0}}}"
[2022/12/12 19:45:21.8729] → AT+MPUB="$sys/ft6uTZ****/4600112503*****/thing/property/post",0,0,"{22id22:2212522,22params22:{22CurrentTemperature22:{22value22:-25.0}}}"OK
[2022/12/12 19:45:22.4680] → +MSUB: "$sys/ft6uTZ****/4600112503*****/thing/property/post/reply",39 byte,{"id":"125","code":200,"msg":"success"}
可以看到平台已经有数据更
最后
以上就是贤惠蜡烛为你收集整理的Air780E|移动|OneNET|AT命令|物联网|三元组|鉴权|算法|密钥生成|(5)-OneNET(中国移动物联网开放平台)手动接入步骤一、创建产品三、连接onenet的全部内容,希望文章能够帮你解决Air780E|移动|OneNET|AT命令|物联网|三元组|鉴权|算法|密钥生成|(5)-OneNET(中国移动物联网开放平台)手动接入步骤一、创建产品三、连接onenet所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复