內(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。

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è)訂閱列表。

數(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消息中的訂閱被刪除了。



