全部產品
Search
文件中心

:基於MQTT Topic通訊

更新時間:Jun 30, 2024

裝置可使用物聯網平台提供的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")快速產生一個topicto_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傳回值rc0表明請求已寫入緩衝區,其它值失敗。當回調on_unsubscribe_topic時表明取消成功。