MQTT物聯(lián)網(wǎng)通信協(xié)議概論

實(shí)時(shí)通信協(xié)議是物聯(lián)網(wǎng)技術(shù)中的一項(xiàng)根本性技術(shù)痒给,在數(shù)據(jù)的有效傳輸说墨、及時(shí)通信方面不可或缺骏全,在物聯(lián)網(wǎng)領(lǐng)域發(fā)揮著至關(guān)重要的作用,因此物聯(lián)網(wǎng)通信協(xié)議的制定至關(guān)重要尼斧。目前物聯(lián)網(wǎng)設(shè)備廣泛使用的有四大實(shí)時(shí)協(xié)議XMPP姜贡、REST/HTTP、CoAP以及MQTT棺棵。XMPP是一種基于標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集XML的協(xié)議鲁豪,它繼承了在XML環(huán)境中靈活的發(fā)展性,但對(duì)于嵌入式設(shè)備來(lái)說(shuō)律秃,解析非常困難;REST (Representational State Transfe)是一種架構(gòu)風(fēng)格治唤,即表述性狀態(tài)傳遞棒动,它基于HTTP定義了一組約束和屬性,適用于web服務(wù)宾添,在物聯(lián)網(wǎng)方面主要被應(yīng)用于基于HTTP web服務(wù)的轉(zhuǎn)化船惨,但對(duì)于嵌入式設(shè)備而言,目前很多物聯(lián)網(wǎng)接入設(shè)備大多屬于資源受限型設(shè)備缕陕,只擁有有限的計(jì)算能力和有限的存儲(chǔ)空間粱锐,故相比較而言REST/HTTP屬于重量級(jí)協(xié)議;由于物聯(lián)網(wǎng)中的很多設(shè)備屬于資源受限型扛邑,The Internet Engineering Task Force (IETF)提出了一種基于REST架構(gòu)的CoAP協(xié)議怜浅,Constrained Application Protocol (CoAP) 是一種針對(duì)受限設(shè)備的專用Internet應(yīng)用協(xié)議,CoAP是一種應(yīng)用層協(xié)議蔬崩,它運(yùn)行于UDP協(xié)議之上恶座,但是一對(duì)一的協(xié)議;MQTT(Message Queuing Telemetry Transport) 消息隊(duì)列遙測(cè)傳輸沥阳,是由IBM公司主導(dǎo)開(kāi)發(fā)的物聯(lián)網(wǎng)及時(shí)通信協(xié)議跨琳。MQTT是為大量計(jì)算能力有限的設(shè)備所設(shè)計(jì)的,使得設(shè)備工作在低帶寬桐罕、不可靠網(wǎng)絡(luò)的環(huán)境時(shí)脉让,能夠有效地進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)交互,進(jìn)而使得遠(yuǎn)程傳感器和控制設(shè)備能夠與服務(wù)器及時(shí)通訊功炮,故本文選作MQTT協(xié)議作為本次物聯(lián)網(wǎng)平臺(tái)的通訊協(xié)議溅潜。

MQTT協(xié)議闡述

MQTT協(xié)議由IBM主導(dǎo)開(kāi)發(fā)的一種輕量級(jí)基于客戶端-服務(wù)器的消息發(fā)布/訂閱模式的消息傳輸協(xié)議,同時(shí)MQTT協(xié)議基于TCP協(xié)議死宣,其運(yùn)行在TCP長(zhǎng)連接的基礎(chǔ)上伟恶,為網(wǎng)絡(luò)設(shè)備提供有序、可靠毅该、雙向連接的網(wǎng)絡(luò)連接保障博秫。作為廣泛的使用物聯(lián)網(wǎng)通訊協(xié)議潦牛,MQTT具有以下幾項(xiàng)重要特性:

(1)輕量級(jí)

因?yàn)槲锫?lián)網(wǎng)設(shè)備的特殊性,為了保證數(shù)據(jù)在低帶寬挡育、不可靠的網(wǎng)絡(luò)中傳輸有效的數(shù)據(jù)巴碗,故MQTT協(xié)議的設(shè)計(jì)原則是精簡(jiǎn),不添加可有可無(wú)的功能即寒,以保證協(xié)議的輕便性橡淆,因此MQTT協(xié)議頭部協(xié)議字段2只有兩字節(jié),盡量保持輕量級(jí)的特性母赵。

(2)支持發(fā)布(PUBLISH)/訂閱(SUBSCRIBE)模式

