Python Link SDK を使用して、MQTT を介して IoT Platform のトピックにサブスクライブし、メッセージをパブリッシュし、トピックからアンサブスクライブします。このトピックでは、各操作のリクエストと確認のフロー全体について説明します。
トピック形式
トピックは、デバイスと IoT Platform 間の通信チャネルです。デバイスはトピックを使用してメッセージを送受信します。
トピックでは、フォワードスラッシュ (/) を使用して階層を定義し、カテゴリを分離します。カスタムトピックの最初の 3 つのレベルは、あらかじめ定義されています:
|
レベル |
値 |
説明 |
|
1 |
ProductKey |
プロダクトの識別 |
|
2 |
|
DeviceName のワイルドカード |
|
3 |
user |
カスタムトピックカテゴリの識別 |
詳細については、「トピックとは」をご参照ください。
クラウドからのメッセージの受信
トピックをサブスクライブするには、subscribe_topic() を呼び出します:
rc, mid = lk.subscribe_topic(topic, qos=1)
mqtt_sub_pub_on.py デモでは、lk.to_full_topic("user/test") を呼び出してトピック文字列を生成します。to_full_topic API は、指定した ProductKey と DeviceName を使用し、/YourProductKey/YourDeviceName/user/test と同等の文字列を返します。
サブスクリプション結果は、on_subscribe_topic コールバックで返されます:
lk.on_subscribe_topic = on_subscribe_topic
def on_subscribe_topic(mid, granted_qos, userdata):
print("on_subscribe_topic mid:%d, granted_qos:%s" %
(mid, str(','.join('%s' % it for it in granted_qos))))
pass
granted_qos は、サブスクライブしたトピックに付与されたサービス品質 (QoS) レベルです:
|
値 |
意味 |
|
|
サブスクリプションは成功しました。 |
|
|
サブスクリプションは失敗しました。 |
クラウドからのメッセージの受信と処理
受信メッセージによって on_topic_message() コールバックがトリガーされます:
lk.on_topic_message = on_topic_message
def on_topic_message(topic, payload, qos, userdata):
print("on_topic_message:" + topic + " payload:" + str(payload) + " qos:" + str(qos))
pass
クラウドへのメッセージの送信
Python Link SDK バージョン 1.0.0 から 1.2.11 では、デバイスが IoT Platform から切断された場合、publish API を呼び出すと、処理する必要がある例外がスローされます。バージョン 1.2.12 以降では、API は例外をスローする代わりに、ゼロ以外のエラー値を返します。
メッセージの送信
クラウドにメッセージを公開するには、publish_topic() を呼び出します:
rc, mid = lk.publish_topic(topic, payload)
パブリッシュ結果の通知
on_publish_topic コールバックは、クラウドがメッセージを受信したかどうかを確認します:
lk.on_publish_topic = on_publish_topic
def on_publish_topic(mid, userdata):
print("on_publish_topic mid:%d" % mid)
publish_topic から rc 値 0 が返された場合、リクエストが送信バッファに書き込まれたことを意味します。その後、on_publish_topic コールバックが成功することで、パブリッシュの成功が確認されます。
トピックからのアンサブスクライブ
Python Link SDK バージョン 1.0.0 から 1.2.11 では、デバイスが IoT Platform から切断された場合、unsubscribe API を呼び出すと、処理する必要がある例外がスローされます。バージョン 1.2.12 以降では、API は例外をスローする代わりに、ゼロ以外のエラー値を返します。
特定のトピックのサブスクライブを解除するには、unsubscribe_topic() を呼び出します:
rc, mid = lk.unsubscribe_topic(topic)
サブスクライブ解除の結果は、on_unsubscribe_topic コールバックで返されます:
lk.on_unsubscribe_topic = on_unsubscribe_topic
def on_unsubscribe_topic(mid, userdata):
print("on_unsubscribe_topic mid:%d" % mid)
pass
unsubscribe_topic からの rc の値が 0 の場合、リクエストがキャッシュバッファーに書き込まれたことを意味します。それ以外の値は失敗を示します。その後、on_unsubscribe_topic コールバックが成功すると、サブスクライブ解除が成功したことが確認されます。