歡迎來到 MQTT 要點的第四部分。在這篇文章中,我們將重點介紹 MQTT 中的發佈、訂閱和取消訂閱。在本系列的前面,我們介紹了發佈/訂閱模型的基礎知識。在這篇文章中,我們深入探討了 MQTT 協議中發佈/訂閱的細節。
一、Publish
MQTT 客戶端可以在連接到代理後立即發佈消息。 MQTT 在代理上利用基於主題的消息過濾(詳見第 2 部分)。每條消息都必須包含一個主題,代理可以使用該主題將消息轉發給感興趣的客戶端。通常,每條消息都有一個有效載荷,其中包含要以字節格式傳輸的數據。 MQTT 與數據無關。客戶端的用例決定了有效負載的結構。發送客戶端(發佈者)決定是否要發送二進制數據、文本數據,甚至是成熟的 XML 或 JSON。
MQTT 中的 PUBLISH 消息有幾個我們要詳細討論的屬性:
TopicName 主體名稱 主題名稱是一個簡單的字符串,它以正斜槓作爲分隔符進行分層結構。例如,“myhome/livingroom/temperature”或“Germany/Munich/Octoberfest/people”
QoS 此數字表示消息的服務質量級別 (QoS)。共有三個級別:0、1 和 2。服務級別決定了消息對於到達預期接收者(客戶端或代理)的保證類型。
RetainFlag 此標誌定義消息是否由代理保存爲指定主題的最後一個已知良好值。當新客戶端訂閱某個主題時,他們會收到保留在該主題上的最後一條消息。
Payload 這是消息的實際內容。 MQTT 與數據無關。可以發送任何編碼的圖像、文本、加密數據以及幾乎所有二進制數據。
Packet Identifier 當消息在客戶端和代理之間流動時,數據包標識符唯一地標識一條消息。數據包標識符僅與大於零的 QoS 級別相關。客戶端庫和/或代理負責設置此內部 MQTT 標識符。
DUP flag 該標誌表明該消息是重複的,並且由於預期的接收者(客戶端或代理)沒有確認原始消息而被重新發送。這僅與大於 0 的 QoS 相關。通常,重新發送/複製機制由 MQTT 客戶端庫或代理作爲實現細節處理。
當客戶端向 MQTT 代理髮送消息以進行發佈時,代理讀取消息、確認消息(根據 QoS 級別)並處理消息。代理的處理包括確定哪些客戶端已訂閱該主題並將消息發送給他們。
最初發布消息的客戶端只關心將 PUBLISH 消息傳遞給代理。代理收到 PUBLISH 消息後,有責任將消息傳遞給所有訂閱者。發佈客戶端不會收到任何關於是否有人對發佈的消息感興趣或有多少客戶端從代理收到消息的反饋。
二、Subscribe(訂閱)
如果沒有人收到消息,那麼發佈消息就沒有意義。換句話說,如果沒有客戶端訂閱消息的主題。要接收有關感興趣主題的消息,客戶端會向 MQTT 代理髮送一條 SUBSCRIBE 消息。這個訂閱消息非常簡單,它包含一個唯一的數據包標識符和一個訂閱列表。
Packet Identifier 當消息在客戶端和代理之間流動時,數據包標識符唯一地標識一條消息。客戶端庫和/或代理負責設置此內部 MQTT 標識符。
List of Subscriptions 一個 SUBSCRIBE 消息可以包含一個客戶端的多個訂閱。每個訂閱都由一個主題和一個 QoS 級別組成。訂閱消息中的主題可以包含通配符,使訂閱主題模式而不是特定主題成爲可能。如果一個客戶端有重疊訂閱,則代理會傳遞該主題的具有最高 QoS 級別的消息。
三、Suback
爲了確認每個訂閱,代理向客戶端發送一個 SUBACK 確認消息。此消息包含原始訂閱消息的數據包標識符(以清楚地識別消息)和返回代碼列表。
Packet Identifier 數據包標識符是用於標識消息的唯一標識符。它與 SUBSCRIBE 消息中的相同。
Return Code 代理爲它在 SUBSCRIBE 消息中收到的每個主題/QoS 對發送一個返回代碼。例如,如果 SUBSCRIBE 消息有五個訂閱,則 SUBACK 消息包含五個返回碼。返回代碼確認每個主題並顯示代理授予的 QoS 級別。如果代理拒絕訂閱,則 SUBACK 消息包含該特定主題的失敗返回代碼。例如,如果客戶端沒有足夠的權限訂閱主題或主題格式錯誤。
Return Code | Return Code Response |
---|---|
0 | Success - Maximum QoS 0 |
1 | Success - Maximum QoS 1 |
2 | Success - Maximum QoS 2 |
128 | Failure |
客戶端成功發送 SUBSCRIBE 消息並收到 SUBACK 消息後,它會獲取與 SUBSCRIBE 消息包含的訂閱中的主題匹配的每條已發佈消息。
四、Unsubscribe
SUBSCRIBE 消息的對應物是 UNSUBSCRIBE 消息。此消息刪除代理上客戶端的現有訂閱。 UNSUBSCRIBE 消息與 SUBSCRIBE 消息類似,具有包標識符和主題列表。
Packet Identifier 當消息在客戶端和代理之間流動時,數據包標識符唯一地標識一條消息。客戶端庫和/或代理負責設置此內部 MQTT 標識符。
List of Topic 主題列表可以包含客戶端想要取消訂閱的多個主題。只需發送主題(無 QoS)。無論最初訂閱的 QoS 級別如何,代理都會取消訂閱該主題。
五、Unsuback
爲了確認取消訂閱,代理向客戶端發送一個 UNSUBACK 確認消息。此消息僅包含原始 UNSUBSCRIBE 消息的數據包標識符(以清楚地識別消息)。
Packet Identifier 包標識符唯一地標識消息。如前所述,這與 UNSUBSCRIBE 消息中的數據包標識符相同。
客戶端收到代理的 UNSUBACK 後,可以假設 UNSUBSCRIBE 消息中的訂閱被刪除。