1.什麼是MQTT?
MQTT(Message Queuing Telemetry Transport, 訊息佇列遙測傳輸)是IBM主導開發的一個即時通訊協定, 其發展歷史大致如下:
1999年, IBM和Arcom共同發明了MQTT協議。
2004年, MQTT.org開放了論壇, 供大家廣泛參與。
2011年, IBM建立了Eclipse開源專案Paho, 並貢獻了代碼。 Eclipse Paho是MQTT的Java實現版本。
2013年, OASIS MQTT技術規範委員會成立。
2014年, MQTT正式成為推薦的物聯網傳輸協議標準。
MQTT是專門針對物聯網開發的羽量級傳輸協議, 它被設計用於羽量級的發佈/訂閱式消息傳輸, 旨在為低頻寬和不穩定的網路環境中的物聯網設備提供可靠的網路服務。
2.MQTT協定詳解
實現MQTT協定需要用戶端和伺服器端:
MQTT協定中有三種身份:發佈者(Publish)、代理(Broker)(伺服器)、訂閱者(Subscribe)。 其中, 消息的發佈者和訂閱者都是用戶端, 消息代理是伺服器, 消息發佈者可以同時是訂閱者。
MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分。
Topic, 可以理解為消息的類型, 訂閱者訂閱(Subscribe)後, 就會收到該主題的消息內容(payload)
payload, 可以理解為消息的內容, 是指訂閱者具體要使用的內容
MQTT協定報文內容分為固定報文頭、可變報文頭、消息體三部分。
2.1 固定頭部:
1.MessageType(0和15保留, 共占4個位元組)
2.DUP flag
用來在保證消息傳輸的可靠。 如果設置為1, 則在下面的變長頭部裡多加MessageId, 並需要回復確認, 保證消息傳輸完成, 但不能用於檢測消息重複發送。
3.Qos
主要用於PUBLISH(發佈態)消息的, 保證消息傳遞的次數。
00表示最多一次 即
01表示至少一次 即>=1
10表示一次, 即==1
11保留後用
4.Retain
主要用於PUBLISH(發佈態)的消息, 表示伺服器要保留這次推送的資訊, 如果有新的訂閱者出現, 就把這消息推送給它。 如果不設那麼推送至當前訂閱的就釋放了。
5.固定頭部的byte 2
用來保存可變頭部+消息體的總大小。
2.2 可變頭部
1.Protocol Name, UTF編碼的字元“MQIsdp”, 頭兩個是編碼名提長為6。
2.Protocol Version, 協議版本號, v3 也是固定的。
3.Connect Flag, 連接標識, 有點像固定頭部的。 8位元分別代表不同的標誌。 第1個位元組保留。
4.Keep Alive, 表示回應時間, 如果這個時間內, 連接或發送操作未完成, 則斷開tcp連接, 表示離線。
2.3 消息體(PayLoad)
只有3種消息有消息體:CONNECT, SUBSCRIBE, SUBACK。
CONNECT:主要是客戶機的ClientID, 訂閱的Topic和Message以及用戶名和密碼。
SUBSCRIBE:包含了一系列的要訂閱的主題以及QOS。
SUBACK:用於伺服器對於SUBSCRIBE所申請的主題及QOS進行確認和回復。
而PUBLISH是消息體中則保存推送的消息, 以二進位形式, 當然這裡的編輯可自訂。
3.MQTT協定特點
1.使用發佈/訂閱消息模式, 提供一對多的消息發佈, 解除應用程式耦合。
2. 對負載內容遮罩的消息傳輸。
3. 使用TCP/IP提供網路連接。
4. 有三種消息發佈服務品質:
“至多一次”, 消息發佈完全依賴底層 TCP/IP 網路。會發生消息丟失或重複。這一級別可用於如下情況:環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次發送。
“至少一次”,確保消息到達,但消息重複可能會發生。
“只有一次”,確保消息到達一次。這一級別可用於如下情況:在計費系統中,消息重複或丟失會導致不正確的結果。
5. 小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協定交換最小化,以降低網路流量。
6. 使用 Last Will 和 Testament 特性通知有關各方用戶端異常中斷的機制。
消息發佈完全依賴底層 TCP/IP 網路。會發生消息丟失或重複。這一級別可用於如下情況:環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次發送。“至少一次”,確保消息到達,但消息重複可能會發生。
“只有一次”,確保消息到達一次。這一級別可用於如下情況:在計費系統中,消息重複或丟失會導致不正確的結果。
5. 小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協定交換最小化,以降低網路流量。
6. 使用 Last Will 和 Testament 特性通知有關各方用戶端異常中斷的機制。