MQTT 協(xié)議簡介
概覽
MQTT 是一種基于發(fā)布/訂閱模式的輕量級消息傳輸協(xié)議,專門針對低帶寬和不穩(wěn)定網(wǎng)絡(luò)環(huán)境的物聯(lián)網(wǎng)應(yīng)用而設(shè)計,可以用極少的代碼為聯(lián)網(wǎng)設(shè)備提供實(shí)時可靠的消息服務(wù)。MQTT 協(xié)議廣泛應(yīng)用于物聯(lián)網(wǎng)、移動互聯(lián)網(wǎng)、智能硬件、車聯(lián)網(wǎng)、智慧城市、遠(yuǎn)程醫(yī)療、電力、石油與能源等領(lǐng)域。
MQTT 協(xié)議由 Andy Stanford-Clark
(IBM)和 Arlen Nipper
(Arcom
,現(xiàn)為 Cirrus Link
)于 1999 年發(fā)布。 按照 Nipper 的介紹,MQTT 必須具備以下幾點(diǎn):
- 簡單容易實(shí)現(xiàn)
- 支持 QoS(設(shè)備網(wǎng)絡(luò)環(huán)境復(fù)雜)
- 輕量且省帶寬(因為那時候帶寬很貴)
- 數(shù)據(jù)無關(guān)(不關(guān)心 Payload 數(shù)據(jù)格式)
- 有持續(xù)地會話感知能力(時刻知道設(shè)備是否在線)
據(jù) Arlen Nipper
在 IBM Podcast
上的自述,MQTT 原名是 MQ TT,注意 MQ 與 TT之間的空格,其全稱為: MQ Telemetry Transport
,是九十年代早期他在參與 Conoco Phillips
公司的一個原油管道數(shù)據(jù)采集監(jiān)控系統(tǒng)(pipeline SCADA system
)時開發(fā)的一個實(shí)時數(shù)據(jù)傳輸協(xié)議。它的目的在于讓傳感器通過帶寬有限的 VSAT ,與 IBM 的 MQ Integrator 通信。由于 Nipper 是遙感和數(shù)據(jù)采集監(jiān)控專業(yè)出身,所以按業(yè)內(nèi)慣例取了 MQ TT 這個名字。
MQTT 與其他協(xié)議對比
MQTT vs HTTP
- MQTT 的最小報文僅為 2 個字節(jié),比 HTTP 占用更少的網(wǎng)絡(luò)開銷。
- MQTT 與 HTTP 都能使用 TCP 連接,并實(shí)現(xiàn)穩(wěn)定、可靠的網(wǎng)絡(luò)連接。
- MQTT 基于發(fā)布訂閱模型,HTTP 基于請求響應(yīng),因此 MQTT 支持雙工通信。
- MQTT 可實(shí)時推送消息,但 HTTP 需要通過輪詢獲取數(shù)據(jù)更新。
- MQTT 是有狀態(tài)的,但是 HTTP 是無狀態(tài)的。
- MQTT 可從連接異常斷開中恢復(fù),HTTP 無法實(shí)現(xiàn)此目標(biāo)。
MQTT vs XMPP
MQTT 協(xié)議設(shè)計簡單輕量、路由靈活,將在移動互聯(lián)網(wǎng)、物聯(lián)網(wǎng)消息領(lǐng)域,全面取代 PC 時代的 XMPP 協(xié)議。
- MQTT 報文體積小且編解碼容易,XMPP 基于繁重的 XML,報文體積大且交互繁瑣。
- MQTT 基于發(fā)布訂閱模式,相比 XMPP 基于 JID 的點(diǎn)對點(diǎn)消息路由更為靈活。
- MQTT 支持 JSON、二進(jìn)制等不同類型報文。XMPP 采用 XML 承載報文,二進(jìn)制必須 Base64 編碼等處理。
- MQTT 通過 QoS 保證消息可靠傳輸,XMPP 主協(xié)議并未定義類似機(jī)制。
為什么 MQTT 是適用于物聯(lián)網(wǎng)的最佳協(xié)議?
據(jù) IoT Analytics 最新發(fā)布的《2022 年春季物聯(lián)網(wǎng)狀況》研究報告顯示,到 2022 年,物聯(lián)網(wǎng)市場預(yù)計將增長 18%,達(dá)到 144 億活躍連接。
在如此大規(guī)模的物聯(lián)網(wǎng)需求下,海量的設(shè)備接入和設(shè)備管理對網(wǎng)絡(luò)帶寬、通信協(xié)議以及平臺服務(wù)架構(gòu)都帶來了巨大的挑戰(zhàn)。對于物聯(lián)網(wǎng)協(xié)議來說,必須針對性地解決物聯(lián)網(wǎng)設(shè)備通信的幾個關(guān)鍵問題:網(wǎng)絡(luò)環(huán)境復(fù)雜而不可靠、內(nèi)存和閃存容量小、處理器能力有限。
MQTT 協(xié)議正是為了應(yīng)對以上問題而創(chuàng)建,經(jīng)過多年的發(fā)展憑借其輕量高效、可靠的消息傳遞、海量連接支持、安全的雙向通信等優(yōu)點(diǎn)已成為物聯(lián)網(wǎng)行業(yè)的首選協(xié)議。
輕量高效,節(jié)省帶寬
MQTT 將協(xié)議本身占用的額外消耗最小化,消息頭部最小只需要占用 2 個字節(jié),可穩(wěn)定運(yùn)行在帶寬受限的網(wǎng)絡(luò)環(huán)境下。同時,MQTT 客戶端只需占用非常小的硬件資源,能運(yùn)行在各種資源受限的邊緣端設(shè)備上。
可靠的消息傳遞
MQTT 協(xié)議提供了 3 種消息服務(wù)質(zhì)量等級(Quality of Service),保證了在不同的網(wǎng)絡(luò)環(huán)境下消息傳遞的可靠性。
-
QoS 0:消息最多傳遞一次。
如果當(dāng)時客戶端不可用,則會丟失該消息。發(fā)布者發(fā)送一條消息之后,就不再關(guān)心它有沒有發(fā)送到對方,也不設(shè)置任何重發(fā)機(jī)制。 -
QoS 1:消息傳遞至少 1 次。
包含了簡單的重發(fā)機(jī)制,發(fā)布者發(fā)送消息之后等待接收者的 ACK,如果沒收到 ACK 則重新發(fā)送消息。這種模式能保證消息至少能到達(dá)一次,但無法保證消息重復(fù)。 -
QoS 2:消息僅傳送一次。
設(shè)計了重發(fā)和重復(fù)消息發(fā)現(xiàn)機(jī)制,保證消息到達(dá)對方并且嚴(yán)格只到達(dá)一次。
除了 QoS 之外,MQTT 還提供了清除會話(Clean Session)機(jī)制。對于那些想要在重新連接后,收到離線期間錯過的消息的客戶端,可在連接時設(shè)置關(guān)閉清除會話,此時服務(wù)端將會為客戶端存儲訂閱關(guān)系及離線消息,并在客戶端再次上線后發(fā)送給客戶端。
海量連接支持
MQTT 協(xié)議從誕生之時便考慮到了日益增長的海量物聯(lián)網(wǎng)設(shè)備,得益于其優(yōu)秀的設(shè)計,基于 MQTT 的物聯(lián)網(wǎng)應(yīng)用及服務(wù)可輕松具備高并發(fā)、高吞吐、高可擴(kuò)展能力。
連接海量的物聯(lián)網(wǎng)設(shè)備,離不開 MQTT 服務(wù)器的支持。目前,MQTT 服務(wù)器中支持并發(fā)連接數(shù)最多的是 EMQX。最近發(fā)布的 EMQX 5.0 通過一個 23 節(jié)點(diǎn)的集群達(dá)成了 **1 億 MQTT 連接+**每秒 100 萬消息吞吐,這使得 EMQX 5.0 成為目前為止全球最具擴(kuò)展性的 MQTT 服務(wù)器。
安全的雙向通信
依賴于發(fā)布訂閱模式,MQTT 允許在設(shè)備和云之間進(jìn)行雙向消息通信。發(fā)布訂閱模式的優(yōu)點(diǎn)在于:發(fā)布者與訂閱者不需要建立直接連接,也不需要同時在線,而是由消息服務(wù)器負(fù)責(zé)所有消息的路由和分發(fā)工作。
安全性是所有物聯(lián)網(wǎng)應(yīng)用的基石,MQTT 支持通過 TLS/SSL 確保安全的雙向通信,同時 MQTT 協(xié)議中提供的客戶端 ID、用戶名和密碼允許我們實(shí)現(xiàn)應(yīng)用層的身份驗證和授權(quán)。
在線狀態(tài)感知
為了應(yīng)對網(wǎng)絡(luò)不穩(wěn)定的情況,MQTT 提供了**心跳保活(Keep Alive)**機(jī)制。在客戶端與服務(wù)端長時間無消息交互的情況下,Keep Alive 保持連接不被斷開,若一旦斷開,客戶端可即時感知并立即重連。
同時,MQTT 設(shè)計了遺愿(Last Will) 消息,讓服務(wù)端在發(fā)現(xiàn)客戶端異常下線的情況下,幫助客戶端發(fā)布一條遺愿消息到指定的 MQTT 主題。
另外,部分 MQTT 服務(wù)器如 EMQX 也提供了上下線事件通知功能,當(dāng)后端服務(wù)訂閱了特定主題后,即可收到所有客戶端的上下線事件,這樣有助于后端服務(wù)統(tǒng)一處理客戶端的上下線事件。
MQTT 5.0 與 3.1.1
在 MQTT 3.1.1 發(fā)布并成為 OASIS 標(biāo)準(zhǔn)的四年后,MQTT 5.0 正式發(fā)布。這是一次重大的改進(jìn)和升級,它的目的不僅僅是滿足現(xiàn)階段的行業(yè)需求,更是為行業(yè)未來的發(fā)展變化做了充足的準(zhǔn)備。
MQTT 5.0 在 3.1.1 版本基礎(chǔ)上增加了會話/消息延時、原因碼、主題別名、用戶屬性、共享訂閱等更加符合現(xiàn)代物聯(lián)網(wǎng)應(yīng)用需求的特性,提高了大型系統(tǒng)的性能、穩(wěn)定性與可擴(kuò)展性。目前,MQTT 5.0 已成為絕大多數(shù)物聯(lián)網(wǎng)企業(yè)的首選協(xié)議,我們建議初次接觸 MQTT 的開發(fā)者直接使用該版本。
MQTT 服務(wù)器
MQTT 服務(wù)器負(fù)責(zé)接收客戶端發(fā)起的連接,并將客戶端發(fā)送的消息轉(zhuǎn)發(fā)到另外一些符合條件的客戶端。一個成熟的 MQTT 服務(wù)器可支持海量的客戶端連接及百萬級的消息吞吐,幫助物聯(lián)網(wǎng)業(yè)務(wù)提供商專注于業(yè)務(wù)功能并快速創(chuàng)建一個可靠的 MQTT 應(yīng)用。
EMQX 是一款應(yīng)用廣泛的大規(guī)模分布式物聯(lián)網(wǎng) MQTT 服務(wù)器。自 2013 年在 GitHub 發(fā)布開源版本以來,目前全球下載量已超千萬,累計連接物聯(lián)網(wǎng)關(guān)鍵設(shè)備超過 1 億臺。
感興趣的可通過如下 Docker 命令安裝 EMQX 5.0 開源版進(jìn)行體驗。
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
也可直接在 EMQX Cloud 上創(chuàng)建完全托管的 MQTT 服務(wù)。
MQTT 客戶端
MQTT 應(yīng)用通常需要基于 MQTT 客戶端庫來實(shí)現(xiàn) MQTT 通信。目前,基本所有的編程語言都有成熟的開源 MQTT 客戶端庫,你可以參考 EMQ 整理的 MQTT 客戶端庫大全選擇一個合適的客戶端庫來構(gòu)建滿足自身業(yè)務(wù)需求的 MQTT 客戶端。
MQTT 應(yīng)用開發(fā)還離不開 MQTT 測試工具的支持,一款易用且功能強(qiáng)大的 MQTT 測試工具可幫助開發(fā)者縮短開發(fā)周期,創(chuàng)建一個穩(wěn)定的物聯(lián)網(wǎng)應(yīng)用。
MQTTX 是一款開源的跨平臺桌面客戶端,它簡單易用且提供全面的 MQTT 5.0 功能、特性測試,可運(yùn)行在macOS, Linux 和 Windows 上。同時,它還提供了命令行及瀏覽器版本,滿足不同場景下的 MQTT 測試需求。感興趣的可訪問 MQTTX 官網(wǎng)進(jìn)行下載試用。
以上就是今天的全部內(nèi)容了,歡迎大家下載體驗!文章來源:http://www.zghlxwxcb.cn/news/detail-751342.html
參考鏈接:https://www.emqx.com/zh/blog/what-is-the-mqtt-protocol#mqtt-%E5%8D%8F%E8%AE%AE%E7%AE%80%E4%BB%8B文章來源地址http://www.zghlxwxcb.cn/news/detail-751342.html
到了這里,關(guān)于揭秘MQTT:為何它是物聯(lián)網(wǎng)的首選協(xié)議?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!