相关文章推荐
酷酷的茴香  ·  MQTT 3 ——MQTT与Spring ...·  3 周前    · 
鼻子大的红金鱼  ·  Chrome扩展- ...·  2 年前    · 
怕老婆的烈酒  ·  CMD 中 findstr ...·  2 年前    · 

本文介绍如何调用Python语言的Paho MQTT类库,将设备接入阿里云物联网平台并进行消息收发。

前提条件

已在 物联网平台控制台 ,对应实例下, 创建产品和设备,并获取 MQTT接入域名和 设备证书信息(ProductKey、DeviceName和DeviceSecret)。具体操作,请参见:

准备开发环境

推荐使用Python 3.6版本。

  • Linux系统

    可通过如下命令进行安装:

    重要

    本操作命令以普通用户权限为例。如果您在操作过程中涉及到管理员权限才能执行的操作,可尝试使用sudo命令执行。

    sudo add-apt-repository ppa:deadsnakes/ppa 
    sudo apt-get update 
    sudo apt-get install python3.6 
    wget https://bootstrap.pypa.io/get-pip.py 
    sudo python3.6 get-pip.py 
    python3.6 -m pip install --upgrade pip setuptools wheel 
    sudo apt-get install python3.6-venv
  • Windows系统

    可根据系统类型选择安装包:

  • macOS系统

    可直接下载安装包: python-3.6.7-macosx10.9.pkg

下载Python语言的Paho MQTT库

请访问 Eclipse Paho Downloads 了解Paho项目和支持的开发语言详情。

执行以下命令安装Python语言版本的Paho MQTT库,您也可访问 Paho-MQTT ,查看更多信息。

pip install paho-mqtt

接入物联网平台

  • 使用 MqttSign.py 文件定义用于计算设备接入物联网平台的MQTT连接参数的函数,您开发的设备端接入物联网平台程序需调用该函数。

    函数说明如下:

    • 功能:用于计算设备接入物联网平台的MQTT连接参数 mqttUsername mqttPassword mqttClientId

    • 输入参数说明如下:

      参数

      类型

      说明

      productKey

      String

      设备所属产品的ProductKey,该设备在物联网平台上的身份证书信息之一。

      deviceName

      String

      设备名称,该设备在物联网平台上的身份证书信息之一。

      deviceSecret

      String

      设备密钥,该设备在物联网平台上的身份证书信息之一。

      clientId

      String

      设备的Client ID信息,可自定义,长度在64个字符以内。建议使用您设备的MAC地址或SN码,方便您识别区分不同的设备。

      timeStamp

      String

      当前时间的毫秒值时间戳,可选。

    • 输出设备接入物联网平台的MQTT连接参数,详细说明如下:

      参数

      类型

      说明

      mqttUsername

      String

      MQTT连接所需的用户名。

      mqttPassword

      String

      MQTT连接所需的密码。

      mqttClientId

      String

      MQTT客户端ID。

  1. 添加实现设备接入物联网平台的程序文件。

    您需编写程序调用 MqttSign.py 文件计算MQTT连接参数,实现设备接入物联网平台并进行通信。

    开发说明和代码示例如下:

    • 设置设备信息。

      # set the device info, include product key, device name, and device secret
      productKey = "a1LhUsK***"
      deviceName = "python***"
      deviceSecret = "bdd043d193782d11***"
      # set timestamp, clientid, subscribe topic and publish topic
      timeStamp = str((int(round(time.time() * 1000))))
      clientId = "192.168.****"
      subTopic = "/" + productKey + "/" + deviceName + "/user/get"
      pubTopic = "/" + productKey + "/" + deviceName + "/user/update"
    • 设置MQTT连接信息。

      调用 MqttSign.py 中定义的 calculate_sign_time 函数,根据传入的参数 clientId productKey deviceName deviceSecret timeStamp ,计算出 mqttUsername mqttPassword mqttClientId

      同时本示例采用TLS直连模式,需要 下载根证书 ,进行配置。

      # set host, port
      host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"
      # instanceId = "***"
      # host = instanceId + ".mqtt.iothub.aliyuncs.com"
      port = 1883
      # set tls crt, keepalive
      tls_crt = "root.crt"
      keepAlive = 300
      # calculate the login auth info, and set it into the connection options
      m = AuthIfo()
      m.calculate_sign_time(productKey, deviceName, deviceSecret, clientId, timeStamp)
      client = mqtt.Client(m.mqttClientId)
      client.username_pw_set(username=m.mqttUsername, password=m.mqttPassword)
      client.tls_set(tls_crt)
      说明
      • 对于旧版公共实例,代码 host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" 中的地域代码(cn-shanghai),需设置为您物联网平台设备所在地域代码。地域代码表达方法,请参见 支持的地域

      • 对于新版公共实例和企业版实例,代码 host = instanceId + ".mqtt.iothub.aliyuncs.com" 需要传入实例ID。

        您可登录物联网平台控制台,在 实例概览 页,找到并单击对应实例,进入 实例详情 页面获取MQTT接入地址。具体操作,请参见 查看实例终端节点

        实例的详细说明,请参见 实例概述

    • 调用MQTT的 connect() 函数,将设备接入物联网平台。

      def on_connect(client, userdata, flags, rc):
          if rc == 0:
              print("connect success!")
          else:
              print("connect failed...  error code is:" + str(rc))
      def connect_mqtt():
          client.on_connect = on_connect
          client.connect(host, port, keepAlive)
          return client
    • 调用Publish接口发布消息。您需指定发布消息的目标Topic和消息payload。

      def publish_message():
          # publish 5 messages to pubTopic("/a1LhUsK****/python***/user/update")
          for i in range(5):
              message = "ABC" + str(i)
              client.publish(pubTopic, message)
              print("publish msg:" + str(i))
              time.sleep(2)

      通信Topic介绍,请参见 什么是Topic

    • 调用Subscribe接口订阅Topic,接收云端下发的消息。

      def subscribe_topic():
          # subscribe to subTopic("/a1LhUsK****/python***/user/get") and request messages to be delivered
          client.subscribe(subTopic)

      关于设备、服务器和物联网平台的通信方式介绍,请参见 通信方式概述

  2. 运行项目。

