物聯網應用層協定介紹(二)——MQTT
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,協議版本號,
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 特性通知有關各方用戶端異常中斷的機制。
當然這裡的編輯可自訂。3.MQTT協定特點
1.使用發佈/訂閱消息模式,提供一對多的消息發佈,解除應用程式耦合。
2. 對負載內容遮罩的消息傳輸。
3. 使用TCP/IP提供網路連接。
4. 有三種消息發佈服務品質:
“至多一次”,消息發佈完全依賴底層 TCP/IP 網路。會發生消息丟失或重複。這一級別可用於如下情況:環境感測器資料,丟失一次讀記錄無所謂,因為不久後還會有第二次發送。
“至少一次”,確保消息到達,但消息重複可能會發生。
“只有一次”,確保消息到達一次。這一級別可用於如下情況:在計費系統中,消息重複或丟失會導致不正確的結果。
5. 小型傳輸,開銷很小(固定長度的頭部是 2 位元組),協定交換最小化,以降低網路流量。
6. 使用 Last Will 和 Testament 特性通知有關各方用戶端異常中斷的機制。