MQTT協(xié)議

一、協(xié)議概述

物聯(lián)網(wǎng)(Internet of Things,IoT)最近曝光率越來越高昂羡。雖然HTTP是網(wǎng)頁的事實標(biāo)準(zhǔn)待笑,不過機(jī)器之間(Machine-to-Machine鸣皂,M2M)的大規(guī)模溝通需要不同的模式:之前的請求/回答(Request/Response)模式不再合適,取而代之的是發(fā)布/訂閱(Publish/Subscribe)模式暮蹂。這就是輕量級寞缝、可擴(kuò)展的MQTT(Message Queuing Telemetry Transport)可以施展拳腳的舞臺。

MQTT是基于二進(jìn)制消息的發(fā)布/訂閱編程模式的消息協(xié)議仰泻,最早由IBM提出的荆陆,如今已經(jīng)成為OASIS規(guī)范。由于規(guī)范很簡單集侯,非常適合需要低功耗和網(wǎng)絡(luò)帶寬有限的IoT場景被啼,比如:遙感數(shù)據(jù)、汽車棠枉、智能家居浓体、智慧城市、醫(yī)療醫(yī)護(hù)辈讶。

由于物聯(lián)網(wǎng)的環(huán)境是非常特別的命浴,所以MQTT遵循以下設(shè)計原則:

--精簡,不添加可有可無的功能。

--發(fā)布/訂閱(Pub/Sub)模式生闲,方便消息在傳感器之間傳遞媳溺。

--允許用戶動態(tài)創(chuàng)建主題,零運(yùn)維成本跪腹。

--把傳輸量降到最低以提高傳輸效率褂删。

--把低帶寬、高延遲冲茸、不穩(wěn)定的網(wǎng)絡(luò)等因素考慮在內(nèi)屯阀。

--支持連續(xù)的會話控制。

--理解客戶端計算能力可能很低轴术。

--提供服務(wù)質(zhì)量管理难衰。

--假設(shè)數(shù)據(jù)不可知,不強(qiáng)求傳輸數(shù)據(jù)的類型與格式逗栽,保持靈活性盖袭。

運(yùn)用MQTT協(xié)議,設(shè)備可以很方便地連接到物聯(lián)網(wǎng)云服務(wù)彼宠,管理設(shè)備并處理數(shù)據(jù)鳄虱,最后應(yīng)用到各種業(yè)務(wù)場景,如下圖所示:

二凭峡、協(xié)議詳解

整個協(xié)議的構(gòu)造拙已,從整體上協(xié)議可拆分為: ? 固定頭部+可變頭部+消息體

1、固定頭部(fixed header):

構(gòu)造如下:

? ?? 1)Message Type(0和15保留摧冀,共占4個字節(jié))

2)DUP flag:其是用來在保證消息傳輸可靠的倍踪,如果設(shè)置為1,則在下面的變長頭部里多加MessageId,并需要回復(fù)確認(rèn)索昂,保證消息傳輸完成建车,但不能用于檢測消息重復(fù)發(fā)送。

3)QoS level:主要用于PUBLISH(發(fā)布態(tài))消息的椒惨,保證消息傳遞的次數(shù)缤至。

00表示最多一次 即<=1

01表示至少一次 ?即>=1

10表示一次,即==1

11保留后用

4)RETAIN:主要用于PUBLISH(發(fā)布態(tài))的消息康谆,表示服務(wù)器要保留這次推送的信息凄杯,如果有新的訂閱者出現(xiàn),就把這消息推送給它秉宿。如果不設(shè)那么推送至當(dāng)前訂閱的就釋放了戒突。

5)固定頭部的byte 2:是用來保存接下去的變長頭部+消息體的總大小的。但并不是直接保存的描睦,同樣也是可以擴(kuò)展的膊存,其機(jī)制是,前7位用于保存長度,后一位用做標(biāo)識隔崎。

舉個例子:即如果計算出后面的大小為 0<length<=127,正常保存今艺;如果是127<length<16383,則需要二個字節(jié)保存了,將第一個字節(jié)的最大的一位置1,表示未完爵卒。然后第二個字節(jié)繼續(xù)存虚缎。拿130來說,第一個字節(jié)存10000011,第二個字節(jié)存000000001钓株,也就是0x83,0x01,把兩個字節(jié)連起來看实牡,第二個字節(jié)權(quán)重從2的8次開始。同起可以加第3個字節(jié)轴合,最多可以加至第4個字節(jié)创坞。故MQTT協(xié)議最多可以實現(xiàn)268?435?455 (0xFF, 0xFF, 0xFF, 0x7F)將近256M的數(shù)據(jù)∈芨穑可謂能伸能縮题涨。

例如,數(shù)字64十進(jìn)制被編碼為單個字節(jié)总滩,十進(jìn)制值64纲堵,十六進(jìn)制0x40。數(shù)字321十進(jìn)制(= 65 + 2 * 128)被編碼為兩個字節(jié)闰渔,最不重要席函。第一個字節(jié)65 + 128 = 193。請注意澜建,頂部位被設(shè)置為至少指示一個后續(xù)字節(jié)。第二個字節(jié)是2蝌以。

2炕舵、可變頭部(variable header):

整體結(jié)構(gòu)為:

1)首先最上面的8個字節(jié)是Protocol Name(協(xié)議名稱),UTF編碼的字符“MQIsdp”跟畅,頭兩個是編碼名提長為6咽筋。這里多說 ?? 一些,接下去的協(xié)議多采用這種方式組合徊件,即頭兩個字節(jié)表示下一部分的長奸攻,然后后面跟上內(nèi)容。這里頭兩個字節(jié)長 ?? 為6虱痕,下面跟6個字符“MQIsdp”睹耐。

