MQTT協議(Message Queuing Telemetry Transport)(消息隊列遙測傳輸)是一種基於發佈/訂閱模式的「輕量級」消息協議,是IBM公司於1999年提出的,由Andy Stanford-Clark(IBM)和Arlen Nipper(Eurotech,現爲Cirrus Link)於1999年開發。MQTT是一個基於TCP的發佈訂閱協議,設計的初始目的是爲了適用於極有限的內存設備和低帶寬的不可靠網絡通訊,很是適合物聯網通訊。MQTT 協議目前在 IoT(Internet of things,物聯網)、小型設備應用、移動應用等方面有較普遍的應用。服務器
與HTTP及其請求/響應範例相比,MQTT協議使用發佈/訂閱體系結構。發佈/訂閱是事件驅動的,能夠將消息推送到客戶端。中央通訊點是MQTT代理,它負責調度發送者和合法接收者之間的全部消息。向代理髮布消息的每一個客戶端都在消息中包含一個主題。主題是代理的路由信息。每一個想要接收消息的客戶端都訂閱某個主題,而且代理將具備匹配主題的全部消息傳遞給客戶端。網絡
MQTT 協議提供一對多的消息發佈,能夠解除應用程序耦合,信息冗餘小。該協議須要客戶端和服務端,而協議中主要有三種身份:發佈者(Publisher)、代理(Broker,服務器)、訂閱者(Subscriber)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,而消息發佈者也能夠同時是訂閱者,實現了生產者與消費者的解耦。ui
協議是通訊雙方的一個約定,即約定第1位傳輸什麼、第2位傳輸什麼。在MQTT協議中,一個MQTT數據包由:固定頭(Fixed header)、 可變頭(Variable header)、 消息體(payload)三部分構成。spa
固定頭(Fixed header):存在於全部MQTT數據包中,表示數據包類型及數據包的分組類標識設計
可變頭(Variable header):存在於部分MQTT數據包中,數據包類型決定了可變頭是否存在及具體內容代理
消息體(Payload),存在於部分MQTT數據包中,表示客戶端收到的具體內容隊列
固定頭存在於全部MQTT數據包中,其結構以下:事件
Bitip |
7內存 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
MQTT數據包類型 |
不一樣類型MQTT數據包的具體標識 |
||||||
byte 2… |
剩餘長度 |
位置:byte 1, bits 7-4。
相於一個4位的無符號值,類型以下:
名稱 |
值 |
流方向 |
描述 |
Reserved |
0 |
不可用 |
保留位 |
CONNECT |
1 |
客戶端到服務器 |
客戶端請求鏈接到服務器 |
CONNACK |
2 |
服務器到客戶端 |
鏈接確認 |
PUBLISH |
3 |
雙向 |
發佈消息 |
PUBACK |
4 |
雙向 |
發佈確認 |
PUBREC |
5 |
雙向 |
發佈收到(保證第1部分到達) |
PUBREL |
6 |
雙賂 |
發佈釋放(保證第2部分到達) |
PUBCOMP |
7 |
雙向 |
發佈完成(保證第3部分到達) |
SUBSCRIBE |
8 |
客戶端到服務器 |
客戶端請求訂閱 |
SUBACK |
9 |
服務器到客戶端 |
訂閱確認 |
UNSUBSCRIBE |
10 |
客戶端到服務器 |
請求取消訂閱 |
UNSUBACK |
11 |
服務器到客戶端 |
取消訂閱確認 |
PINGREQ |
12 |
客戶端到服務器 |
PING請求 |
PINGRESP |
13 |
服務器到客戶端 |
PING應答 |
DISCONNECT |
14 |
客戶端到服務器 |
中斷鏈接 |
Reserved |
15 |
不可用 |
保留位 |
位置:byte 1, bits 3-0。
在不使用標識位的消息類型中,標識位被作爲保留位。若是收到無效的標誌時,接收端必須關閉網絡鏈接:
數據包 |
標識位 |
Bit 3 |
Bit 2 |
Bit 1 |
Bit 0 |
CONNECT |
保留位 |
0 |
0 |
0 |
0 |
CONNACK |
保留位 |
0 |
0 |
0 |
0 |
PUBLISH |
MQTT 3.1.1使用 |
DUP1 |
QoS2 |
QoS2 |
RETAIN3 |
PUBACK |
保留位 |
0 |
0 |
0 |
0 |
PUBREC |
保留位 |
0 |
0 |
0 |
0 |
PUBREL |
保留位 |
0 |
0 |
0 |
0 |
PUBCOMP |
保留位 |
0 |
0 |
0 |
0 |
SUBSCRIBE |
保留位 |
0 |
0 |
0 |
0 |
SUBACK |
保留位 |
0 |
0 |
0 |
0 |
UNSUBSCRIBE |
保留位 |
0 |
0 |
0 |
0 |
UNSUBACK |
保留位 |
0 |
0 |
0 |
0 |
PINGREQ |
保留位 |
0 |
0 |
0 |
0 |
PINGRESP |
保留位 |
0 |
0 |
0 |
0 |
DISCONNECT |
保留位 |
0 |
0 |
0 |
0 |
DUP:發佈消息的副本。用來在保證消息的可靠傳輸,若是設置爲 1,則在下面的變長中增長MessageId,而且須要回覆確認,以保證消息傳輸完成,但不能用於檢測消息重複發送。
QoS:發佈消息的服務質量,即:保證消息傳遞的次數
00:最多一次,即:<=1
01:至少一次,即:>=1
10:一次,即:=1
11:預留
RETAIN: 發佈保留標識,表示服務器要保留此次推送的信息,若是有新的訂閱者出現,就把這消息推送給它,若是設有那麼推送至當前訂閱者後釋放。
位置:byte 1。
固定頭的第二字節用來保存變長頭部和消息體的總大小的,但不是直接保存的。這一字節是能夠擴展,其保存機制,前7位用於保存長度,後一部用作標識。當最後一位爲 1時,表示長度不足,須要使用二個字節繼續保存。 例如:計算出後面的大小爲0
MQTT數據包中包含一個可變頭,它駐位於固定的頭和負載之間。可變頭的內容因數據包類型而不一樣,較常的應用是作爲包的標識:
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
包標籤符(MSB) |
|||||||
byte 2… |
包標籤符(LSB) |
不少類型數據包中都包括一個2字節的數據包標識字段,這些類型的包有:PUBLISH (QoS > 0)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK
Payload消息體位MQTT數據包的第三部分,CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE四種類型的消息 有消息體:
CONNECT,消息體內容主要是:客戶端的ClientID、訂閱的Topic、Message以及用戶名和密碼。
SUBSCRIBE,消息體內容是一系列的要訂閱的主題以及QoS。
SUBACK,消息體內容是服務器對於SUBSCRIBE所申請的主題及QoS進行確認和回覆。
UNSUBSCRIBE,消息體內容是要訂閱的主題。