Mqtt(消息隊列遙測傳輸)是一種基于發布/訂閱模式的“輕量級”通信協議。該協議建立在TCP/IP協議之上,由IBM于1999年發布。mqtt的最大優點是,它可以用很少的代碼和有限的帶寬為連接的遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通信協議,它廣泛應用于物聯網、小型設備、移動應用等領域。
Mqtt是一種基于客戶機-服務器的消息發布/訂閱傳輸協議。Mqtt協議輕量級、簡單、開放且易于實現。這些特點使其具有廣泛的適用性。在許多情況下,包括受限環境,如機器對機器(M2M)通信和物聯網(IOT)。它已廣泛應用于通過衛星鏈路的通信傳感器、偶爾的撥號醫療設備、智能家居和一些小型設備。
Mqtt協議設計規范
由于物聯網的環境非常特殊,mqtt遵循以下設計原則:
(1)精簡和不增加可有可無的功能;
(2)發布/訂閱(Pub/sub)模式,以促進傳感器之間的消息傳輸;
(3)允許用戶動態創建主題,零運維成本;
(4)將傳輸容量降至最低,以提高傳輸效率;
(5)考慮了低帶寬、高延遲、網絡不穩定等因素;
(6)支持連續會話控制;
(7)了解客戶機的計算能力可能非常低;
(8)提供服務質量管理;
(9)假設數據未知,則不需要傳輸數據的類型和格式來保持靈活性。
3、Mqtt協議主要特征
Mqtt協議設計用于低帶寬和不可靠網絡中遠程傳感器和控制設備之間的通信。它具有以下主要特點:
(1)使用發布/訂閱消息模式可提供一對多消息發布和解耦應用程序。
這與XMPP非常相似,但mqtt的信息冗余比XMPP少得多,因為XMPP使用XML格式的文本傳輸數據。
(2)屏蔽有效負載內容的消息傳輸。
(3)使用TCP/IP提供網絡連接。
主流mqtt基于TCP連接推送數據,但也有一個基于UDP的版本,稱為mqttsn。因為這兩個版本基于不同的連接方法,所以它們的優缺點自然不同。
(4)有三種類型的消息發布服務質量:
“至少一次”,消息發布完全取決于底層TCP/IP網絡。可能會發生消息丟失或重復。此級別可用于以下情況。主讀取記錄是否丟失并不重要,因為在不久的將來會有第二次傳輸。此方法主要用于推送普通應用程序。如果您的智能設備在推送消息時未連接到Internet,并且過去未收到推送,則在再次聯網時將不會收到推送。
“至少一次”,以確保消息到達,但可能會發生消息重復。
“僅一次”以確保消息到達一次。此級別可用于某些要求嚴格的計費系統。在計費系統中,重復或丟失消息將導致錯誤結果。這項最高質量的消息發布服務還可用于推送即時消息應用程序,以確保用戶接收并只接收一次。
(5)傳輸量小,開銷低(固定長度報頭為2字節),協議切換最小化,以減少網絡流量。
這就是為什么在導言中說它非常適合“傳感器和服務器之間的通信以及物聯網領域的信息收集”。您應該知道,嵌入式設備的計算能力和帶寬相對較弱。使用此協議傳輸消息非常合適。
(6)一種通過使用最后遺囑和遺囑特征通知相關方客戶端異常中斷的機制。
遺言:遺言機制,用于通知同一主題下的其他設備發送遺言的設備已斷開連接。
遺囑:遺囑機制,類似于最后遺囑。
4、Mqtt協議原理
4.1mqtt協議的實現模式
mqtt協議的實現需要客戶端和服務器端通信。在通信過程中,mqtt協議中有三個標識:發布者、代理(服務器)和訂閱者。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。
mqtt傳輸的消息分為兩部分:主題和有效負載:
(1)主題可以理解為消息的類型。訂閱后,訂閱方將收到該主題的消息內容(有效載荷);
(2)有效載荷可以理解為消息的內容,指訂戶要使用的特定內容。
4.2網絡傳輸和應用信息
Mqtt將構建底層網絡傳輸:它將建立客戶端到服務器的連接,并在兩者之間提供有序、無損、基于字節流的雙向傳輸。
當應用程序數據通過mqtt網絡發送時,mqtt將把服務質量(QoS)和與其相關的主題關聯起來。
4.3mqtt客戶端
使用mqtt協議的應用程序或設備。它始終與服務器建立網絡連接。客戶可以:
(1)發布其他客戶可能訂閱的信息;
(2)訂閱其他客戶端發布的消息;
(3)取消訂閱或刪除應用程序消息;
(4)斷開與服務器的連接。
4.4mqtt服務器
mqtt服務器稱為“消息代理”,可以是應用程序或設備。它位于消息發布者和訂閱者之間。它可以:
(1)接受客戶的網絡連接;
(2)接受客戶發布的申請信息;
(3)處理客戶的訂閱和取消訂閱請求;
(4)將應用程序消息轉發給訂閱的客戶。
4.5mqtt協議中的訂閱、主題和會話
1、訂閱
訂閱包括主題過濾器和最大服務質量(QoS)。訂閱與會話相關聯。一個會話可以包含多個訂閱。每個會話中的每個訂閱都有不同的主題篩選器。
2、會議
在每個客戶機與服務器建立連接后,這是一個會話,客戶機和服務器之間存在狀態交互。網絡之間存在會話,或者會話可能跨越客戶端和服務器之間的多個連續網絡連接。
3、主題名稱
連接到與服務器訂閱匹配的應用程序消息的標簽。服務器向訂閱匹配標記的每個客戶端發送一條消息。
4、主題過濾器
主題名稱的通配符篩選器,在訂閱表達式中用于表示訂閱匹配的多個主題。
5、載荷(有效載荷)
消息訂閱者接收的特定內容。
4.6mqtt協議中的方法
Mqtt協議定義了一些方法(也稱為操作)來表示對已確定資源的操作。此資源可以表示預先存在的數據或動態生成的數據,具體取決于服務器的實現。一般來說,資源指的是服務器上的文件或輸出。主要方法是:
(1)連接。等待與服務器建立連接。
(2)斷開連接。等待mqtt客戶端完成其工作,并斷開TCP/IP會話與服務器的連接。
(3)訂閱。等待訂閱完成。
(4)取消訂閱。等待服務器從客戶端取消訂閱一個或多個主題。
(5)mqtt客戶端發送消息請求,并在發送后返回應用程序線程。
5、Mqtt協議包結構
在mqtt協議中,mqtt數據包由固定報頭、可變報頭和有效負載組成。mqtt數據包結構如下所示:
(1)固定標題。它存在于所有mqtt數據包中,并表示數據包的數據包類型和數據包類ID。
(2)可變標題。它存在于某些mqtt數據包中。數據包類型確定變量頭是否存在及其特定內容。
(3)消息正文(有效負載)。它存在于某些mqtt數據包中,表示客戶端接收到的特定內容。
5.1mqtt固定頭
固定頭存在于所有mqtt包中,其結構如下:
5.1.1mqtt數據包類型
位置:字節1中的第7-4位。
對應于4位無符號值,類型、值和說明如下:
5.1.2識別位
位置:字節1中的第3-0位。
在不使用標識位的消息類型中,標識位用作保留位。如果接收到無效標志,則接收端必須關閉網絡連接:
(1)DUP:已發布消息的副本。它用于確保信息的可靠傳輸。如果設置為1,則messageid將添加到以下可變長度,需要回復確認以確保消息傳輸完成,但不能用于檢測重復的消息傳輸。
(2)QoS:發布消息的服務質量,即消息傳遞的數量
?00:最多一次,即<=1
?01:至少一次,即>=1
?10:一次,即:=1
?11:保留
(3)Retain:發布保留ID,表示服務器希望保留這次推送的信息。如果出現新訂戶,請將消息推送到該訂戶。如果是,請將其推送到當前訂閱服務器并釋放。5.1.3剩余長度
地址:字節2。
固定標頭的第二個字節用于存儲可變長度標頭和消息正文的總大小,但不能直接存儲。這個字節可以擴展。其保存機制是前7位用于保存長度,最后一位用作標識。最后一位為1時,表示長度不足,需要用兩個字節保存。例如:將以下大小計算為0
5.2mqtt可變磁頭
mqtt數據包包含一個位于固定頭和有效負載之間的可變頭。可變報頭的內容因數據包類型而異。它通常用作數據包的標識:
許多類型的數據包包括一個2字節的數據包標識字段。這些類型的數據包包括:發布(QoS>0)、puback、pubrec、pubrel、pubcomp、訂閱、訂閱、取消訂閱、取消訂閱。
5.3有效載荷消息正文
有效負載消息正文是mqtt數據包的第三部分,它包含四種類型的消息:connect、subscribe、suback和unsubscribe:
(1)Connect,消息體的主要內容有:客戶端ID、訂閱主題、消息、客戶端用戶名和密碼。
(2)訂閱,消息體的內容是一系列要訂閱的主題和QoS。
(3)消息體的內容是服務器確認并回復subscribe應用的主題和QoS。
(4)取消訂閱:消息正文的內容是要訂閱的主題。