MQTT 5.0 新特性 |(一) 屬性與載荷

emqx發表於2019-12-23

MQTT 5.0 協議相比 MQTT 3.1.1 增加了很多屬性,這些屬性分佈於報文的可變頭部 ( Variable Header ) 和有效載荷 ( Payload ) 中。 MQTT 5.0 協議中攜帶有效載荷的報文有 CONNECT 報文,PUBLISH 報文,SUBSCRIBE 報文,SUBACK 報文,UNSUBSCRIBE 報文和 UNSUBACK 報文。 PUBLISH 報文的有效載荷負責儲存訊息內容,與 MQTT 3.1.1 協議相同。

CONNECT 報文

CONNECT 報文的可變頭部新增的屬性有:

MQTT 5.0 新特性 |(一) 屬性與載荷

在 CONNECT 報文的 Payload 中,部分欄位發生了變化,遺囑訊息(Will Message)變成了遺囑載荷(Will Payload)。Payload 中新增了遺囑屬性(Will Properties),用於定義遺囑訊息的行為。

新增的遺囑屬性有:

MQTT 5.0 新特性 |(一) 屬性與載荷

CONNACK 報文

CONNACK 報文沒有 Payload,在可變頭部中包含的屬性有:

MQTT 5.0 新特性 |(一) 屬性與載荷

PUBLISH 報文

PUBLISH 報文可變頭部的屬性有:

MQTT 5.0 新特性 |(一) 屬性與載荷

PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK 報文

PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, UNSUBACK 都具備以下三個屬性:

MQTT 5.0 新特性 |(一) 屬性與載荷

SUBSCRIBE 報文

SUBSCRIBE 報文的屬性同樣存在可變頭部中。

MQTT 5.0 新特性 |(一) 屬性與載荷

MQTT 5.0 中 SUBSCRIBE 報文中的 Payload 包含了訂閱選項(Subscription Options)。

MQTT 5.0 新特性 |(一) 屬性與載荷

訂閱選項(Subscription Options)的第 0 位和第 1 位表示 QoS 最大值。該欄位給出了伺服器可以傳送給客戶端應用訊息的最大 QoS 等級。如果 QoS 值為 3,就會觸發協議錯誤。 訂閱選項第 2 位表示非本地選項(No Local)。如果值為 1,應用訊息就不會發布給訂閱釋出主題的釋出者本身,如果在共享訂閱中將該選項設定為 1 的話,就會觸發協議錯誤。 訂閱選項的第 3 位表示保留為已釋出(Retain As Published)。若該值為 1,伺服器須將轉發訊息的 RETAIN flag 設為與接收到的 PUBLISH 報文的 RETAIN flag 一致。若該值為 0,不管接收到的 PUBLISH 報文中的 RETAIN flag 是何值,伺服器都需將轉發訊息的 RETAIN flag 置為 0。 訂閱選項的第 4 第 5 位表示保留處理 (Retain Handling)。該選項是用來控制保留訊息 (retained message) 的傳送。當保留處理的值為 0 時,伺服器須將保留訊息轉發到與訂閱匹配的主題上去。當該值為 1 時,如果訂閱已經不存在了,那麼伺服器需要將保留訊息轉發給與訂閱匹配的主題上,但是如果訂閱存在,伺服器就無法再轉發保留訊息。當該值為 2 時,伺服器不轉發保留訊息。 訂閱選項的第 6 第 7 位是預留給未來使用的。如果有效載荷的任何一個預留位非零,那麼伺服器就會將該報文視為格式錯誤的報文。

UNSUBSCRIBE 報文 UNSUBSCRIBE 報文僅有兩個屬性:屬性長度和使用者屬性。 UNSUBSCRIBE 報文的載荷相比 SUBSCRIBE 的載荷要簡單很多,它僅僅只是包含主題過濾器的列表,並不包含各種各樣的訂閱選項。 伺服器就會將該報文視為格式錯誤的報文。

DISCONNECT 報文(新增)

DISCONNECT 報文是 MQTT 5.0 新增的報文,它的引入意味著 mqtt broker 擁有了主動斷開連線的能力。DISCONNECT 報文所具備的屬性有:

MQTT 5.0 新特性 |(一) 屬性與載荷

相關文章