MQTT 入門(mén),EMQ幫助開(kāi)發(fā)者快速了解 MQTT 協(xié)議及其相關(guān)特性

發(fā)布時(shí)間:2022-7-13 15:12    發(fā)布者:洞察基
MQTT 協(xié)議是什么?

隨著(zhù) 5G 時(shí)代的來(lái)臨,萬(wàn)物互聯(lián)的偉大構想正在成為現實(shí)。聯(lián)網(wǎng)的 物聯(lián)網(wǎng)設備 在 2018 年已經(jīng)達到了 70 億,在未來(lái)兩年,僅智能水電氣表就將超過(guò)10億。



海量的設備接入和設備管理對網(wǎng)絡(luò )帶寬、通信協(xié)議以及平臺服務(wù)架構都帶來(lái)了很大挑戰。對于 物聯(lián)網(wǎng)協(xié)議 來(lái)說(shuō),必須針對性地解決物聯(lián)網(wǎng)設備通信的幾個(gè)關(guān)鍵問(wèn)題:其網(wǎng)絡(luò )環(huán)境復雜而不可靠、其內存和閃存容量小、其處理器能力有限。

​​MQTT 協(xié)議 是基于發(fā)布/訂閱模式的物聯(lián)網(wǎng)通信協(xié)議,憑借簡(jiǎn)單易實(shí)現、支持 QoS、報文小等特點(diǎn),占據了物聯(lián)網(wǎng)協(xié)議的半壁江山:



MQTT 協(xié)議的誕生
MQTT was created by ​​Andy Stanford-Clark of IBM, and Arlen Nipper (then of Arcom Systems, later CTO of Eurotech).

據 Arlen Nipper 在一 IBM Podcast 上的自述​,MQTT 原名是 ​​MQ TT​​​, 注意 ​​MQ​​​ 與 ​​TT​​​之間的空格,其全稱(chēng)為: MQ Telemetry Transport,是九十年代早期,他在參與 Conoco Phillips 公司的一個(gè)原油管道數據采集監控系統(pipeline SCADA system)時(shí),開(kāi)發(fā)的一個(gè)實(shí)時(shí)數據傳輸協(xié)議。它的目的在于讓傳感器通過(guò)帶寬有限的 VSAT ​,與 IBM 的 MQ Integrator 通信。由于 Nipper 是遙感和數據采集監控專(zhuān)業(yè)出身,所以按業(yè)內慣例給了個(gè) ​​MQ TT​​ 的名字。

MQTT 協(xié)議設計原則
按照 Nipper 的介紹,MQTT 必須簡(jiǎn)單容易實(shí)現,必須支持 QoS(設備網(wǎng)絡(luò )環(huán)境復雜),必須輕量且省帶寬(因為那時(shí)候帶寬很貴),必須數據無(wú)關(guān)(不關(guān)心 Payload 數據格式),必須有持續地會(huì )話(huà)感知能力(時(shí)刻知道設備是否在線(xiàn))。下面將介紹 MQTT (3.1.1 版本) 的幾個(gè)核心特色,分別對應了這幾個(gè)設計原則的實(shí)現。

靈活的發(fā)布訂閱和主題設計
發(fā)布訂閱模式是傳統 Client/Server 模式的一種解耦方案。發(fā)布者通過(guò) Broker 與消費者之間通信,Broker 的作用是將收到的消息通過(guò)某種​​過(guò)濾規則​​,正確地發(fā)送給消費者。發(fā)布/訂閱模式 相對于 客戶(hù)端/服務(wù)器模式 的好處在于:

發(fā)布者和消費者之間不必預先知道對方的存在,比如不需要預先溝通對方的 IP Address 和 Port
發(fā)布者和消費者之間不必同時(shí)運行。因為 Broker 是一直運行的。
在 MQTT 協(xié)議里,上面提到的 ​​過(guò)濾規則​​​ 是 ​​Topic​​​。比如:所有發(fā)布到 ​​news​​​ 這個(gè) Topic 的消息,都會(huì )被 Broker 轉發(fā)給已經(jīng)訂閱了 ​​news​​ 的訂閱者:



