このトピックでは、Python用のPaho MQTTライブラリを使用してデバイスをIoT Platformに接続し、メッセージングを有効にする方法について説明します。
前提条件
プロダクトとデバイスは、IoT Platformコンソールのインスタンスに作成されます。 デバイス証明書とMQTTエンドポイントが取得されます。 デバイス証明書情報には、ProductKey、DeviceName、およびDeviceSecretが含まれます。 詳細については、以下のトピックをご参照ください。
開発環境の準備
Python 3.6の使用を推奨します。
Linux
次のコマンドを実行してPythonをインストールします。
重要このトピックでは、共通ユーザーの権限を使用してすべての操作を実行します。 管理者権限を必要とする特定の操作を実行する場合は、sudoコマンドを実行します。
sudo add-apt-repository ppa:deadsnake /ppa sudo apt-getアップデート sudo apt-get python3.6をインストールする wget https:// bootstrap.pypa.io/get-pip.py sudo python3.6 get-pip.py python3.6 -m pip install -- アップグレードpip setuptools wheel sudo apt-get install python3.6-venvWindows
オペレーティングシステムに基づいて、次のいずれかのパッケージをインストールします。
32ビット: python-3.6.7.exe
64ビット: python-3.6.7-amd64.exe
macOS
パッケージpython-3.6.7-macosx10.9.pkgをダウンロードします。
Python用のPaho MQTTライブラリをダウンロードする
Pahoプロジェクトとサポートされているプログラミング言語の詳細については、「Eclipse Paho Downloads」をご参照ください。
次のコマンドを実行して、Python用のPaho MQTTライブラリをインストールします。 詳細については、「Paho-MQTT」をご参照ください。
pip install paho-mqttデバイスから IoT Platform への接続
MqttSign.pyファイルは、MQTT接続パラメーターを取得するために呼び出される関数を定義します。 デバイスをIoT Platformに接続するには、関数を呼び出す必要があります。
機能:
この関数は、MQTT接続パラメーターusername、password、およびmqttClientIdを取得するために使用されます。
入力パラメータ:
パラメーター
データ型
説明
productKey
String
デバイスが属するプロダクトのProductKey。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
deviceName
String
デバイスのDeviceName。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
deviceSecret
String
デバイスのDeviceSecret。 このパラメーターは、IoT Platformのデバイスを識別するために使用されます。
clientId
String
デバイスのClientID。 デバイスを効率的に識別するために、デバイスのMACアドレスまたはシリアル番号 (SN) をClientIDとして使用することを推奨します。
timeStamp
String
現在の時刻をミリ秒単位で示すタイムスタンプ。 このパラメーターはオプションです。
Output parameters:
パラメーター
データ型
説明
mqttUsername
String
MQTT接続を確立するために使用されるユーザー名。
mqttPassword
String
MQTT接続を確立するために使用されるパスワード。
mqttClientId
String
MQTTクライアントのID。
デバイスをIoT Platformに接続できるプログラムファイルを追加します。
MQTT接続パラメータを取得するには、MqttSign.pyファイルで関数を呼び出すプログラムを記述する必要があります。
このセクションでは、開発手順とサンプルコードについて説明します。
デバイス情報を指定します。
# デバイス情報を設定し、プロダクトキー、デバイス名、デバイスシークレットを含めます productKey = "a1LhUsK ***" deviceName = "python ***" deviceSecret = "bdd043d193782d11 ***" # settimestamp、clientid、サブスクライブトピック、およびパブリッシュトピック 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関数を呼び出します。 この関数は、deviceSecret、timeStamp、clientId、productKey、およびdeviceNameの入力パラメーターの値に基づいて、mqttUsername、mqttPassword、およびmqttClientIdパラメーターを返します。この例では、トランスポート層セキュリティ (TLS) ベースのTCP接続が確立される。 接続パラメーターを設定するには、ルート証明書のダウンロードが必要です。
# setホスト、ポート 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 # ログイン認証情報を計算し、接続オプションに設定します m = AuthIfo() m.calculate_sign_time(productKey, deviceName, deviceSecret, clientId, timeStamp) client = mqtt.Client(m.mqttClientId) client.us ername_pw_set(username=m.mqttUsername, password=m.mqttPassword) client.tls_set(tls_crt)説明旧バージョンのパブリックインスタンスを使用する場合は、
host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"のcn-shanghaiをデバイスが存在するリージョンのIDに置き換えます。 リージョンIDの形式の詳細については、「サポートされているリージョン」をご参照ください。新しいバージョンのパブリックインスタンスまたはEnterprise Editionインスタンスを使用する場合は、
host = instanceId + ".mqtt.iothub.aliyuncs.com"のinstanceIdをインスタンスのIDに置き換えます。MQTTエンドポイントを取得するには、次の手順を実行します。IoT Platformコンソールにログインします。 [概要] ページで、管理するインスタンスのカードをクリックします。 MQTTエンドポイントが [インスタンスの詳細] ページに表示されます。 詳細については、「インスタンスのエンドポイントの表示」をご参照ください。
IoT Platformインスタンスの詳細については、「概要」をご参照ください。
Connect()関数を呼び出して、デバイスをIoT Platformに接続します。def on_connect (クライアント、userdata、フラグ、rc): rc === 0の場合: プリント ("connect success!") else: print("connect failed... error code is:" + str(rc)) def connect_mqtt(): client.on_connect = on_connect client.connect (ホスト、ポート、keepAlive) 戻りクライアントメッセージを発行するには、Publish() 関数を呼び出します。 メッセージをパブリッシュするトピックとメッセージのペイロードを指定する必要があります。
def publish_message(): # pubTopicに5つのメッセージを公開します ("/a1LhUsK ****/python ***/user/update") 範囲のiのため (5): message = "ABC" + str(i) client.publish(pubTopic, message) プリント ("publish msg:" + str(i)) time.sleep (2)トピックの詳細については、「トピックとは」をご参照ください。
Subscribe() 関数を呼び出してトピックをサブスクライブし、IoT Platformからメッセージを受信します。
def subribe_topic (): # subTopic("/a1LhUsK ****/python ***/user/get") をサブスクライブし、メッセージの配信をリクエストします client.subscribe(subTopic)デバイス、サーバー、およびIoT Platform間の通信方法の詳細については、「概要」をご参照ください。
プロジェクトを実行します。
サンプルコード
コードコンパイルされたサンプルプログラムを実行して、デバイスをIoT Platformに接続します。
リンクからサンプルコードを含むパッケージをダウンロードし、パッケージをaiot-python-demoディレクトリに解凍します。 ディレクトリに含まれるファイルを次の表に示します。
証明書ファイル
説明
MqttSign.py
このファイルには、MQTT経由でデバイスをIoT Platformに接続するために必要な接続パラメーターを取得するために使用されるコードが含まれています。 ファイルを実行すると、
calculate_sign_time関数が呼び出され、mqttUsername、mqttPassword、およびmqttClientIdパラメーターの値が取得されます。iot.py
このファイルには、デバイスをIoT Platformに接続して通信を有効にするために使用されるロジックコードが含まれています。
root.crt
IoT Platformのルート証明書。 この証明書は、デバイスをIoT Platformに接続するために必要です。
iot.pyファイルで、デバイス情報をデバイス情報に置き換えます。
productKey、deviceName、およびdeviceSecretパラメーターの値をデバイス証明書情報に置き換えます。
# デバイス情報を設定し、プロダクトキー、デバイス名、デバイスシークレットを含めます productKey = "a1LhUsK ***" deviceName = "python ***" deviceSecret = "bdd043d193782d11 ***"オプションです。 timeStampパラメーターとclientIdパラメーターの値を置き換えます。 clientIdパラメーターの値をデバイスのMACアドレスまたはSNに置き換えることができます。
説明値を置き換えない場合でも、デバイスをIoT Platformに接続できます。 実際のシナリオでは、パラメーターの値を実際の値に置き換えることを推奨します。
置き換えます。実際のMQTTエンドポイントで
host = productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com"にiot-as-mqtt.cn-shanghai.aliyuncs.comします。詳細については、このトピックの「デバイスをIoT Platformに接続する」セクションの手順2を参照してください。
iot.pyファイルを実行します。
ファイルを実行すると、次のローカルログが生成されます。
Connect aliyun IoT Cloud Sucess 購読トピック: /a1LhUsK ***/python ***/user/get publish msg: 0 パブリッシュmsg: ABC0 publish msg: 1 パブリッシュmsg: ABC1 publish msg: 2 パブリッシュmsg: ABC2 publish msg: 3 パブリッシュmsg: ABC3 publish msg: 4 パブリッシュmsg: ABC4IoT Platform コンソールにログインします。 インスタンス上のデバイスのステータスとログを表示できます。
を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。
を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。
エラーコード
デバイスがMQTT経由でIoT Platformに接続できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。