物聯網之MQTT3.1.1和MQTT5協議 (11) UNSUBSCRIBE報文

前言

客戶端發送UNSUBSCRIBE報文給服務端,用於取消訂閱主題。

UNSUBSCRIBE – 取消訂閱請求

UNSUBSCRIBE固定報頭

!在這裏插入圖片描述

UNSUBSCRIBE固定報頭的第3,2,1,0位是保留位且必須分別設置爲0,0,1,0。服務端必須認爲任何其它的值都是不合法的並關閉網絡連接。

剩餘長度字段
等於可變報頭長度加上有效載荷長度,編碼爲變長字節整數。

可變報頭

UNSUBSCRIBE報文可變報頭按順序包含以下字段:報文標識符和屬性(Properties)。

MQTT 3.1.1沒有屬性

UNSUBSCRIBE屬性

屬性長度

SUBSCRIBE可變報頭中屬性的長度被編碼爲變長字節整數。

用戶屬性

38 (0x26)Byte,用戶屬性(User Property)標識符。
跟隨其後的是一個UTF-8字符串鍵值對。

用戶屬性允許出現多次,以表示多個名字/值對。相同的名字可以出現多次。

UNSUBSCRIBE報文中的用戶屬性可以被客戶端用來向服務端發送訂閱相關的屬性。MQTT5不定義這些屬性的意義。

UNSUBSCRIBE載荷

UNSUBSCRIBE報文的有效載荷包含一列客戶端想要取消訂閱的主題過濾器列表。UNSUBSCRIBE報文中的主題過濾器必須是連續填充的UTF-8編碼字符串。

UNSUBSCRIBE報文的有效載荷必須至少包含一個消息過濾器。沒有有效載荷的UNSUBSCRIBE報文是違反協議的。

下圖展示了MQTT的UNSUBSCRIBE報文的載荷示例,包括兩個主題過濾器 “a/b”和“c/d”。

MQTT5和MQTT3.1.1一致

在這裏插入圖片描述

UNSUBSCRIBE行爲

UNSUBSCRIBE報文提供的主題過濾器(無論是否包含通配符)必須與服務端持有的這個客戶端的當前主題過濾器集合逐個字符比較。如果有任何過濾器完全匹配,那麼它(服務端)自己的訂閱將被刪除,否則不會有進一步的處理。

如果服務端刪除了一個訂閱:

在MQTT5時改成了當服務端收到UNSUBSCRIBE報文時

  • 它必須停止添加任何與主題過濾器匹配的新消息,以傳遞給客戶端。
  • 它必須完成任何與主題過濾器匹配的QoS 1或QoS 2消息的傳遞,並且已經開始發送給客戶端。
  • 它可以繼續傳遞任何緩衝的現有消息,以便傳遞給客戶端。

服務端必須發送UNSUBACK報文響應客戶端的UNSUBSCRIBE請求。UNSUBACK報文必須包含和UNSUBSCRIBE報文相同的報文標識符。即使沒有刪除任何主題訂閱,服務端也必須發送一個SUBACK響應。

如果服務端收到包含多個主題過濾器的UNSUBSCRIBE報文,它必須如同收到了一系列的多個UNSUBSCRIBE報文一樣處理那個報文,除了將它們的響應合併到一個單獨的UNSUBACK報文外。

【MQTT 5】

如果某個主題過濾器代表一個共享訂閱,此會話將被從該共享訂閱中刪除。如果此會話是該共享訂閱所關聯的唯一會話,該共享訂閱被刪除。

MQTT3沒有所謂的共享訂閱概念

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章