使用發(fā)布/訂閱模式解除了通信設(shè)備終端之間的耦合逸爵,解耦方式可以從多個(gè)方面進(jìn)行加以區(qū)分,主要有空間解耦凹嘲、時(shí)間解耦和同步解耦师倔。空間解耦:支持一對(duì)多周蹭、多對(duì)一趋艘、多對(duì)多的消息傳遞,發(fā)布者設(shè)備與訂閱者設(shè)備彼此相互獨(dú)立凶朗,消息發(fā)布者與訂閱者不知道彼此任何相關(guān)信息就可以實(shí)現(xiàn)數(shù)據(jù)交互瓷胧,比如對(duì)方的IP地址和端口,方便了消息在設(shè)備之間的傳遞棚愤;時(shí)間解耦:發(fā)布者和訂閱者無(wú)需同時(shí)運(yùn)行搓萧;同步解耦:在設(shè)備消息發(fā)布或接收期間,消息發(fā)布者與訂閱者的其他操作不會(huì)暫停遇八。

(3)提供三種級(jí)別Qos消息傳遞類型

當(dāng)Qos值為0時(shí)矛绘,為最多傳輸一次(At most once delivery),此種傳輸方式中刃永,發(fā)送方不需要收到服務(wù)器回應(yīng)货矮,消息可能到達(dá)服務(wù)器一次,或可能根本不會(huì)到達(dá)此種傳輸方式屬于允許消息丟失場(chǎng)景斯够,性能最高囚玫;當(dāng)Qos值為1時(shí),發(fā)送放至少發(fā)送一次(At least once delivery)读规,以確保消息到達(dá)接收方抓督,接收方需要返回確認(rèn)消息,在此情況下束亏,接受方可能會(huì)接收到重復(fù)消息铃在,即適合不允許消息丟失,但允許消息重復(fù)的場(chǎng)景,性能中等定铜。當(dāng)Qos值為2時(shí)阳液,消息體只到達(dá)一次并且保證消息送達(dá)(Exactly once delivery)。為確保響應(yīng)消息能夠到達(dá)發(fā)送方揣炕,接收方必須等待發(fā)送方對(duì)接受方響應(yīng)消息的響應(yīng)帘皿,只有收到發(fā)送方的確認(rèn)消息后,接收方才能對(duì)訂閱者投遞消息畸陡。

(4)提供遺囑機(jī)制

遺囑保留主要用于發(fā)布態(tài)(PUBLISH)的消息鹰溜,當(dāng)遺囑標(biāo)志(連接標(biāo)志的第二位)被設(shè)置為1,并且遺囑保留位(連接標(biāo)志的第五位)被設(shè)置為1丁恭,服務(wù)器端會(huì)將此次發(fā)送的消息作為遺囑消息保留發(fā)布曹动,即當(dāng)有新的訂閱者出現(xiàn),服務(wù)器會(huì)將此消息推送出去牲览。

MQTT控制報(bào)文格式

使用MQTT協(xié)議仁期,必須嚴(yán)格遵循MQTT控制報(bào)文格式來(lái)進(jìn)行通信,MQTT預(yù)定義的控制報(bào)文格式較為精簡(jiǎn)竭恬,主要由三部分組成:固定報(bào)頭(Fixed header)、可變報(bào)頭(Variable header)熬的、有效載荷(Payload)痊硕。控制報(bào)文結(jié)構(gòu)如圖所示押框。


控制報(bào)文結(jié)構(gòu)


固定報(bào)頭

每個(gè)MQTT控制報(bào)文都必須攜帶一個(gè)固定報(bào)頭岔绸,固定頭部部分占兩個(gè)字節(jié),共16位橡伞。固定報(bào)頭的控制報(bào)文格式如圖所示盒揉。


控制報(bào)文格式

MQTT控制報(bào)文類型有14種,依次為CONNECT(客戶端請(qǐng)求連接到服務(wù)器)兑徘、CONACK(連接確認(rèn))刚盈、PUBLISH(發(fā)布消息)、PUBACK(發(fā)布確認(rèn))挂脑、PUBREC(發(fā)布初稿)藕漱、PUBREL(出版發(fā)行)、PUBCOMP(發(fā)布完整)崭闲、SUBSCRIBE(客戶端訂閱請(qǐng)求)肋联、SUBACK(訂閱確認(rèn))、UNSUBSCRIBE(退訂請(qǐng)求)刁俭、UNSUBACK(退訂確認(rèn))橄仍、PINGREQ(Ping 請(qǐng)求)、PINGRESP(Ping 響應(yīng))、DISCONNECT(客戶端斷開(kāi)服務(wù)器連接)侮繁。如圖所示虑粥。


