裝置可使用物聯網平台提供的Python Link SDK通過MQTT協議Topic與物聯網平台進行通訊。本文介紹裝置如何直接基於MQTT Topic向物聯網平台發送訊息,以及接收物聯網平台雲端下發的訊息。
背景資訊
Topic是裝置與物聯網平台之間通訊的管道,裝置可通過Topic實現訊息的發送和接收。
Topic格式必須以/
進行分層,區分每個類目。自訂Topic的前三個類目已經規定好,第一個代表產品標識ProductKey,第二個${deviceName}
通配DeviceName,第三個user用來標識產品的自訂Topic類。
更多有關Topic的資訊,請參見什麼是Topic。
從雲端接收訊息
rc, mid = lk.subscribe_topic(topic,qos=1)
在mqtt_sub_pub_on.py
這個demo程式碼範例中,我們通過lk.to_full_topic("user/test")
快速產生一個topic
。to_full_topic
是一個Topic自動產生介面,您在前面已經填入了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
granded_qos
為訂閱Topic列表對應的QoS返回結果,正常值為0或1,128表示訂閱失敗。
接收與處理來自雲端的訊息
通過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版本中,裝置與物聯網平台串連斷開後,如果繼續調用以下介面發送訊息會拋出異常,需要您做好異常處理。在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
表明publish
成功。
取消訊息訂閱
Python Link SDK的1.0.0至1.2.11版本中,裝置與物聯網平台串連斷開後,繼續調用以下介面取消訊息訂閱會拋出異常,需要您做好異常處理。在1.2.12版本後,該API執行失敗後,會返回非零錯誤值,不再拋出異常。
通過調用unsubscribe_topic()
取消對指定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
時表明取消成功。