本文介紹如何調用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串連參數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。
添加實現裝置接入物聯網平台的程式檔案。
您需編寫程式調用
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)
關於裝置、伺服器和物聯網平台的通訊方式介紹,請參見通訊方式概述。
運行專案。
範例程式碼
使用範例程式碼程式將裝置接入物聯網平台。
下載範例程式碼包,並解壓縮為檔案
aiot-python-demo
,其中包含以下檔案:檔案
說明
MqttSign.py
該檔案包含以MQTT方式接入物聯網平台的串連參數計算代碼,通過
calculate_sign_time
函數,計算出串連參數mqttUsername、mqttPassword和mqttClientId。iot.py
該檔案包含裝置與物聯網平台串連和通訊的邏輯代碼。
root.crt
物聯網平台的根憑證,是裝置接入物聯網平台的必須認證。
在檔案
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。
運行程式檔案
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協議接入物聯網平台失敗,請根據錯誤碼排查問題。服務端錯誤碼說明,請參見錯誤排查。