MQTT基礎(chǔ) 三: 發(fā)布、訂閱和取消訂閱

內(nèi)容:
重點(diǎn)介紹MQTT 中的發(fā)布、訂閱和取消訂閱的細(xì)節(jié)

正文

發(fā)布(Publish)
  • MQTT 客戶端可以在連接到代理后立即發(fā)布消息。MQTT 在代理上使用基于主題的消息過濾。每條消息都必須包含一個(gè)主題,代理可以使用該主題將消息轉(zhuǎn)發(fā)給感興趣的客戶端。通常,每條消息都有一個(gè)負(fù)載,其中包含要以字節(jié)格式傳輸?shù)臄?shù)據(jù)。MQTT 與數(shù)據(jù)無關(guān)??蛻舳说挠美龥Q定了有效負(fù)載的結(jié)構(gòu)。發(fā)送客戶端(發(fā)布者)決定是否要發(fā)送二進(jìn)制數(shù)據(jù)、文本數(shù)據(jù),甚至完整的 XML 或 JSON。
image.png
  • topicName
    主題名稱是一個(gè)簡(jiǎn)單的字符串,它以正斜杠作為分隔符進(jìn)行分層結(jié)構(gòu)。例如,“我的家/客廳/溫度”

  • Qos
    此數(shù)字表示消息的服務(wù)質(zhì)量 (QoS)。有三個(gè)級(jí)別:0、1 和 2。服務(wù)級(jí)別決定了消息到達(dá)預(yù)期接收者(客戶端或代理)的保證類型。

  • RatainFlag(保留標(biāo)志)
    此標(biāo)志定義消息是否由代理保存為指定主題的最后一個(gè)已知良好值。當(dāng)新客戶端訂閱主題時(shí),他們會(huì)收到保留在該主題上的最后一條消息。

  • PayLoad
    這是消息的實(shí)際內(nèi)容。MQTT 與數(shù)據(jù)無關(guān)。可以發(fā)送圖像、任何編碼的文本、加密數(shù)據(jù)以及幾乎所有二進(jìn)制數(shù)據(jù)。

  • packetId(數(shù)據(jù)包標(biāo)識(shí)符)
    數(shù)據(jù)包標(biāo)識(shí)符標(biāo)識(shí)唯一消息,因?yàn)樗诳蛻舳撕痛碇g流動(dòng)。數(shù)據(jù)包標(biāo)識(shí)符僅與大于零的 QoS 級(jí)別相關(guān)。客戶端庫(kù)和/或代理負(fù)責(zé)設(shè)置此內(nèi)部 MQTT 標(biāo)識(shí)符。

  • DupFlag
    該標(biāo)志表明該消息是重復(fù)的并且由于預(yù)期的接收者(客戶端或代理)沒有確認(rèn)原始消息而被重新發(fā)送。這僅與 QoS 大于 0 相關(guān)。通常,重新發(fā)送/復(fù)制機(jī)制由 MQTT 客戶端庫(kù)或代理作為實(shí)現(xiàn)細(xì)節(jié)處理。

    當(dāng)客戶端向MQTT 代理發(fā)送消息進(jìn)行發(fā)布時(shí),代理讀取消息、確認(rèn)消息(根據(jù) QoS 級(jí)別)并處理消息。代理的處理包括確定哪些客戶端訂閱了主題并將消息發(fā)送給他們。
    最初發(fā)布消息的客戶端只關(guān)心將 PUBLISH 消息傳遞給代理。一旦代理收到 PUBLISH 消息,代理就有責(zé)任將消息傳遞給所有訂閱者。發(fā)布客戶端不會(huì)得到關(guān)于是否有人對(duì)發(fā)布的消息感興趣或有多少客戶端從代理收到消息的任何反饋。

訂閱(Subscribe)
  • 如果沒有人收到消息,發(fā)布消息就沒有意義。換句話說,如果沒有客戶端訂閱消息的主題。這個(gè)訂閱消息非常簡(jiǎn)單,它包含一個(gè)唯一的數(shù)據(jù)包標(biāo)識(shí)符和一個(gè)訂閱列表。
image.png
  • 數(shù)據(jù)包標(biāo)識(shí)符
    數(shù)據(jù)包標(biāo)識(shí)符唯一標(biāo)識(shí)消息,因?yàn)樗诳蛻舳撕痛碇g流動(dòng)??蛻舳藥?kù)和/或代理負(fù)責(zé)設(shè)置此內(nèi)部 MQTT 標(biāo)識(shí)符。

  • 訂閱列表
    一個(gè) SUBSCRIBE 消息可以包含一個(gè)客戶端的多個(gè)訂閱。每個(gè)訂閱由一個(gè)主題和一個(gè) QoS 級(jí)別組成。訂閱消息中的主題可以包含通配符,使訂閱主題模式而不是特定主題成為可能。如果一個(gè)客戶端存在重疊訂閱,則代理會(huì)傳送該主題具有最高 QoS 級(jí)別的消息。

Suback(確認(rèn)消息)
  • 為了確認(rèn)每個(gè)訂閱,代理向客戶端發(fā)送一個(gè)SUBACK確認(rèn)消息。該消息包含原始 Subscribe 消息的數(shù)據(jù)包標(biāo)識(shí)符(以明確標(biāo)識(shí)該消息)和返回碼列表。

    image.png

  • 包標(biāo)識(shí)符
    包標(biāo)識(shí)符是用于標(biāo)識(shí)消息的唯一標(biāo)識(shí)符。它與 SUBSCRIBE 消息中的相同。

  • 返回代碼
    代理為它在 SUBSCRIBE 消息中收到的每個(gè)主題/QoS 對(duì)發(fā)送一個(gè)返回代碼。
    例如,如果 SUBSCRIBE 消息有五個(gè)訂閱,則 SUBACK 消息包含五個(gè)返回碼。返回碼確認(rèn)每個(gè)主題并顯示代理授予的 QoS 級(jí)別。如果代理拒絕訂閱,則 SUBACK 消息包含該特定主題的失敗返回代碼。例如,如果客戶端沒有足夠的權(quán)限訂閱主題或主題格式錯(cuò)誤。

    image.png

    image.png

    客戶端成功發(fā)送 SUBSCRIBE 消息并收到 SUBACK 消息后,它會(huì)獲取與 SUBSCRIBE 消息包含的訂閱中的主題匹配的每條已發(fā)布消息。

UNSUBACK
  • 為了確認(rèn)取消訂閱,代理向客戶端發(fā)送一個(gè)UNSUBACK確認(rèn)消息。此消息僅包含原始 UNSUBSCRIBE 消息的數(shù)據(jù)包標(biāo)識(shí)符(以明確標(biāo)識(shí)該消息)。
    image.png
  • 包標(biāo)識(shí)符
    包標(biāo)識(shí)符唯一地標(biāo)識(shí)消息。如前所述,這與 UNSUBSCRIBE 消息中的數(shù)據(jù)包標(biāo)識(shí)符相同。
    客戶端收到來自broker的UNSUBACK后,可以認(rèn)為UNSUBSCRIBE消息中的訂閱被刪除了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容