Paho-MQTT Python接入示例

本文介绍如何调用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==1.6.1
重要

本示例Demo暂不支持使用2.0.0版本的Paho MQTT库。

接入物联网平台

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

    函数说明如下:

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

    • 输入参数说明如下:

      参数

      类型

      说明

      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 productKeydeviceNamedeviceSecrettimeStamp,计算出mqttUsernamemqttPasswordmqttClientId

      同时本示例采用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.zip,然后解压缩为文件aiot-python-demo,其中包含以下文件:

    文件

    说明

    MqttSign.py

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

    iot.py

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

    root.crt

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

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

    • productKeydeviceNamedeviceSecret替换为您的设备证书信息。

      # set the device info, include product key, device name, and device secret
      productKey = "a1LhUsK***"
      deviceName = "python***"
      deviceSecret = "bdd043d193782d11***"
    • (可选)替换timeStampclientId,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协议接入物联网平台失败,请根据错误码排查问题。服务端错误码说明,请参见错误排查