一.MQTT簡介
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)是可以保持長連接,具有一定的實(shí)時(shí)性,云端向設(shè)備端發(fā)送消息,設(shè)備端可以在最短的時(shí)間內(nèi)接收到并作出響應(yīng),所以MQTT更適合需要實(shí)時(shí)控制的場(chǎng)合,更適合執(zhí)行器。要保持長連接,那么就要時(shí)不時(shí)地發(fā)送心跳包,這就不會(huì)省電了。所以低功耗的場(chǎng)合并不適合MQTT。MQTT的長連接需要建立在TCP的基礎(chǔ)上,TCP協(xié)議的復(fù)雜性決定了對(duì)設(shè)備的要求是比較高一些的,相比UDP。
二.MQTT框架圖
三.MQTT特點(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í),簡單來說是等級(jí)越高越可靠。
“至多一次”(QoS0):消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因?yàn)椴痪煤筮€會(huì)有第二次發(fā)送。即是推送之后就完事了,至于對(duì)方有沒有收到,收到是什么,數(shù)據(jù)有沒有丟失,都不管。
“至少一次”(QoS1):確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。即是你收到推送后,你還得返回一個(gè)puback給對(duì)方,告訴對(duì)方收到了,不然對(duì)方會(huì)以為你沒收到,隔一段時(shí)間后重新給你推送,直到你給對(duì)方返回一個(gè)Puback為止。
“只有一次”(QoS2):確保消息到達(dá)一次。這一級(jí)別可用于如下情況,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果。
- 小型傳輸,開銷很小(固定長度的頭部是2字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量;
- 使用 Last Will 和 Testament 特性通知有關(guān)各方客戶端異常中斷的機(jī)制。
Last Will:即遺言機(jī)制,用于通知同一主題下的其他設(shè)備發(fā)送遺言的設(shè)備已經(jīng)斷開了連接。 ? Testament:遺言機(jī)制,功能類似于Last Will。
MQTT客戶端可以注冊(cè)一個(gè)典型的遺愿遺囑消息,如果它們斷開連接,由代理發(fā)送。這些消息可以用于向訂閱者發(fā)出信號(hào),當(dāng)設(shè)備斷開連接時(shí)。
四.MQTT協(xié)議原理
1.MQTT協(xié)議實(shí)現(xiàn)框圖
?
2.MQTT協(xié)議實(shí)現(xiàn)方式
實(shí)現(xiàn)MQTT協(xié)議需要:客戶端和服務(wù)器端MQTT協(xié)議中有三種身份:發(fā)布者(Publish)、代理(Broker)(服務(wù)器)、訂閱者(Subscribe)。其中,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布者可以同時(shí)是訂閱者。
MQTT傳輸?shù)南⒎譃椋褐黝}(Topic)和負(fù)載(payload)兩部分
- Topic:可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會(huì)收到該主題的消息內(nèi)容(payload)。
- Payload:可以理解為消息的內(nèi)容,是指訂閱者具體要使用的內(nèi)容。
3.網(wǎng)絡(luò)傳輸與應(yīng)用消息
MQTT會(huì)構(gòu)建底層網(wǎng)絡(luò)傳輸:它將建立客戶端到服務(wù)器的連接,提供兩者之間的一個(gè)有序的、無損的、基于字節(jié)流的雙向傳輸。當(dāng)應(yīng)用數(shù)據(jù)通過MQTT網(wǎng)絡(luò)發(fā)送時(shí),MQTT會(huì)把與之相關(guān)的服務(wù)質(zhì)量(QoS)和主題名(Topic)相關(guān)連。
4.MQTT客戶端
一個(gè)使用MQTT協(xié)議的應(yīng)用程序或者設(shè)備,它總是建立到服務(wù)器的網(wǎng)絡(luò)連接。客戶端可以:
- 發(fā)布其他客戶端可能會(huì)訂閱的信息。
- 訂閱其它客戶端發(fā)布的消息。
- 退訂或刪除應(yīng)用程序的消息。
- 斷開與服務(wù)器連接。
5.MQTT服務(wù)器
MQTT服務(wù)器以稱為“消息代理”(Broker),可以是一個(gè)應(yīng)用程序或一臺(tái)設(shè)備。它是位于消息發(fā)布者和訂閱者之間,它可以:
- 接受來自客戶的網(wǎng)絡(luò)連接。
- 接受客戶發(fā)布的應(yīng)用信息。
- 處理來自客戶端的訂閱和退訂請(qǐng)求。
- 向訂閱的客戶轉(zhuǎn)發(fā)應(yīng)用程序消息。
6.MQTT協(xié)議中的訂閱、主題、會(huì)話
- 訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務(wù)質(zhì)量(QoS)。訂閱會(huì)與一個(gè)會(huì)話(Session)關(guān)聯(lián)。一個(gè)會(huì)話可以包含多個(gè)訂閱。每一個(gè)會(huì)話中的每個(gè)訂閱都有一個(gè)不同的主題篩選器。
- 會(huì)話(Session)
每個(gè)客戶端與服務(wù)器建立連接后就是一個(gè)會(huì)話,客戶端和服務(wù)器之間有狀態(tài)交互。會(huì)話存在于一個(gè)網(wǎng)絡(luò)之間,也可能在客戶端和服務(wù)器之間跨越多個(gè)連續(xù)的網(wǎng)絡(luò)連接。
- 主題名(Topic Name)
連接到一個(gè)應(yīng)用程序消息的標(biāo)簽,該標(biāo)簽與服務(wù)器的訂閱相匹配。服務(wù)器會(huì)將消息發(fā)送給訂閱所匹配標(biāo)簽的每個(gè)客戶端。
- 主題篩選器(Topic Filter)
一個(gè)對(duì)主題名通配符篩選器,在訂閱表達(dá)式中使用,表示訂閱所匹配到的多個(gè)主題。
- 負(fù)載(Payload)
消息訂閱者所具體接收的內(nèi)容。
7、 MQTT協(xié)議中的方法
MQTT協(xié)議中定義了一些方法(也被稱為動(dòng)作), 來于表示對(duì)確定資源所進(jìn)行操作。 這個(gè)資源可以代表預(yù)先存在的數(shù)據(jù)或動(dòng)態(tài)生成數(shù)據(jù),這取決于服務(wù)器的實(shí)現(xiàn)。通常來說,資源指服務(wù)器上的文件或輸出。
- Connect:等待與服務(wù)器建立連接。
- Disconnect:等待MQTT客戶端完成所做的工作,并與服務(wù)器斷開TCP/IP會(huì)話。
- Subscribe:等待完成訂閱。
- UnSubscribe:等待服務(wù)器取消客戶端的一個(gè)或多個(gè)topics訂閱。
- Publish:MQTT客戶端發(fā)送消息請(qǐng)求,發(fā)送完成后返回應(yīng)用程序線程。
五.MQTT優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn)
- 適用于受限網(wǎng)絡(luò)的輕量級(jí)。
- 靈活選擇具有給定功能的服務(wù)質(zhì)量。
- 由OASIS技術(shù)委員會(huì)標(biāo)準(zhǔn)化。
- 實(shí)施簡單快捷。
- 協(xié)議簡潔輕巧,數(shù)據(jù)冗余量低。并且支持的設(shè)備從智能硬件到智能手機(jī)無所不包。
MQTT協(xié)議的優(yōu)勢(shì)是可以支持所有平臺(tái),它幾乎可以把所有的聯(lián)網(wǎng)物品和互聯(lián)網(wǎng)連接起來。特別適合于網(wǎng)絡(luò)代價(jià)昂貴,帶寬低、不可靠的環(huán)境。能在處理器和內(nèi)存資源有限的嵌入式設(shè)備中運(yùn)行。
2.缺點(diǎn)
- 由于基于TCP的連接,功耗很高。
- 缺乏加密。
- 服務(wù)器端實(shí)現(xiàn)難度大,雖然已經(jīng)有了C++版本的服務(wù)端組件,但是并不開源,而且在推送