設備可使用物聯網平臺提供的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
時表明取消成功。