上圖中訂閱者預先訂閱了 ​​news​​​,然后發(fā)布者向 Broker 發(fā)布了一條消息 "some msg" 并指定發(fā)布到 ​​news​​ 主題,Broker 通過(guò) Topic 匹配,決定將這條消息轉發(fā)給訂閱者。

MQTT 的 Topic 有層級結構,并且支持通配符 ​​+​​​ 和 ​​#​​:

​​+​​​ 是匹配單層的通配符。比如​​news/+​​​ 可以匹配​​news/sports​​​,​​news/+/basketball​​​ 可匹配到​​news/sports/basketball​​。
​​#​​​ 是一到多層的通配符。比如​​news/#​​​ 可以匹配​​news​​​、​​news/sports​​​、​​news/sports/basketball​​​ 以及​​news/sports/basketball/x​​ 等等。
MQTT 的主題是不要預先創(chuàng )建的,發(fā)布者發(fā)送消息到某個(gè)主題、或者訂閱者訂閱某個(gè)主題的時(shí)候,Broker 就會(huì )自動(dòng)創(chuàng )建這個(gè)主題。

帶寬消耗最小化
MQTT 協(xié)議將協(xié)議本身占用的額外消耗最小化,消息頭部最小只需要占用 2 個(gè)字節。

MQTT 的消息格式分三部分:

固定長(cháng)度頭部,2 個(gè)字節,所有消息類(lèi)型里都有

可變長(cháng)度頭部,只有某些消息類(lèi)型里有

Payload,只有某些消息類(lèi)型里有

MQTT 的主要消息類(lèi)型有:

CONNECT / CONNACK
PUBLISH / PUBACK
SUBSCRIBE / SUBACK
UNSUBSCRIBE / UNSUBACK
PINGREQ / PINGRESP
DISCONNECT
其中 PINGREQ / PINGRESP 和 DISCONNECT 報文是不需要可變頭部的,也沒(méi)有 Payload,也就是說(shuō)它們的報文大小僅僅消耗 2 個(gè)字節。

在 CONNECT 報文的可變長(cháng)度頭部里,有個(gè) Protocol Version 的字段。為了節省空間,只有一個(gè)字節。所以版本號不是按照字符串 "3.1.1" 存放的,而是使用數字 4 來(lái)表示 3.1.1 版本。

三個(gè)可選的 QoS 等級
為適應設備不同的網(wǎng)絡(luò )環(huán)境,MQTT 設計了 3 個(gè) QoS 等級,0, 1, 2:

At most once(0)
At least once(1)
Exactly once(2)
QoS 0 是一種 "fire and forget" 的消息發(fā)送模式:Sender (可能是 Publisher 或者 Broker) 發(fā)送一條消息之后,就不再關(guān)心它有沒(méi)有發(fā)送到對方,也不設置任何重發(fā)機制。

QoS 1 包含了簡(jiǎn)單的重發(fā)機制,Sender 發(fā)送消息之后等待接收者的 ACK,如果沒(méi)收到 ACK 則重新發(fā)送消息。這種模式能保證消息至少能到達一次,但無(wú)法保證消息重復。

QoS 2 設計了略微復雜的重發(fā)和重復消息發(fā)現機制,保證消息到達對方并且嚴格只到達一次。

會(huì )話(huà)保持
MQTT 沒(méi)有假設設備或 Broker 使用了 TCP 的;顧C制,而是設計了協(xié)議層的;顧C制:在 CONNECT 報文里可設置 Keepalive 字段,來(lái)設置;钚奶 PINGREQ/PINGRESP 的發(fā)送時(shí)間間隔。當長(cháng)時(shí)間無(wú)法收到設備的 PINGREQ 的時(shí)候,Broker 就會(huì )認為設備已經(jīng)下線(xiàn)。

總的來(lái)說(shuō),Keepalive 有兩個(gè)作用:

