物聯網之MQTT3.1.1和MQTT5協議 (10) SUBACK報文

前言

服務端發送SUBACK報文給客戶端,用於確認它已收到並且正在處理SUBSCRIBE報文。

SUBACK – 訂閱確認

徵詢SUBACK報文包含一個返回碼清單,它們指定了SUBSCRIBE請求的每個訂閱被授予的最大QoS等級。

MQTT5是原因碼清單,該清單指定了,用於指定授予的最大QoS等級或SUBSCRIBE報文所請求的每個訂閱發生的錯誤。

SUBACK固定報頭

在這裏插入圖片描述

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

SUBACK可變報頭

SUBACK報文可變報頭按順序包含以下字段:所確認的SUBSCRIBE報文標識符,屬性(Properties)。

MQTT3.1.1沒有屬性

SUBACK屬性(MQTT5)

屬性長度

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

原因字符串

31 (0x1F)Byte,原因字符串(Reason String)標識符。
跟隨其後的是UTF-8編碼的字符串,表示此次響應相關的原因。此原因字符串(Reason String)是爲診斷而設計的可讀字符串,不應該被客戶端所解析。
服務端使用此值向客戶端提供附加信息。如果加上原因字符串之後的SUBACK報文長度超出了客戶端指定的最大報文長度,則服務端不能發送此原因字符串。包含多個原因字符串將造成協議錯誤(Protocol Error)。

用戶屬性

38 (0x26)Byte,用戶屬性(User Property)標識符。 跟隨其後的是UTF-8字符串對。此屬性可用於向客戶端提供包括診斷信息在內的附加信息。如果加上用戶屬性之後的SUBACK報文長度超出了客戶端指定的最大報文長度,則服務端不能發送此屬性 。用戶屬性(User Property)允許出現多次,以表示多個名字/值對,且相同的名字可以多次出現。

SUBACK報文可變報頭

在這裏插入圖片描述

個人感覺MQTT5此處展示的有問題

有效載荷

有效載荷包含一個返回碼【MQTT5爲原因碼】清單。每個返回碼【MQTT5爲原因碼】對應等待確認的SUBSCRIBE報文中的一個主題過濾器。返回碼【MQTT5爲原因碼】的順序必須和SUBSCRIBE報文中主題過濾器的順序相同。

MQTT3.1.1的SUBACK報文有效載荷格式

在這裏插入圖片描述

允許的返回碼值:

  • 0x00 - 最大QoS 0
  • 0x01 - 成功 – 最大QoS 1
  • 0x02 - 成功 – 最大 QoS 2
  • 0x80 - Failure 失敗

0x00, 0x01, 0x02, 0x80之外的SUBACK返回碼是保留的,不能使用。

有效載荷非規範示例

Success - Maximum QoS 0 0
Success - Maximum QoS 2 2
Failure 128

有效載荷字節格式非規範示例

描述 7 6 5 4 3 2 1 0
byte 1 Success - Maximum QoS 0 0 0 0 0 0 0 0 0
byte 2 Success - Maximum QoS 2 0 0 0 0 0 0 1 0
byte 3 Failure 1 0 0 0 0 0 0 0

訂閱原因碼

在這裏插入圖片描述

服務端發送SUBACK報文時必須對收到的每一個主題過濾器設置一種原因碼 。

對於SUBSCRIBE報文中的每個主題過濾器,總有一個對應的原因碼。如果原因碼不是針對某個特定的主題過濾器(比如0x91(報文標識符已佔用)),則對每個主題過濾器都使用此原因碼。

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