MQTT教程(二) MQTT中的可變報頭

2021-10-01 14:37:37 字數 3520 閱讀 9448

上一章節中已經知道了mqtt中報文的基本結構:

總結:本文對控制報文的研究不涉及到socket程式設計,只研究報文大概的工作模式以理解mqtt的工作方式。socket程式設計

本章中主要介紹幾個重點的報文格式,具體的socket實現可以參考文章。其他報文的格式大同小異,可以查閱官方文件

connect報文有且只有乙個,並且是客戶端到服務端建立連線後的第乙個報文,服務端必須將客戶端傳送的第二個connect報文當作協議違規處理並斷開客戶端的連線。

1.固定頭部

固定頭部同前面說明的一樣,包含報文型別和保留字段。具體格式如下:

connect報文固定頭部

2.可變頭部

connect報文的可變報頭按下列次序包含四個字段:

2.1 協議名

協議名是表示協議名 mqtt 的utf-8編碼的字串。mqtt規範的後續版本不會改變這個字串的偏移和長度。如果協議名不正確,服務端需要斷開客戶端的連線。

協議名格式如下:

connect中的協議名

2.2 協議級別

協議級別通俗來講就是協議的版本。

客戶端用8位的無符號值表示協議的修訂版本。對於3.1.1版協議,協議級別欄位的值是4(0x04)。如果發現不支援的協議級別,服務端必須給傳送乙個返回碼為0x01(不支援的協議級別)的connack報文響應connect報文,然後斷開客戶端的連線。

mqtt3.1.1的協議級別格式如下:

協議級別

2.3 連線標誌

連線標誌位元組包含一些用於指定mqtt連線行為的引數。它還指出playload欄位是否存在。

連線標誌的結構:

連線標誌

備註

1.有效負載(playload)欄位的存在與否並不是reserved欄位來指定,而是will flag、user name等字段。比如:如果will flag為1,則負載中需要包含will tpoic、will message等字段。如果需要使用者名稱密碼,則負載中需要包含這些資訊。

2.服務端必須驗證connect控制報文的保留標誌位(第0位reserved)是否為0,如果不為0必須斷開客戶端連線

所有連線標誌的意義:

標誌明位置

意義clean session

連線標誌位元組的第1位

告訴服務端是否需要基於客戶端識別符號,在對應的會話(session)中儲存連線斷開過程中收到的級別為qos1和qos2的訊息並在連線恢復後想客戶端進行分發

will flag

連線標誌的第2位

是否開啟遺囑訊息模式,如果為yes,則服務端需要儲存負載中客戶端傳送的will topic和will message

will qos

連線標誌的第4和第3位

遺囑訊息的安全級別,占用2byte,值為0、1、2

will retain

連線標誌的第5位

遺囑訊息是否需要作為保留訊息發布

password flag

連線標誌的第6位。

是否需要密碼

user name flag

連線標誌的第7位

是否需要使用者名稱

2.4 keep alive

是乙個以秒為單位的最大時間間隔,表示為乙個16位的字。

其格式如下:

備註:

msb表示最大有效為,lsb表示最小有效位。這裡沒有什麼特殊含義,也不msb也不表示正負,這裡只是表示兩個位元組來描述keep alive。至於官方文件中說明keep alive允許的最大值是18小時12分15秒,這是從2^16/3600=18.2044得出的

keep alive說明:

備註:

不管保持連線的值是多少,任何時候,只要服務端認為客戶端是不活躍或無響應的,可以斷開客戶端的連線。

至此,connect報文的所有內容已經學習,最後用官方文件的connect結構圖來總結:

connect報文

connack報文內容固定如下:

安全級別主要應用在訊息發布中,三種安全級別的訊息傳送機制如下:

mqtt中的遺囑模式是什麼:

服務端或者客戶端異常斷開時,服務端需要將特定主題(will topic)的訊息(will message)傳送給訂閱過該主題的客戶端。

遺囑訊息發布的條件,包括但不限於:

客戶端正常的使用disconnect報文斷開連線的情況下,will message不會被傳送。will message只用於客戶端異常斷開連線時,服務端傳送一組特定主題(topic)的訊息(message)

什麼是保留機制:

簡而言之就是客戶端告訴這條訊息是否需要分發給之後建立連線的新客戶

保留訊息的工作機制:

retain訊息的工作機制

注意:

疑問:

如果will message的retain標誌位1。當客戶端正常disconnect時,服務端刪除的是服務端儲存的will message還是session中的will message?也就是說,正常斷開連線後,如果另外乙個client建立了乙個新的連線並訂閱了那個will topic,此時該client是否能收到will message?

初步結論:通過retain和will的設計目的來講,當正常disconnect時,服務端會刪除服務端儲存的will message,也就是新進的client不會收到這個已刪除的will message

MQTT協議詳解及開發教程(一)MQTT協議概述

推薦一款穩定的基於c編寫的mqtt client開源庫 cmqtt mqtt協議目前在物聯網技術中應用非常廣泛,各種公有雲的iot平台通訊基本上都是按照該協議來實現的,這裡先簡單的做個總結 1 mqtt協議框架及內容比較標準,可以認為是 物聯網行業的modbus協議 2 不同廠家的mqtt 伺服器或...

MQTT 入門介紹 菜鳥教程

mqtt message queuing telemetry transport,訊息佇列遙測傳輸協議 是一種基於發布 訂閱 publish subscribe 模式的 輕量級 通訊協議,該協議構建於tcp ip協議上,由ibm在1999年發布。mqtt最大優點在於,可以以極少的 和有限的頻寬,為連...

MQTT在react native中的執行

mqtt 1 什麼是mqtt?mqtt message queuing telemetry transport,訊息佇列遙測傳輸協議 是一種基於發布 訂閱 publish subscribe 模式的 輕量級 通訊協議,輕量,高效,具體,請參考菜鳥教程 2 mqtt的幾個重要概念 3 mqtt的幾個方...