示例代码

使用示例代码程序将设备接入物联网平台。

  1. 下载示例代码包 ,并解压缩为文件 aiot-python-demo ,其中包含以下文件:

    文件

    说明

    MqttSign.py

    该文件包含以MQTT方式接入物联网平台的连接参数计算代码,通过 calculate_sign_time 函数,计算出连接参数 mqttUsername mqttPassword mqttClientId

    iot.py

    该文件包含设备与物联网平台连接和通信的逻辑代码。

    root.crt

    物联网平台的根证书,是设备接入物联网平台的必须证书。

  2. 在文件 iot.py 中,修改设备信息为您的设备信息。

    • productKey deviceName deviceSecret 替换为您的设备证书信息。

      # set the device info, include product key, device name, and device secret
      productKey = "a1LhUsK***"
      deviceName = "python***"
      deviceSecret = "bdd043d193782d11***"
    • (可选)替换 timeStamp clientId,clientId 值可以替换为您的实际设备的SN码和MAC地址。

      说明

      若不替换也能接入物联网平台,在实际场景中,建议您替换为实际信息。

    • 修改代码 host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" 中的值为对应接入域名。

      详细说明,请参见 接入物联网平台 的步骤2。

  3. 运行程序文件 iot.py

    如果运行成功,接入物联网平台的本地日志如下:

    Connect aliyun IoT Cloud Sucess
    subscribe topic: /a1LhUsK***/python***/user/get
    publish msg: 0
    publish msg: ABC0
    publish msg: 1
    publish msg: ABC1
    publish msg: 2
    publish msg: ABC2
    publish msg: 3
    publish msg: ABC3
    publish msg: 4
    publish msg: ABC4

    登录 物联网平台控制台 ,在对应实例下,可查看设备状态和日志。

    • 选择 设备管理 > 设备 ,可看到该设备的状态显示为 在线
    • 选择 监控运维 > 日志服务 ,可查看 云端运行日志 设备本地日志 日志。详细内容,请参见 云端运行日志 设备本地日志

错误码

如果设备通过MQTT协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见 错误排查