發(fā)現對端死亡或者網(wǎng)絡(luò )中斷
在長(cháng)時(shí)間無(wú)消息交互的情況下,保持連接不被網(wǎng)絡(luò )設備斷開(kāi)
對于那些想要在重新上線(xiàn)后,重新收到離線(xiàn)期間錯過(guò)的消息的設備,MQTT 設計了持久化連接:在 CONNECT 報文里可設置 CleanSession 字段為 False,則 Broker 會(huì )為終端存儲:

設備所有的訂閱
還未被設備確認的 QoS1 和 QoS 消息
設備離線(xiàn)時(shí)錯過(guò)的消息
在線(xiàn)狀態(tài)感知
MQTT 設計了遺愿(Last Will) 消息,讓 Broker 在發(fā)現設備異常下線(xiàn)的情況下,幫助設備發(fā)布一條遺愿消息到指定的主題。

實(shí)際上在某些 MQTT 服務(wù)器的實(shí)現里 (比如 EMQX),設備上線(xiàn)或下線(xiàn)的時(shí)候 Broker 會(huì )通過(guò)某些系統主題發(fā)布設備狀態(tài)更新,更符合實(shí)際應用場(chǎng)景。

開(kāi)源 MQTT 服務(wù)器如何選擇
到目前為止,比較流行的開(kāi)源 MQTT 服務(wù)器有幾個(gè):

Eclipse Mosquitto使用 C 語(yǔ)言實(shí)現的 MQTT 服務(wù)器。Eclipse 組織還還包含了大量的 MQTT 客戶(hù)端項目:https://www.eclipse.org/paho/#
​​EMQX使用 Erlang 語(yǔ)言開(kāi)發(fā)的 MQTT 服務(wù)器,內置強大的規則引擎,支持許多其他 IoT 協(xié)議比如 MQTT-SN、 CoAP、LwM2M 等。
Mosca使用 Node.JS 開(kāi)發(fā)的 MQTT 服務(wù)器,簡(jiǎn)單易用。
​​VerneMQ同樣使用 Erlang 開(kāi)發(fā)的 MQTT 服務(wù)器.
從支持 MQTT 5.0、穩定性、擴展性、集群能力等方面考慮,EMQX 的表現應該是最好的:

使用 Erlang OTP 開(kāi)發(fā),容錯能力好 (電信領(lǐng)域久經(jīng)考驗的語(yǔ)言,曾經(jīng)做出過(guò) 99.9999999% 可用性的交換機設備)
官方有大量的擴展插件可供擴展。有很多認證插件,數據存儲(backend)插件可供選擇?芍С指鞣N關(guān)系型數據庫,NoSQL 數據庫,以及常見(jiàn)消息隊列如 Kafka,RabbitMQ,Pulsar 等
支持集群,支持節點(diǎn)水平擴展
單節點(diǎn)支持 2000K 并發(fā)連接
支持規則引擎和編解碼
MQTT 協(xié)議快速體驗
MQTT 在線(xiàn)服務(wù)器
EMQX MQTT 物聯(lián)網(wǎng)云服務(wù) 提供了一個(gè)在線(xiàn)的公共 MQTT 5.0 服務(wù)器,不需要任何安裝您就可以快速開(kāi)始 MQTT 協(xié)議的學(xué)習、測試或原型制作。

該 MQTT 服務(wù)器的詳細接入信息請見(jiàn) EMQ 官網(wǎng)頁(yè)面:免費的在線(xiàn) MQTT 服務(wù)器。

MQTT 在線(xiàn)客戶(hù)端
EMQ 也提供了支持瀏覽器訪(fǎng)問(wèn)的 MQTT 在線(xiàn)客戶(hù)端工具,該工具支持通過(guò)普通或者加密的 WebSocket 端口連接至 MQTT 服務(wù)器,同時(shí)也支持緩存連接方便下次訪(fǎng)問(wèn)使用。
原創(chuàng )文章,作者:EMQ,如若轉載,請注明出處:https://www.emqx.com/zh/blog/what-is-the-mqtt-protocol


本文地址:http://selenalain.com/thread-795914-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页