2)Protocol Version,協(xié)議版本號部翘,v3 也是固定的硝训。

3)Connect Flag,連接標(biāo)識,有點像固定頭部的窖梁。8位分別代表不同的標(biāo)志赘风。第1個字節(jié)保留。

? ? Clean Session,Will flag纵刘,Will Qos, Will Retain都是相對于CONNECT消息來說的邀窃。

?? Clean Session:0表示如果訂閱的客戶機(jī)斷線了,那么要保存其要推送的消息假哎,如果其重新連接時瞬捕,則將這些消息推 ? ? ?? 送。1表示消除位谋,表示客戶機(jī)是第一次連接山析,消息所以以前的連接信息。

? Will Flag掏父,表示如果客戶機(jī)在不是在發(fā)送DISCONNECT消息中斷笋轨,比如IO錯誤等,將些置為1,要求重傳赊淑。并且下面的 ? ? Will Qos和Will Retain也要設(shè)置爵政,消息體中的Topic和MessageID也要設(shè)置,就是表示發(fā)生了錯誤陶缺,要重傳钾挟。

? Will Qos,在CONNECT非正常情況下設(shè)置饱岸,一般如果標(biāo)識了Will Flag掺出,那么這個位置也要標(biāo)識。

?? Will RETAIN:同樣在CONNECT中苫费,如果標(biāo)識了Will Flag,那么些位也一定要標(biāo)識汤锨。

? usename flag和password flag,用來標(biāo)識是否在消息體中傳遞用戶和密碼百框,只有標(biāo)識了闲礼,消息體中的用戶名和密碼才 ? ?? 用效,只標(biāo)記密碼而不標(biāo)記用戶名是不合法的铐维。

4)Keep Alive柬泽,表示響應(yīng)時間,如果這個時間內(nèi)嫁蛇,連接或發(fā)送操作未完成锨并,則斷開tcp連接,表示離線睬棚。

5)Connect Return Code即通常于CONNACK消息中琳疏,表示返回的連接情況有决,我可以通過此檢驗連接情況。

6)Topic name(主題名稱):訂閱消息標(biāo)識空盼,MQTT是基于訂閱/發(fā)布的消息书幕,那么這個就是消息訂閱的標(biāo)識,像新聞客戶端里的訂閱不同的欄目一樣揽趾。用于區(qū)別消息的推送類別台汇。

主要用于PUBLISH和SUBSCRIBE中。最大可支持32767個字符篱瞎,即4個字節(jié)苟呐。

3、消息體(PayLoad)

只有3種消息有消息體CONNECT俐筋,SUBSCRIBE牵素,SUBACK。

CONNECT主要是客戶機(jī)的ClientID澄者,訂閱的Topic和Message以及用戶名和密碼笆呆,其于變長頭部中的will是對應(yīng)的。

SUBSCRIBE是包含了一系列的要訂閱的主題以及QOS粱挡。

SUBACK是用服務(wù)器對于SUBSCRIBE所申請的主題及QOS進(jìn)行確認(rèn)和回復(fù)赠幕。

而PUBLISH是消息體中則保存推送的消息,以二進(jìn)制形式询筏,當(dāng)然這里的編輯可自定義榕堰。

4、Message Identifier:消息標(biāo)識符存在于以下MQTT消息的變量頭中:PUBLISH嫌套,PUBACK逆屡,PUBREC,PUBREL踱讨,PUBCOMP魏蔗,SUBSCRIBE,SUBACK勇蝙,UNSUBSCRIBE沫勿,UNSUBACK挨约。

消息標(biāo)識符(Message ID)字段僅存在于固定報頭中的QoS位表示QoS級別1或2的消息中味混。其為16位字符表示,用于在Qos為1或2時標(biāo)識Message的诫惭,保證Message傳輸?shù)目煽啃浴?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翁锡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子夕土,更是在濱河造成了極大的恐慌馆衔,老刑警劉巖瘟判,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異角溃,居然都是意外死亡拷获,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門减细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匆瓜,“玉大人,你說我怎么就攤上這事未蝌⊥灾ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵萧吠,是天一觀的道長左冬。 經(jīng)常有香客問我,道長纸型,這世上最難降的妖魔是什么拇砰? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮绊袋,結(jié)果婚禮上毕匀,老公的妹妹穿的比我還像新娘。我一直安慰自己癌别,他們只是感情好皂岔,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著展姐,像睡著了一般躁垛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圾笨,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天教馆,我揣著相機(jī)與錄音,去河邊找鬼擂达。 笑死土铺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的板鬓。 我是一名探鬼主播悲敷,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼彬呻,長吁一口氣:“原來是場噩夢啊……” “哼您炉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起栖雾,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤抄腔,失蹤者是張志新(化名)和其女友劉穎瓢湃,沒想到半個月后理张,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡绵患,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年雾叭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片落蝙。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拷况,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掘殴,到底是詐尸還是另有隱情赚瘦,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布奏寨,位于F島的核電站起意,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏病瞳。R本人自食惡果不足惜揽咕,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望套菜。 院中可真熱鬧亲善,春花似錦、人聲如沸逗柴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽戏溺。三九已至渣蜗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旷祸,已是汗流浹背耕拷。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留托享,地道東北人骚烧。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像闰围,于是被迫代替她去往敵國和親赃绊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容