前言
服務端發送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(報文標識符已佔用)),則對每個主題過濾器都使用此原因碼。