實(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)頭
每個(gè)MQTT控制報(bào)文都必須攜帶一個(gè)固定報(bào)頭岔绸,固定頭部部分占兩個(gè)字節(jié),共16位橡伞。固定報(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ù)器連接)侮繁。如圖所示虑粥。
控制報(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ì)量如圖所示哑了。
剩余長(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)頭如圖所示。
客戶端在成功建立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)頭格式如圖所示。
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凿滤。