Python正常进行mqtt相关开发,使用paho-mqtt模块(需要了解的可以看我另一篇Python快速实现MQTT双向订阅发布),需要参数如:name、clientId、host、port、username、password。 但在阿里云物联网网关开发时,一机一密型直接使用productKey、deviceName、deviceSecret进行开发(需要了解的可以看完另一篇博客Python对阿里云物联网MQTT设备接入端开发)。 本文从阿里云源码解析,将阿里云一机一密型中的配置解析出常规的配置信息。 用处在于如果没有设备网关,可以将数据解析后,使用MQTT桌面平台,填入常规mqtt配置信息,进而和阿里云物联网平台进行通信,进行数据发送,模拟、测试。
1. 先上代码
import sys
import time
import hmac
import hashlib
options = {
'productKey': 'your productKey',
'deviceName': 'your deviceName',
'deviceSecret': 'your deviceSecret',
'port': 1883,
'host': 'iot-as-mqtt.cn-shanghai.aliyuncs.com'
}
if sys.version > '3':
PY3 = True
else:
PY3 = False
def get_client_id(client_id, secure_mode=2, sign_method='hmacsha1'):
"""
获取加密后id
:param client_id:
:param secure_mode:
:param sign_method:
:return:
"""
ts = str(int(time.time()))
return client_id + '|securemode=' + str(secure_mode) + ',signmethod=' + sign_method + ',timestamp=' + ts + '|'
def get_sort_keys(product_key, device_name, client_id):
"""
key排序
:param product_key: 产品key
:param device_name: 设备名称
:param client_id: 客户id
:return:
"""
ts = str(int(time.time()))
d = {'productKey': product_key, 'deviceName': device_name,
'timestamp': ts, 'clientId': client_id}
sort_d = [(k, d[k]) for k in sorted(d.keys())]
content = ''
for i in sort_d:
content += str(i[0])
content += str(i[1])
return content
def create_signature(secret_key, text, sign_method='hmacsha1'):
"""
生成签名
:param secret_key:
:param text:
:param sign_method:
:return:
"""
if PY3:
content_to_sign = bytes(text, 'utf-8')
secret_key = bytes(secret_key, 'utf-8')
else:
content_to_sign = text.encode('utf-8')
if sign_method == 'hmacsha1':
hashed = hmac.new(secret_key, content_to_sign, hashlib.sha1)
elif sign_method == 'hmacmd5':
hashed = hmac.new(secret_key, content_to_sign, hashlib.md5)
return hashed.hexdigest().upper()
if __name__ == '__main__':
client_id = 'iot_client'
mqtt_client_id = get_client_id(client_id, 3, 'hmacsha1')
user_name = options['deviceName'] + '&' + options['productKey']
ordered_keys = get_sort_keys(options['productKey'], options['deviceName'], client_id)
password = create_signature(options['deviceSecret'], ordered_keys)
print("name:", options['deviceName'])
print("clientId:", mqtt_client_id)![请添加图片描述](https://img-blog.csdnimg.cn/6067a47763eb4c6a81da193a1b898347.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ3OTU4Mjg5,size_16,color_FFFFFF,t_70)
print("host:", 'mqtt://', options['host'], ':', options['port'])
print("port:", options['port'])
print("username:", user_name)
print("password:", password.lower())
2. 使用指南
将8-14行该为你的阿里云物联网设备对应信息。productKey、deviceName、deviceSecret port默认就是1883,host该为和自己一致的。
解析为常规的mqtt配置信息,就是从阿里云aliyun-iot-linkkit源码入手,拿到加密方法和数据组合结构,把封装的东西还原,最后得到数据。
3. 将解析后的数据填入MQTT桌面平台,模拟设备进行和阿里云物联网通信
本人使用MQTT X作为桌面平台。 1.解析的数据与MQTT X 对应关系如下图 2.从阿里云拿到配置数据到最后完成连接流程如下图 3.MQTT X连接完成与阿里云物联网平台设备显示在线,如下图 4.该设备对应主题发布一条消息至阿里云物联网平台,如下图 5.阿里云物联网在日志查询里面可以看到对应设备接收到的对应消息
总结
欢迎各位交流。您的点赞是我坚持的动力。
|