使用Python版Paho框架开发原生MQTT接口

举报
华为梁工 发表于 2020/01/15 15:50:06 2020/01/15
【摘要】 说明:阅读该文档之前需要对Mqtt有一定的了解,这里不对Mqtt知识作介绍,对Mqtt的了解请自行搜索学习。主要说明一下用一个简单的Demo样例,实现和IoT平台的对接,上报数据,下发命令等

说明:阅读该文档之前需要对Mqtt有一定的了解,这里不对Mqtt知识作介绍,对Mqtt的了解请自行搜索学习。主要说明一下用一个简单的Demo样例,实现和IoT平台的对接,上报数据,下发命令等

一、注册设备

1. 开发中心 注册设备

(1)查看产品信息

产品信息中的 协议类型 必须为MQTT

01.PNG

(2)注册设备

设备管理—>新增真实设备—>选择上面开发好的产品—>接入方式选择 直连

02.PNG

(3)注册设备成功之后需要保存的信息

保存设备ID和密钥,利用其构建clientID

03.PNG

2. 设备管理/设备接入 注册设备

(1)查看产品模型

进入设备管理界面—>产品模型

如果没有产品模型,可以点击右上角,从产品中心导入或者是本地导入

注意:产品的协议类型必须为MQTT

06.PNG

(2)注册设备

进入设备管理界面—>设备—>设备注册—>创建

04.PNG

(3)注册设备成功之后需要保存的信息

保存设备ID和密钥,利用其构建clientID

05.PNG

3. 北向接口 注册设备

注册设备(密码方式)

https://support.huaweicloud.cn/api-IoT/iot_06_0005.html

二、IoT平台提供的原生MQTT接口

https://support.huaweicloud.cn/api-IoT/iot_06_3002.html

本篇文档基于eclipse的paho框架,该框架网上资料较多,可自行百度搜索学习。

  • Python

库: paho_mqtt-1.4.0-py3.7.egg-info

1.MQTT CONNECT连接鉴权

(1) 主要是证书的配置,ca_certs就是证书的路径

(2) 其他参数的配置请参考源码:)

  • Python

# 连接地址每个局点不一样,比如开发中心是:iot-acc-dev.huaweicloud.cn
host = "xx.xx.xx.xx"
port = 8883
# 注册直连设备的时候返回的设备ID
deviceId = "9a57a-***-***-816b3e"
# 注册直连设备的时候返回的秘钥
DeviceSecret = "cbd*******3abv"
ca_certs = '../rootcert.pem'

para = get_para.Getpara(deviceId, DeviceSecret)
paras = para.get_para()
clientId = paras[0]
username = paras[1]
password = paras[2]

mqtt = mqtt.Client(clientId, clean_session=True)

def connect():
    # callback
    mqtt.on_connect = on_connect
    mqtt.on_disconnect = on_disconnect
    mqtt.on_publish = on_publish
    mqtt.on_message = on_message

    mqtt.username_pw_set(username, password)
    mqtt.tls_set(ca_certs, cert_reqs=ssl.CERT_NONE)

    mqtt.connect(host, port, 60)
    mqtt.loop_forever()

2.设备上报数据

数据上报就是往平台指定的topic上发布数据

  • Python

def publish():
    pubTopic = "/huawei/v1/devices/" + deviceId + "/data/json"
    payload = {
        "msgType": "deviceReq",
        "data": [
            {
                "serviceId": "Storage",
                "serviceData": {
                    "storage": "1"
                }
            }
        ]
    }
    message = json.dumps(payload)
    mqtt.publish(pubTopic, message, 1)

3.设备接收命令

命令接收就是订阅平台指定的topic,平台往该topic发送命令时,设备端就能收到

  • Python

def subscribe():
    subtopic = "/huawei/v1/devices/" + deviceId + "/command/json"
    mqtt.subscribe(subtopic)def on_message(client, userdata, msg):
    print("\n===== The command is received from the platform ===== \n", msg.payload.decode("utf-8"))
    receiveMes= json.loads(msg.payload.decode("utf-8"))
    mid = receiveMes['mid']
    commandRsp(mid)

4.设备响应命令

  1. 应用服务器要需要调用“订阅平台业务数据”API订阅“commandRsp”类型的通知后,才能接收到设备对控制命令的应答;

  2. 先订阅topic(/huawei/v1/devices/{deviceId}/command/{codecMode})接收到命令,然后往另外一个topic(/huawei/v1/devices/{deviceId}/data/{codecMode})发数据响应给平台,就视为对这条命令的响应,但是要注意,数据上报和命令响应的topic虽然是相同的,但是他们上报的结构体是有区别的

  • Python

def commandRsp(mid):
    RspTopic = "/huawei/v1/devices/" + deviceId + "/data/json"
    payload = {
        "msgType": "deviceRsp",
        "mid": mid,
        "errcode": 0,
        "body": {
            "result": 0
        }
    }
    message = json.dumps(payload)
    mqtt.publish(RspTopic, message, 1)

5.工具类

生成 clientId, username, password

class Getpara():
    def __init__(self, deviceId, deviceSecret):
        self.DeviceId = deviceId
        self.DeviceSecret = deviceSecret    def get_para(self):
        ClientId = self.DeviceId
        DeviceId = self.DeviceId
        DeviceSecret = self.DeviceSecret

        timestamp = time.strftime('%Y%m%d%H', time.localtime(time.time()))

        # clientID参考API文档拼装
        clientId = "".join((ClientId, "_0", "_0", "_", timestamp))
        username = DeviceId

        deviceSecret = DeviceSecret.encode('utf-8')
        password = hmac.new(timestamp.encode('utf-8'), deviceSecret,             digestmod=hashlib.sha256).hexdigest()

        return clientId, username, password


    附件下载

  • 证书.zip 1.08KB 下载次数:19
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。