全部產品
Search
文件中心

IoT Platform:Paho-MQTT Python接入樣本

更新時間:Jun 30, 2024

本文介紹如何調用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,其中包含以下檔案:

    檔案

    說明

    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

    登入物聯網平台控制台,在對應執行個體下,可查看裝置狀態和日誌。

    • 選擇裝置管理 > 裝置,可看到該裝置的狀態顯示為線上
    • 選擇監控營運 > Log Service,可查看雲端作業記錄裝置本地日誌日誌。詳細內容,請參見雲端作業記錄裝置本地日誌

錯誤碼

如果裝置通過MQTT協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查