从阿里云mqtt配置解析到用户名密码等信息

Posted 以梦为马&不负韶华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从阿里云mqtt配置解析到用户名密码等信息相关的知识,希望对你有一定的参考价值。

这里写目录标题

Python正常进行mqtt相关开发,使用paho-mqtt模块(需要了解的可以看我另一篇Python快速实现MQTT双向订阅发布),需要参数如:name、clientId、host、port、username、password。
但在阿里云物联网网关开发时,一机一密型直接使用productKey、deviceName、deviceSecret进行开发(需要了解的可以看完另一篇博客Python对阿里云物联网MQTT设备接入端开发)。
本文从阿里云源码解析,将阿里云一机一密型中的配置解析出常规的配置信息。
用处在于如果没有设备网关,可以将数据解析后,使用MQTT桌面平台,填入常规mqtt配置信息,进而和阿里云物联网平台进行通信,进行数据发送,模拟、测试。

1. 先上代码

# -*- coding: utf-8 -*-

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.阿里云物联网在日志查询里面可以看到对应设备接收到的对应消息

总结

欢迎各位交流。您的点赞是我坚持的动力。

以上是关于从阿里云mqtt配置解析到用户名密码等信息的主要内容,如果未能解决你的问题,请参考以下文章

从阿里云mqtt配置解析到用户名密码等信息

从阿里云mqtt配置解析到用户名密码等信息

阿里云MQTT服务器搭建与测试(全图文,非常详细)

阿里云微消息队列(MQTT)的基本使用

MQTT协议-报文分析及网络客户端报文测试(MQTT报文连接阿里云上传数据+订阅数据)

MQTT协议-报文分析及网络客户端报文测试(MQTT报文连接阿里云上传数据+订阅数据)