初識MQTT協議
女主宣言
最近在看MQTT協議相關的內容,先整理收集的一些資訊,以及自己的一些理解,如有錯誤之處,敬請糾正,有不清楚的地方,也希望能夠和大家一起討論,探討 本篇文章,簡述MQTT歷史,產生所要解決的問題,以及協議的基礎格式。
PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!
前言
MQTT協議是一個簡單的中心輻射型系統:感測器、應用和裝置之間的通訊是透過中央代理端執行的資料中心服務實現的。其精簡低頻寬的特性使得它能夠適用於很多應用,比如家庭自動化:包括供暖、通風、空調(HVAC)、照明、智慧裝置和安全等方面都採用了MQTT協議。
1
淺談歷史
MQTT協議由Andy Stanford-Clark(IBM)和Arlen Nipper(Arcom,現為Cirrus Link)於1999年發明。他們需要一種協議,以最小化電池損耗和最小頻寬,透過衛星與石油管道連線。 發明之初為協議規定了幾個要求:
實施簡單
提供服務質量的資料傳輸
輕巧和頻寬高效
資料不可知
持續的會話意識
2
協議格式
MQTT協議控制報文的格式包含以下三個部分,以固定報頭,可變報頭和有效載荷,其中固定報文頭是所有的控制報文都有, 可變報頭和有效載荷都是部分控制報文包含。
固定報頭
固定報頭是兩個位元組組成,其具體的格式如下所示:
控制報文型別
第一個位元組的二進位制位7-4無符號整數表示控制報文的型別,具體型別對應的值為:
備註: 其中預留值15已經在MQTT5中使用到AUTH中了。
標誌
第一個位元組的二進位制位3-0包含每個MQTT控制報文型別特定的標誌, 控制報文中的標誌為必須按照如下表格進行設定,如果設定有問題,則接收者必須斷開連線。
備註:從協議規範看出,目前只有PUBLISH的標誌位是使用的,其他控制報文都是預留狀態,但是必須保持上述表格的形式。
剩餘長度
第二個位元組表示當前報文剩餘部分的位元組數,包括可變報頭和有效載荷。剩餘長度不包括用於編碼剩餘長度欄位本身的位元組數。剩餘長度欄位使用一個變長度編碼方案,對小於128的值使用單位元組編碼,超過128的值,最高有效未用於指示是否有更多的位元組,因此每個位元組可以編碼128個數值和一個延續位,剩餘長度欄位最大4個位元組。 舉例:十進位制64被編碼為一個位元組,十六進位制表示為Ox40。十進位制數字321編碼為兩個位元組,最低有效位在前,第一個位元組65+128=193,第二個位元組為2。 剩餘長度最大為256M的報文,而且報文是不支援分包處理的,所以MQTT協議並不適合一些資料量特別大的場景,比如影片直播等資料包比較大的場景。
可變報頭
可變報頭介於固定報頭和有效載荷中間。不同的控制報文有著不同的可變報頭,其中PacketId是一個在多個控制報文中存在一個報文。 PacketId包含兩個位元組,現在包含該欄位的控制報文有,PUBLISH(Qos>0), PUBACK, PUBREC, PUBREL,PUBCOMP,SUBSCRIBE,SUBACK, UNSUBSCRIBE, UNSUBACK。
具體包含情況如下:
注意事項
PUBLISH Qos0的報文是不能又packetId的。
有些對應的控制報文中的packetId必須和與該控制報文繫結的其它控制報文保持一直,例如PUBLISH Qos1對應的是PUBACK,PUBLISH Qos2對應的PUBCOMP。
傳送者和接收者是分開維護各自的packetId,所以會出現互動雙方出現相同packetId的兩個不同的控制報文。
關於不能有packetId的控制報文,可能是由於packetId是可以複用的,沒有辦法確認可以複用的場景不能使用報文,比如Qos0的PUBLISH報文,由於沒有回應,所以傳送者無法得知packetId何時可以釋放複用,故不允許存在該欄位。
有效載荷
有效載荷即為應用訊息。 目前MQTT3.1.1中包含如下的控制報文CONNECT, CONNACK, PUBLISH, PUBACK,PUBREC, PUBREL, PUBCOMP,SUBSCRIBE,SUBACK,UNSUBSCRIBE,UNSUBACK,PINGREQ,PINGRESP,DISCONNECT的協議,關於這些協議的具體格式,使用場景等將在後續的文章中給出解釋。
3
總結
MQTT是二進位制的協議,控制欄位是精確到Bit級別的,單純這一點就足以為其在物聯網領域佔據一席之地。MQTT是不支援分包等機制,並不適宜一些資料包特別大的應用場景。
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2216445/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- raft協議初識Raft協議
- MQTT協議(二)MQQT協議
- MQTT協議實踐MQQT協議
- Mqtt協議規範MQQT協議
- MQTT 協議快速體驗MQQT協議
- MQTT 3.1.1協議[翻譯]MQQT協議
- HTTP協議和MQTT協議對比誰更好HTTP協議MQQT
- MQTT 協議 -- CONNECT & CONNACKMQQT協議
- 輕量通訊協議 --- MQTT協議MQQT
- 19_MQTT協議介紹MQQT協議
- MQTT工作筆記0001---MQTT協議概述MQQT筆記協議
- MQTT協議 -- 訊息報文格式MQQT協議
- MQTT 協議 Keep Alive 詳解MQQT協議
- MQTT 協議中的 Keep Alive 。MQQT協議
- mqtt 協議之 PINGREQ, PINGRESPMQQT協議
- MQTT協議 paho.mqtt.golang keepAlive原始碼淺析MQQT協議Golang原始碼
- 使用 EMQX 接入 MQTT-SN 協議裝置MQQT協議
- 車聯網場景中的 MQTT 協議MQQT協議
- MQTT協議詳解及v5.0實踐MQQT協議
- 21_MQTT協議_客戶端和服務端MQQT協議客戶端服務端
- MQTT 協議是個啥?這篇文章告訴你!MQQT協議
- MQTT協議簡介及百度雲物接入loT-MQTT測試MQQT協議
- 快速認識HTTP協議HTTP協議
- 小知識二、Then協議協議
- Http協議常用知識HTTP協議
- Kotlin Coroutine(協程): 二、初識協程Kotlin
- MQTT協議與阿里雲IoT物聯網平臺MQQT協議阿里
- MQTT協議從服務端到客戶端詳解MQQT協議服務端客戶端
- RTMP協議相關知識協議
- HTTP協議知識總結HTTP協議
- HTTP協議_入門知識HTTP協議
- HTTP協議冷知識大全HTTP協議
- MQTT物聯網通訊協議入門及Demo實現MQQT協議
- MQTT 協議在石油行業資料採集中的應用MQQT協議行業
- MQTT協議學習與在Java(Android通用)中的使用MQQT協議JavaAndroid
- 物流網首選協議,關於 MQTT 你需要了解這些協議MQQT
- 【乾貨】超詳細!TPC7062封裝MQTT協議教程封裝MQQT協議
- HTTP協議知識點總結HTTP協議