物聯(lián)網(wǎng)是對(duì)傳統(tǒng)互聯(lián)網(wǎng)的擴(kuò)展和擴(kuò)展。用戶終端從傳統(tǒng)計(jì)算機(jī)擴(kuò)展到任何設(shè)備,其中該設(shè)備先通過(guò)各種傳感器收集信息,然后再通過(guò)計(jì)算設(shè)備收集信息、交換和交流網(wǎng)絡(luò)信息。之所以出現(xiàn)MQTT協(xié)議,是因?yàn)橐苿?dòng)互聯(lián)網(wǎng)目前尚處于起步階段,無(wú)法提供可靠的網(wǎng)絡(luò)保證。
MQTT是基于TCP/IP協(xié)議棧構(gòu)建的異步通信消息協(xié)議,是一種輕量級(jí)的發(fā)布/訂閱信息傳輸協(xié)議。MQTT在時(shí)間和空間上,將消息發(fā)送者與接受者分離,可以在不可靠的網(wǎng)絡(luò)環(huán)境中進(jìn)行擴(kuò)展。
適用于設(shè)備硬件存儲(chǔ)空間有限或網(wǎng)絡(luò)帶寬有限的場(chǎng)景。物聯(lián)網(wǎng)平臺(tái)支持設(shè)備使用MQTT協(xié)議接入MQTT的特點(diǎn)是可以保持長(zhǎng)連接,具有一定的實(shí)時(shí)性,云端向設(shè)備端發(fā)送消息,設(shè)備端可以在最短的時(shí)間內(nèi)接收到并作出響應(yīng),所以MQTT更適合需要實(shí)時(shí)控制的場(chǎng)合,更適合執(zhí)行器。要保持長(zhǎng)連接,那么就要時(shí)不時(shí)地發(fā)送心跳包,這就不會(huì)省電了。所以低功耗的場(chǎng)合并不適合MQTT。MQTT的長(zhǎng)連接需要建立在TCP的基礎(chǔ)上,TCP協(xié)議的復(fù)雜性決定了對(duì)設(shè)備的要求是比較高一些的,相比UDP。
特點(diǎn)
MQTT協(xié)議是為大量計(jì)算能力有限,且工作在低帶寬、不可靠的網(wǎng)絡(luò)的遠(yuǎn)程傳感器和控制設(shè)備通訊而設(shè)計(jì)的協(xié)議,它具有以下主要的幾項(xiàng)特性:
使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合;
對(duì)負(fù)載內(nèi)容屏蔽的消息傳輸;
使用 TCP/IP 提供網(wǎng)絡(luò)連接;
有三種消息發(fā)布服務(wù)質(zhì)量:QoS(定閱等級(jí)),分0、1、2三個(gè)等級(jí),簡(jiǎn)單來(lái)說(shuō)是等級(jí)越高越可靠。
“至多一次”(QoS0):消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無(wú)所謂,因?yàn)椴痪煤筮€會(huì)有第二次發(fā)送。即是推送之后就完事了,至于對(duì)方有沒(méi)有收到,收到是什么,數(shù)據(jù)有沒(méi)有丟失,都不管。
“至少一次”(QoS1):確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。即使你收到推送后,你還得返回一個(gè)puback給對(duì)方,告訴對(duì)方收到了,不然對(duì)方會(huì)以為你沒(méi)收到,隔一段時(shí)間后重新給你推送,直到你給對(duì)方返回一個(gè)Puback為止。
“只有一次”(QoS2):確保消息到達(dá)一次。這一級(jí)別可用于如下情況,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果?! ?/p>
小型傳輸,開(kāi)銷很小(固定長(zhǎng)度的頭部是2字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量;
使用 Last Will 和 Testament 特性通知有關(guān)各方客戶端異常中斷的機(jī)制。
Last Will:即遺言機(jī)制,用于通知同一主題下的其他設(shè)備發(fā)送遺言的設(shè)備已經(jīng)斷開(kāi)了連接。
Testament:遺言機(jī)制,功能類似于Last Will。
MQTT客戶端可以注冊(cè)一個(gè)典型的遺愿遺囑消息,如果它們斷開(kāi)連接,由代理發(fā)送。這些消息可以用于向訂閱者發(fā)出信號(hào),當(dāng)設(shè)備斷開(kāi)連接時(shí)。
優(yōu)點(diǎn)
1.MQTT的獨(dú)特功能是每個(gè)消息頭都可以縮短為2個(gè)字節(jié)。對(duì)于HTTP,為每個(gè)新請(qǐng)求消息重新建立HTTP連接會(huì)產(chǎn)生可觀的開(kāi)銷。 MQ和MQTT使用的持久連接可以大大減少這種開(kāi)銷。
2.包容不穩(wěn)定的網(wǎng)絡(luò),MQTT和MQ可以從諸如斷開(kāi)連接之類的故障中恢復(fù),無(wú)需進(jìn)一步的代碼要求。但是,HTTP本身無(wú)法實(shí)現(xiàn)此目標(biāo),并且客戶端必須重試編碼,這會(huì)增加身份問(wèn)題。
3.低功耗MQTT專為低功耗目標(biāo)而設(shè)計(jì)。 HTTP設(shè)計(jì)未考慮此因素,這會(huì)增加功耗。
4.在連接數(shù)百萬(wàn)個(gè)客戶端的情況下,在HTTP堆棧中維護(hù)數(shù)百萬(wàn)個(gè)并發(fā)連接需要大量工作才能提供支持。盡管這種支持是可行的,但大多數(shù)商業(yè)產(chǎn)品都經(jīng)過(guò)優(yōu)化以處理此訂單上的持久連接。 IBM提供了IBM MessageSight,這是一種單機(jī)架安裝服務(wù)器,已經(jīng)過(guò)測(cè)試,可以通過(guò)MQTT處理多達(dá)一百萬(wàn)個(gè)并發(fā)設(shè)備。相反,MQ不是為許多同時(shí)進(jìn)行的客戶設(shè)計(jì)的。
5.推送通知。您需要能夠及時(shí)向客戶發(fā)送通知。為此,您應(yīng)該使用常規(guī)的輪詢或推送方法。就電池,系統(tǒng)負(fù)載和帶寬而言,推送是最佳解決方案。
6.客戶端平臺(tái)的差異。 HTTP和MQTT客戶端都在許多平臺(tái)上實(shí)現(xiàn)。 MQTT的簡(jiǎn)單性可幫助您以最少的努力在其他客戶端上實(shí)施MQTT。
7.防火墻容錯(cuò)能力。某些公司防火墻將出站連接限制到某些預(yù)定義的端口,這些端口通常僅限于HTTP(端口80),HTTPS(端口443)等,HTTP在這種情況下顯然可以工作。 MQTT封裝在WebSockets連接中,并顯示為HTTP升級(jí)請(qǐng)求,因此可以在這種情況下運(yùn)行。
缺點(diǎn)
實(shí)際上,MQTT被廣泛使用,可以在幾乎任何大型硬件和互聯(lián)網(wǎng)公司中找到,例如Facebook,BP,阿里巴巴,百度。
由于MQTT本身的技術(shù)優(yōu)勢(shì),越來(lái)越多的公司選擇MQTT作為物聯(lián)網(wǎng)產(chǎn)品通信的標(biāo)準(zhǔn)協(xié)議。結(jié)果,工程師逐漸意識(shí)到MQTT協(xié)議的功能需要大規(guī)模商業(yè)化進(jìn)行改進(jìn)。例如:
1.如果沒(méi)有完整的SDK,則需要用于不同異構(gòu)設(shè)備的軟件SDK軟件包才能與MQTT服務(wù)器(例如MCU,Linux,Android,IOS,WEB)進(jìn)行通信,以實(shí)現(xiàn)互連和互操作性。
2.不支持文件和AV。在某些應(yīng)用場(chǎng)景中,需要傳輸?shù)男畔⒖赡懿幌抻谛枰ㄟ^(guò)AV與文件通信的指令,例如語(yǔ)音和視頻信號(hào)。
3.不支持與第三方HTTP集成。 MQTT協(xié)議優(yōu)于常規(guī)HTTP協(xié)議,但是基于傳統(tǒng)HTTP協(xié)議的WEB服務(wù)器仍在主流市場(chǎng)中占主導(dǎo)地位。這些服務(wù)器應(yīng)與MQTT協(xié)議互連,以降低升級(jí)成本。
4.不支持負(fù)載分配。負(fù)載分配服務(wù)器對(duì)于高并發(fā)性和防止惡意攻擊也是必不可少的。
5.不支持用戶管理界面。當(dāng)用戶分析設(shè)備行為數(shù)據(jù)時(shí),這一點(diǎn)尤其重要。在工業(yè)4.0和大數(shù)據(jù)時(shí)代,這是不可避免的需求。
6.設(shè)備脫機(jī)后,不支持脫機(jī)消息來(lái)補(bǔ)償從MQTT服務(wù)器到設(shè)備的控制信息丟失。
7.不支持點(diǎn)對(duì)點(diǎn)通信,并且使用標(biāo)準(zhǔn)的MQTT協(xié)議。從理論上講,點(diǎn)對(duì)點(diǎn)通信可以通過(guò)相互訂閱來(lái)實(shí)現(xiàn),但是邏輯相對(duì)復(fù)雜并且涉及設(shè)備安全性。當(dāng)設(shè)備B和設(shè)備C相同時(shí)-在主體的情況下,設(shè)備A無(wú)法知道消息是來(lái)自設(shè)備B還是來(lái)自設(shè)備C,并且消息很可能是被設(shè)備D竊聽(tīng)的。
8.不支持群組通信或群組管理,而是實(shí)現(xiàn)群組成員的管理。小組成員可以交換消息,如果一個(gè)設(shè)備由多個(gè)人控制或多個(gè)設(shè)備由一個(gè)人控制,則此功能特別有用。