MQTT控制報(bào)文類型


控制報(bào)文類型的標(biāo)志位只有在PUBLISH(發(fā)布消息)類型時(shí)有效,其他控制報(bào)文類型標(biāo)志位現(xiàn)保留鼎天∫蹋控制報(bào)文類型的標(biāo)志位重發(fā)標(biāo)志DUP,在固定報(bào)頭第一字節(jié)第3位斋射,如果DUP標(biāo)志為0育勺,表示這是發(fā)送方第一次請(qǐng)求發(fā)送的PUBLISH報(bào)文,如果值為DUP標(biāo)志位被設(shè)置為1罗岖,表示這可能是早期報(bào)文請(qǐng)求的重發(fā)涧至。控制報(bào)文類型的標(biāo)志位服務(wù)質(zhì)量等級(jí)QoS桑包,在固定報(bào)頭第一字節(jié)2-1位南蓬,該字段表示消息傳遞類型。三種消息傳遞服務(wù)質(zhì)量如圖所示哑了。


三種消息傳遞服務(wù)質(zhì)量


剩余長(zhǎng)度字段是從報(bào)文段的第二個(gè)字節(jié)開(kāi)始赘方,剩余長(zhǎng)度字段(Remaining Length)是除固定頭部報(bào)文段以外的報(bào)文段,包括可變報(bào)頭和負(fù)載數(shù)據(jù)弱左。

可變報(bào)頭

MQTT報(bào)文字段除了必須的固定報(bào)頭窄陡,在某些MQTT控制報(bào)文中包含可變報(bào)頭字段,該報(bào)文段根據(jù)各報(bào)文類型的不同而不同拆火,具體可根據(jù)報(bào)文標(biāo)識(shí)符識(shí)別跳夭。在PUBLISH控制報(bào)文、PUBACK控制報(bào)文们镜、PUBREC控制報(bào)文币叹、PUBREL控制報(bào)文、PUBCOMP控制報(bào)文模狭、SUBSCRIBE控制報(bào)文颈抚、SUBACK控制報(bào)文,UNSUBSCIBE控制報(bào)文嚼鹉、UNSUBACK控制報(bào)文的可變頭部部分都含有一個(gè)兩字節(jié)的可變頭部邪意,報(bào)文標(biāo)識(shí)符的作用是標(biāo)識(shí)區(qū)別報(bào)文,當(dāng)客戶端每發(fā)送一個(gè)新的類型的報(bào)文段時(shí)反砌,該客戶端所發(fā)送的報(bào)文中必須重新分配新的報(bào)文標(biāo)識(shí)符雾鬼,且新的控制報(bào)文標(biāo)識(shí)符必須是當(dāng)前未使用的報(bào)文標(biāo)識(shí)符,而當(dāng)由于某種原因該客戶端需要重新發(fā)送該控制報(bào)文時(shí)宴树,重發(fā)的控制報(bào)文必須攜帶與原控制報(bào)文的標(biāo)識(shí)符相同的報(bào)文標(biāo)識(shí)符策菜。當(dāng)客戶端收到該控制報(bào)文的確認(rèn)信息后,才可釋放該報(bào)文標(biāo)識(shí)符,即下次發(fā)送控制報(bào)文時(shí)可重用該報(bào)文標(biāo)識(shí)符又憨。

有效載荷

有效載荷用于攜帶應(yīng)用消息翠霍,位于固定首部和可變報(bào)頭之后,即位于控制報(bào)文的最后部分蠢莺,有效載荷不是每個(gè)控制報(bào)文必須攜帶的報(bào)文段寒匙,但是在CONNECT控制報(bào)文、SUBSCRIBE控制報(bào)文躏将、SUBACK控制報(bào)文锄弱、UNSUBSCRIBE控制報(bào)文中需要攜帶,在PUBLISH控制報(bào)文中為可選字段祸憋,在其他控制報(bào)文中不需要攜帶会宪。CONNECT控制報(bào)文段中有效載荷字段內(nèi)容主要是客戶端的ClientID、遺囑主題蚯窥,遺囑消息以及用戶名和密碼掸鹅,且必須按此順序排列。SUBSCRIBE控制報(bào)文段中效載荷字段內(nèi)容是要訂閱的主題以及Qos拦赠。SUBACK控制報(bào)文段中效載荷字段內(nèi)容是對(duì)SUBSCRIBE控制報(bào)文所訂閱的主題的確認(rèn)和回復(fù)巍沙。SUBACK控制報(bào)文段中消息體內(nèi)容是要訂閱的主題。

