內(nèi)容:
重點介紹MQTT 中的發(fā)布、訂閱和取消訂閱的細(xì)節(jié)
正文
發(fā)布(Publish)
- MQTT 客戶端可以在連接到代理后立即發(fā)布消息纪挎。MQTT 在代理上使用基于主題的消息過濾。每條消息都必須包含一個主題跟匆,代理可以使用該主題將消息轉(zhuǎn)發(fā)給感興趣的客戶端异袄。通常,每條消息都有一個負(fù)載贾铝,其中包含要以字節(jié)格式傳輸?shù)臄?shù)據(jù)隙轻。MQTT 與數(shù)據(jù)無關(guān)」缚客戶端的用例決定了有效負(fù)載的結(jié)構(gòu)。發(fā)送客戶端(發(fā)布者)決定是否要發(fā)送二進(jìn)制數(shù)據(jù)敛瓷、文本數(shù)據(jù)叁巨,甚至完整的 XML 或 JSON。
topicName
主題名稱是一個簡單的字符串呐籽,它以正斜杠作為分隔符進(jìn)行分層結(jié)構(gòu)锋勺。例如蚀瘸,“我的家/客廳/溫度”Qos
此數(shù)字表示消息的服務(wù)質(zhì)量 (QoS)。有三個級別:0庶橱、1 和 2贮勃。服務(wù)級別決定了消息到達(dá)預(yù)期接收者(客戶端或代理)的保證類型。RatainFlag(保留標(biāo)志)
此標(biāo)志定義消息是否由代理保存為指定主題的最后一個已知良好值苏章。當(dāng)新客戶端訂閱主題時寂嘉,他們會收到保留在該主題上的最后一條消息。PayLoad
這是消息的實際內(nèi)容枫绅。MQTT 與數(shù)據(jù)無關(guān)泉孩。可以發(fā)送圖像并淋、任何編碼的文本寓搬、加密數(shù)據(jù)以及幾乎所有二進(jìn)制數(shù)據(jù)。packetId(數(shù)據(jù)包標(biāo)識符)
數(shù)據(jù)包標(biāo)識符標(biāo)識唯一消息县耽,因為它在客戶端和代理之間流動句喷。數(shù)據(jù)包標(biāo)識符僅與大于零的 QoS 級別相關(guān)⊥帽校客戶端庫和/或代理負(fù)責(zé)設(shè)置此內(nèi)部 MQTT 標(biāo)識符脏嚷。-
DupFlag
該標(biāo)志表明該消息是重復(fù)的并且由于預(yù)期的接收者(客戶端或代理)沒有確認(rèn)原始消息而被重新發(fā)送。這僅與 QoS 大于 0 相關(guān)瞒御。通常父叙,重新發(fā)送/復(fù)制機制由 MQTT 客戶端庫或代理作為實現(xiàn)細(xì)節(jié)處理。當(dāng)客戶端向MQTT 代理發(fā)送消息進(jìn)行發(fā)布時肴裙,代理讀取消息趾唱、確認(rèn)消息(根據(jù) QoS 級別)并處理消息。代理的處理包括確定哪些客戶端訂閱了主題并將消息發(fā)送給他們蜻懦。
最初發(fā)布消息的客戶端只關(guān)心將 PUBLISH 消息傳遞給代理甜癞。一旦代理收到 PUBLISH 消息,代理就有責(zé)任將消息傳遞給所有訂閱者宛乃。發(fā)布客戶端不會得到關(guān)于是否有人對發(fā)布的消息感興趣或有多少客戶端從代理收到消息的任何反饋悠咱。
訂閱(Subscribe)
- 如果沒有人收到消息,發(fā)布消息就沒有意義征炼。換句話說析既,如果沒有客戶端訂閱消息的主題。這個訂閱消息非常簡單谆奥,它包含一個唯一的數(shù)據(jù)包標(biāo)識符和一個訂閱列表眼坏。
數(shù)據(jù)包標(biāo)識符
數(shù)據(jù)包標(biāo)識符唯一標(biāo)識消息,因為它在客戶端和代理之間流動酸些≡滓耄客戶端庫和/或代理負(fù)責(zé)設(shè)置此內(nèi)部 MQTT 標(biāo)識符檐蚜。訂閱列表
一個 SUBSCRIBE 消息可以包含一個客戶端的多個訂閱。每個訂閱由一個主題和一個 QoS 級別組成沿侈。訂閱消息中的主題可以包含通配符闯第,使訂閱主題模式而不是特定主題成為可能。如果一個客戶端存在重疊訂閱缀拭,則代理會傳送該主題具有最高 QoS 級別的消息咳短。
Suback(確認(rèn)消息)
-
為了確認(rèn)每個訂閱,代理向客戶端發(fā)送一個SUBACK確認(rèn)消息智厌。該消息包含原始 Subscribe 消息的數(shù)據(jù)包標(biāo)識符(以明確標(biāo)識該消息)和返回碼列表诲泌。
image.png 包標(biāo)識符
包標(biāo)識符是用于標(biāo)識消息的唯一標(biāo)識符。它與 SUBSCRIBE 消息中的相同铣鹏。-
返回代碼
代理為它在 SUBSCRIBE 消息中收到的每個主題/QoS 對發(fā)送一個返回代碼敷扫。
例如,如果 SUBSCRIBE 消息有五個訂閱诚卸,則 SUBACK 消息包含五個返回碼葵第。返回碼確認(rèn)每個主題并顯示代理授予的 QoS 級別。如果代理拒絕訂閱合溺,則 SUBACK 消息包含該特定主題的失敗返回代碼卒密。例如藻治,如果客戶端沒有足夠的權(quán)限訂閱主題或主題格式錯誤碌嘀。
image.png
image.png
客戶端成功發(fā)送 SUBSCRIBE 消息并收到 SUBACK 消息后樊销,它會獲取與 SUBSCRIBE 消息包含的訂閱中的主題匹配的每條已發(fā)布消息陷猫。
UNSUBACK
- 為了確認(rèn)取消訂閱,代理向客戶端發(fā)送一個UNSUBACK確認(rèn)消息凰兑。此消息僅包含原始 UNSUBSCRIBE 消息的數(shù)據(jù)包標(biāo)識符(以明確標(biāo)識該消息)款青。
image.png -
包標(biāo)識符
包標(biāo)識符唯一地標(biāo)識消息纲酗。如前所述辩涝,這與 UNSUBSCRIBE 消息中的數(shù)據(jù)包標(biāo)識符相同贸伐。
客戶端收到來自broker的UNSUBACK后,可以認(rèn)為UNSUBSCRIBE消息中的訂閱被刪除了怔揩。