物聯(lián)網(wǎng)協(xié)議的王者:MQTT
?今天跟大家聊一下物聯(lián)網(wǎng)協(xié)議中比較著名的協(xié)議:MQTT。
讓我們直接開始!
什么是MQTT?
- 英文全稱:Message Quueuing Telemetry Transport
- 中文術(shù)語:消息隊列遙測傳輸協(xié)議
- 一種適用于物聯(lián)網(wǎng)設(shè)備之間通信的簡單消息傳遞協(xié)議
- 專為帶寬受限的設(shè)備而設(shè)計
- 采用發(fā)布/訂閱通信模式
- 用于機器對機器( M2M ) 通信
- MQTT 協(xié)議基于OASIS 標(biāo)準(zhǔn)下的TCP/IP
- 被廣泛用于無線網(wǎng)絡(luò)通信,具有廣泛的覆蓋面,涵蓋醫(yī)療保健、汽車和其他使用物聯(lián)網(wǎng)應(yīng)用的行業(yè)。
MQTT的歷史
MQTT 最初由 Andy Stanford-Clark 博士和 Arlen Nipper 博士于 1999 年創(chuàng)建,用于通過衛(wèi)星連接石油管道遙測系統(tǒng)。
兩位發(fā)明者為未來的協(xié)議指定了幾個要求:
- 簡單的實現(xiàn)
- 服務(wù)質(zhì)量數(shù)據(jù)交付
- 輕量級和帶寬效率
- 數(shù)據(jù)不可知
- 持續(xù)的會話
MQTT 于 2013 年在結(jié)構(gòu)化信息標(biāo)準(zhǔn)促進組織 (OASIS) 下被標(biāo)準(zhǔn)化為開源,OASIS 仍然管理 MQTT 標(biāo)準(zhǔn)。
MQTT的優(yōu)勢
MQTT有以下優(yōu)勢:
簡單
使用 MQTT 啟動和運行起來既快速又簡單。
搭建只需要幾條命令就可以搞定,啟動也是非???,還有專門的管理界面。
可靠
許多物聯(lián)網(wǎng)設(shè)備依賴無線電連接來傳輸和收集數(shù)據(jù),這意味著連接并不總是可靠的。
MQTT 通過提供內(nèi)置的 QoS 功能來減少連接問題,該功能可以將消息排隊,將它們保存在 MQTT 代理中,并讓它們等待目標(biāo)設(shè)備全部設(shè)置好接受它,這降低了消息錯位的幾率,因此消息注定要到達目的地。
雙向消息傳遞
任何設(shè)備、事物或應(yīng)用程序都可以發(fā)布或訂閱由 MQTT 代理處理的任何主題。
這不是單向的,比如只能發(fā)布或者只能訂閱,是既能發(fā)布又能訂閱,類似于全雙工通信。
大規(guī)模消息傳遞
由于Broker的存在,所以不管是100萬臺設(shè)備,還是100臺設(shè)備,對于MQTT都是一樣的,沒有啥壓力,因為最終消息都是傳遞到Broker中,不管多少個客戶端監(jiān)聽消息,也是從Broker中拿。
MQTT工作原理
MQTT架構(gòu)
MQTT 使用 PUSH/SUBSCRIBE(發(fā)布訂閱) 模型在 TCP/IP 之上運行,在 MQTT 架構(gòu)中,有兩種類型的系統(tǒng):
- 客戶端
- 代理
代理是客戶端與之通信的服務(wù)器,代理接收來自客戶端的通信并將這些通信發(fā)送給其他客戶端,客戶端之間不直接通信,而是連接到代理,每個客戶端可以是發(fā)布者、訂閱者或兩者兼而有之。
MQTT 是一種事件驅(qū)動的協(xié)議,沒有定期或持續(xù)的數(shù)據(jù)傳輸,這使傳輸保持在最低限度。客戶端僅在有信息要發(fā)送時發(fā)布,代理僅在新數(shù)據(jù)到達時向訂閱者發(fā)送信息。
發(fā)布/訂閱
在發(fā)布和訂閱系統(tǒng)中,設(shè)備可以在某個主題上發(fā)布消息,也可以訂閱特定主題以接收消息。
如圖,設(shè)備 1 在某個主題上發(fā)布消息,設(shè)備 2 訂閱了與設(shè)備 1發(fā)布的主題相同的主題,隨后設(shè)備 2 就能接收到消息。
消息
消息是設(shè)備之間交換的信息,比如一些指令,或者設(shè)備的一些信息,或者是其他需要交換的信息。
主題
如圖所示,我用一張圖一句話解釋一下:主題就是你微信訂閱公眾號的類型。
以公眾號為例,創(chuàng)作者是一個個發(fā)布者,公眾號的服務(wù)器是Broker,讀者是訂閱者,不同領(lǐng)域的發(fā)布者向不同的主題(領(lǐng)域)發(fā)布文章,比如瑞哥一般都是朝科技領(lǐng)域發(fā)布文章,那么所有讀者(訂閱者)訂閱了科技領(lǐng)域的都可以看到我的文章。
這個領(lǐng)域就可以大致理解為主題。
主題用正斜杠分隔的字符串表示,每個正斜杠表示一個主題級別。
如圖在公眾號 文章類型中科技領(lǐng)域創(chuàng)建網(wǎng)絡(luò)類型的主題:
注意:主題區(qū)分大小寫,兩個主題不同:
如果讀者想要看網(wǎng)絡(luò)方向的文章:
- 發(fā)布者在article/technology/network主題發(fā)布OSPF相關(guān)的文章
- 訂閱者訂閱了主題article/technology/network
- 發(fā)布者在主題article/technology/network上有新消息發(fā)出的時候,訂閱者都能訂閱到。
Broker 經(jīng)紀(jì)人
經(jīng)紀(jì)人其實就是代理。
MQTT 代理負(fù)責(zé)接收所有消息, 過濾消息, 決定誰對它們感興趣,然后將消息發(fā)布給所有訂閱的客戶端。
MQTT訂閱
MQTT 客戶端不直接相互連接,而是訂閱主題以接收消息。
要訂閱主題,客戶端必須首先向代理發(fā)送訂閱請求,SUBSCRIBE 請求可以包含多個主題,代理使用 SUBACK(確認(rèn)訂閱)響應(yīng)來響應(yīng) SUBSCRIBE 請求,訂閱還具有 QoS 設(shè)置,可用于降級已發(fā)布消息的 QoS。在這種情況下,消息總是以較低的 QoS 設(shè)置發(fā)布。
訂閱通配符
訂閱通配符有兩種:
單級
單級通配符替換一個主題級別:
此通配符將涵蓋以下主題:
- 文章/娛樂/網(wǎng)絡(luò)
- 文章/科技/網(wǎng)絡(luò)
- 文章/三農(nóng)/網(wǎng)絡(luò)
- 文章/新聞/網(wǎng)絡(luò)
多級
多級通配符替換多個主題級別:
此通配符將涵蓋以下主題:
- 文章/娛樂/網(wǎng)絡(luò)
- 文章/科技/java
- 文章/三農(nóng)/美食
- 文章/新聞/航天
服務(wù)質(zhì)量 QoS
QoS 0(最多一次):客戶端的消息只發(fā)送一次,不管它是否已經(jīng)到達代理。
QoS 1(至少一次):客戶端的消息被一遍又一遍地發(fā)送,直到代理以確認(rèn)接收來響應(yīng),這可能導(dǎo)致消息多次到達代理。
QoS 2(恰好一次):客戶端發(fā)送一次消息,同時確保它已到達代理,QoS 2 通信需要比服務(wù)質(zhì)量 0 或 1 更多的帶寬。
MQTT幾個重要的網(wǎng)站
- mqtt官網(wǎng):https://mqtt.org/
- emqx官網(wǎng):https://www.emqx.com/
總結(jié)
MQTT是一種輕量級的開放式消息傳遞協(xié)議,它為資源受限的網(wǎng)絡(luò)客戶端提供了一種在低帶寬環(huán)境中分發(fā)遙測信息的簡單方法,采用發(fā)布/訂閱通信模式,用于機器對機器 ( M2M ) 通信。?