MQTT控制報(bào)文

MQTT客戶端荷鼠,即使用MQTT協(xié)議通訊的程序或設(shè)備赎瞎,其必須依照MQTT控制報(bào)文格式發(fā)送MQTT控制報(bào)文到服務(wù)器端。MQTT共14種不同的控制報(bào)文的類型颊咬。

CONNECT報(bào)文是客戶端連接到服務(wù)器端發(fā)送的第一個(gè)報(bào)文,并且牡辽,在一個(gè)網(wǎng)絡(luò)連接上喳篇,客戶端只能發(fā)送一次CONNECT控制報(bào)文,否則服務(wù)器將斷開(kāi)該連接态辛,并將該報(bào)文做違規(guī)處理麸澜。CONNECT控制報(bào)文的固定報(bào)頭如圖所示。


CONNECT控制報(bào)文的固定報(bào)頭


客戶端在成功建立TCP連接之后奏黑,發(fā)送CONNECT控制報(bào)文到服務(wù)器炊邦,服務(wù)器給出確認(rèn),客戶端收到該確認(rèn)消息后熟史,會(huì)發(fā)送SUBSCRIBE控制報(bào)文到服務(wù)器訂閱相應(yīng)的主題列表馁害,訂閱過(guò)程中客戶端設(shè)備至少訂閱一個(gè)主題。SUBSCRIBE控制報(bào)文也會(huì)指定Qos服務(wù)質(zhì)量等級(jí)蹂匹,服務(wù)器根據(jù)該報(bào)文發(fā)送 PUBLISH報(bào)文給客戶端碘菜。SUBSCRIBE控制報(bào)文固定報(bào)頭格式如圖所示。


SUBSCRIBE控制報(bào)文固定報(bào)頭


PUBLISH控制報(bào)文是消息推送方推送消息到服務(wù)器,或由服務(wù)推送消息到相應(yīng)主題訂閱者的應(yīng)用消息報(bào)文忍啸。PUBLISH報(bào)文固定報(bào)頭如圖2-7所示仰坦。第一個(gè)字節(jié)第三位DUP標(biāo)志位為重發(fā)標(biāo)志,如果DUP標(biāo)志位被設(shè)置為0计雌,表示這是客戶端或服務(wù)器端第一次請(qǐng)求發(fā)送本報(bào)文悄晃,如果是重新發(fā)送的報(bào)文,則DUP標(biāo)志應(yīng)設(shè)置為1凿滤。


PUBLISH報(bào)文固定報(bào)頭??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妈橄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸭巴,更是在濱河造成了極大的恐慌眷细,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃祖,死亡現(xiàn)場(chǎng)離奇詭異溪椎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)恬口,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門校读,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祖能,你說(shuō)我怎么就攤上這事歉秫。” “怎么了养铸?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雁芙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我钞螟,道長(zhǎng)兔甘,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任鳞滨,我火速辦了婚禮洞焙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拯啦。我一直安慰自己澡匪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布褒链。 她就那樣靜靜地躺著唁情,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甫匹。 梳的紋絲不亂的頭發(fā)上荠瘪,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天夯巷,我揣著相機(jī)與錄音,去河邊找鬼哀墓。 笑死趁餐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的篮绰。 我是一名探鬼主播后雷,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吠各!你這毒婦竟也來(lái)了臀突?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贾漏,失蹤者是張志新(化名)和其女友劉穎候学,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纵散,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梳码,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伍掀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掰茶。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蜜笤,靈堂內(nèi)的尸體忽然破棺而出濒蒋,到底是詐尸還是另有隱情,我是刑警寧澤把兔,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布沪伙,位于F島的核電站,受9級(jí)特大地震影響县好,放射性物質(zhì)發(fā)生泄漏围橡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一聘惦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧儒恋,春花似錦善绎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至牧嫉,卻和暖如春剂跟,著一層夾襖步出監(jiān)牢的瞬間减途,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工曹洽, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳍置,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓送淆,卻偏偏與公主長(zhǎng)得像税产,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子偷崩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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