物聯(lián)講堂 | MQTT的前世今生
2019-9-26新聞
Part1 MQTT的誕生
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是一個即時通訊協(xié)議。該協(xié)議支持所有平臺,幾乎可以把所有聯(lián)網(wǎng)物品和外部連接起來,被用來當(dāng)做傳感器和致動器的通信協(xié)議。
說起通訊協(xié)議,這里不得不先回顧一下最早的"摩托巴士”——MODBUS。市面上絕大多數(shù)的PLC都支持modbus協(xié)議。當(dāng)電腦或者HMI需要獲取某個設(shè)備或者PLC的數(shù)據(jù)時,可以通過modbus協(xié)議來進行交互。然后根據(jù)通信方式的不同,就區(qū)分了串口和以太網(wǎng)的,modbus rtu和modbus tcp。
后來,隨著互聯(lián)網(wǎng)的發(fā)展,就有了需要把設(shè)備的數(shù)據(jù)傳到網(wǎng)絡(luò)上來,也就是服務(wù)器,甚至前端等。于是,物聯(lián)網(wǎng)的概念也就隨之提出,并且對于協(xié)議的要求更加高,總體可以概括為:簡單、可靠、并發(fā)、開源。
于是在1999年的時候,IBM設(shè)計發(fā)明了MQTT協(xié)議。其實當(dāng)時發(fā)明這個協(xié)議并不是用于物聯(lián)網(wǎng)的,而是用在一個醫(yī)療系統(tǒng)中。傳感器采集病人的數(shù)據(jù),然后通過這個MQTT系統(tǒng),可以即時推送給醫(yī)生。
隨著物聯(lián)網(wǎng)的迅速發(fā)展,MQTT被更加廣泛的使用開來,更有一個專門的MQTT技術(shù)委員會,旨在負(fù)責(zé)定制基于MQTT技術(shù)的物聯(lián)網(wǎng)標(biāo)準(zhǔn)協(xié)議。毋庸置疑,MQTT已基本占領(lǐng)了物聯(lián)網(wǎng)中的重要地位?,F(xiàn)在,在物聯(lián)網(wǎng)的世界里,誰不接觸點MQTT都不好意思說自己是搞物聯(lián)網(wǎng)的了。
Part2 MQTT的工作機制
MQTT一般是建立在TCP協(xié)議基礎(chǔ)上的一種協(xié)議。因此也就有了MQTT客戶端和服務(wù)端。MQTT服務(wù)端一般只有一個,MQTT客戶端就可以很多了,幾萬甚至幾百萬個。當(dāng)MQTT客戶端連接上服務(wù)端之后,為了維持在線狀態(tài),客戶端會向服務(wù)端發(fā)心跳。這個心跳包也就2個字節(jié)。
同時MQTT消息類型還可以有多種服務(wù)質(zhì)量:
· “至多一次”,消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會發(fā)生消息丟失或重復(fù)。這一級別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因為不久后還會有第二次發(fā)送。
· “至少一次”,確保消息到達(dá),但消息重復(fù)可能會發(fā)生。
· “只有一次”,確保消息到達(dá)一次。這一級別可用于如下情況,在計費系統(tǒng)中,消息重復(fù)或丟失會導(dǎo)致不正確的結(jié)果。
Part3 MQTT中的一些概念
MQTT中重要的的幾個概念:登錄,主題,訂閱,生產(chǎn),發(fā)布,Payload,消費。接下來,通過繁易小劇場—MQTT魔法餐廳,幫助大家更好的理解這些概念。
在這個環(huán)節(jié)里,MQTT餐廳好比如一個MQTT系統(tǒng)。
其中,服務(wù)員就是服務(wù)器,顧客和廚師就是客戶端。廚師是生產(chǎn)者,顧客是消費者。
【登陸】 這家MQTT魔法餐廳是會員制的,顧客和廚師需要通過身份認(rèn)證才能登陸。
【主題】 本周餐廳主打“迷情西部”。
【訂閱】 顧客需要先向服務(wù)員點菜。
【生產(chǎn)】 每位廚師只做一道招牌菜。
【發(fā)布】 廚師做完菜之后,會推送發(fā)布給服務(wù)員。
【Payload】菜的味道如何,即顧客獲得的消息內(nèi)容。
【消費】 顧客吃完買單即消費。
當(dāng)然,有時候,會遇到幾個客戶同時點一份菜,但是MQTT餐廳中的廚師只做一份。這也沒有關(guān)系,MQTT魔法餐廳里的服務(wù)員能將一份菜變成多份,可以同時發(fā)布給定了菜的顧客們。
在MQTT系統(tǒng)里,就存在生產(chǎn),分發(fā),消費這三個環(huán)節(jié)了。數(shù)據(jù)的交互,主要是通過主題來實現(xiàn),主題可以理解為MQTT協(xié)議的靈魂。
Part4 小結(jié)
其實MQTT協(xié)議就這樣一個通用的模式,就好比美食街里有眾多餐廳一樣。每家餐廳都要有廚師,服務(wù)員,顧客,但各家餐廳的菜單不一樣的。也就是每一家做的MQTT,協(xié)議都是一樣的,登錄都是需要用戶名和密碼設(shè)備ID等參數(shù)。但是每家的MQTT定義的主題就不一樣了。可以說,100家做MQTT的,有可能99家定義的主題都不一樣。總而言之,只要MQTT的框架和主題一致,無論使用何種編程語言,無論借助何種硬件平臺,都能實現(xiàn)協(xié)議的無縫對接,達(dá)成通訊目的。