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