MQTT物聯(lián)網(wǎng)消息傳遞標準
MQTT是用于物聯(lián)網(wǎng)(IoT)的OASIS標準消息傳遞協(xié)議。它被設計為一種極其輕量級的發(fā)布/訂閱消息傳送,非常適合以較小的代碼占用量和最小的網(wǎng)絡帶寬連接遠程設備
MQTT是用于物聯(lián)網(wǎng)(IoT)的OASIS標準消息傳遞協(xié)議。它被設計為一種極其輕量級的發(fā)布/訂閱消息傳送,非常適合以較小的代碼占用量和最小的網(wǎng)絡帶寬連接遠程設備。如今,MQTT被廣泛用于汽車,制造業(yè),電信,石油和天然氣等行業(yè)。
MQTT協(xié)議涉及兩個主題:客戶端和代理。MQTT代理是服務器,而客戶端是連接的設備。當設備(或客戶端)希望將數(shù)據(jù)發(fā)送到服務器(或代理)時,稱為發(fā)布。當操作相反時,它稱為subscription。
如果從訂閱客戶端到代理的連接斷開,則代理將緩沖消息,并在其重新聯(lián)機時將消息推送給訂閱者。如果從發(fā)布客戶端到代理的連接斷開而沒有通知,則代理可以關閉連接,并向訂閱者發(fā)送包含來自發(fā)布者指令的緩存消息。
輕巧高效
MQTT客戶端非常小,需要最少的資源,因此可以在小型微控制器上使用。MQTT消息頭很小以優(yōu)化網(wǎng)絡帶寬。
雙向通訊
MQTT允許設備到云之間以及云到設備之間的消息傳遞。這使得易于將消息廣播到事物組。
百萬級連接
MQTT可以擴展以與數(shù)百萬個IoT設備連接。
可靠的消息傳遞
對于許多物聯(lián)網(wǎng)用例而言,消息傳遞的可靠性至關重要。這就是MQTT具有3種定義的服務質(zhì)量級別的原因:0-最多一次,1-至少一次,2-恰好一次
不可靠網(wǎng)絡的支持
許多物聯(lián)網(wǎng)設備通過不可靠的蜂窩網(wǎng)絡進行連接。MQTT對持久性會話的支持減少了將客戶端與代理重新連接的時間。
安全啟用
MQTT使您可以輕松地使用TLS加密消息并使用現(xiàn)代身份驗證協(xié)議(例如OAuth)對客戶端進行身份驗證。
MQTT如何工作
MQTT會話分為四個階段:連接,認證,通信和終止??蛻舳耸紫仁褂?代理操作員定義的標準端口或自定義端口,創(chuàng)建到代理的傳輸控制協(xié)議/ Internet協(xié)議(TCP / IP)連接 。創(chuàng)建連接時,重要的是要認識到,如果服務器提供了可重用的客戶端標識,則服務器可能會繼續(xù)執(zhí)行舊會話。
使用安全套接字層(SSL)/傳輸層安全性(TLS)的標準端口是用于非加密通信的1883和用于加密通信的8883 。在SSL / TLS握手期間,客戶端將驗證 服務器證書并驗證服務器??蛻舳诉€可以在握手期間向代理提供客戶端證書。代理可以使用它來認證客戶端。盡管不是MQTT規(guī)范的特定組成部分,但代理已習慣使用SSL / TLS客戶端證書來支持客戶端身份驗證。
因為MQTT協(xié)議旨在成為資源受限和IoT設備的協(xié)議,所以SSL / TLS可能并非始終是一個選擇,在某些情況下可能是不希望的。在這種情況下,身份驗證以明文形式的用戶名和密碼表示,由用戶端發(fā)送給服務器-這是CONNECT / CONNACK數(shù)據(jù)包序列的一部分。此外,某些經(jīng)紀人,尤其是在互聯(lián)網(wǎng)上發(fā)布的開放式經(jīng)紀人,將接受匿名客戶。在這種情況下,用戶名和密碼將留為空白。
MQTT之所以稱為輕量級協(xié)議,是因為其所有消息的代碼占用量都很小。每條消息均由一個固定的報頭(2 個字節(jié)) 和一個可選的可變報頭,一個消息有效載荷(限制為256 MB信息)和一個服務質(zhì)量(QoS)級別組成。
在通信階段,客戶端可以執(zhí)行發(fā)布,訂閱,取消訂閱和ping操作。發(fā)布操作將二進制 數(shù)據(jù)塊(內(nèi)容)發(fā)送到發(fā)布者定義的主題。
MQTT支持最大為256 MB的消息二進制大對象(BLOB)。內(nèi)容的格式將取決于應用程序。主題訂閱是使用SUBSCRIBE / SUBACK數(shù)據(jù)包對進行的,取消訂閱是使用UNSUBSCRIBE / UNSUBACK數(shù)據(jù)包對進行的。
主題字符串使用特殊的定界符(正斜杠(/))形成自然的主題樹。客戶可以使用特殊的通配符來訂閱主題樹中的整個分支,也可以取消訂閱。有兩個通配符:單級通配符,加號(+);還有一個多級通配符,即井號(#)。特殊主題字符,美元字符($),從任何根通配符訂閱中排除主題。通常,$用于傳輸服務器特定消息或系統(tǒng)消息。
客戶端在通信階段可以執(zhí)行的另一項操作是 使用PINGREQ / PINGRESP數(shù)據(jù)包序列對代理服務器執(zhí)行 ping操作。此數(shù)據(jù)包序列大致轉換為ARE YOU ALIVE / YES I ALIVE。此操作除了維持實時連接并確保網(wǎng)關 或路由器未關閉TCP連接外,沒有其他功能 。
當發(fā)布者或訂閱者想要終止MQTT會話時,它將DISCONNECT消息發(fā)送到代理,然后關閉連接。這被稱為正常關閉,因為它通過提供客戶端標識并恢復其中斷位置,使客戶端能夠輕松地重新連接。
如果斷開連接突然發(fā)生而發(fā)布者沒有時間發(fā)送DISCONNECT消息,則代理可能會向訂閱者發(fā)送訂閱者的消息,表明該代理先前已緩存。該消息稱為“ 最后遺囑”,它為訂戶提供了有關發(fā)布者意外死亡的處理方法的說明。
MQTT協(xié)議的歷史
MQTT由IBM的Andy Stanford-Clark博士和Arcom的Arlen Nipper(現(xiàn)為Eurotech)于1999年創(chuàng)建。MQTT的創(chuàng)建是一種經(jīng)濟高效且可靠的方式,可將石油和天然氣行業(yè)中使用的監(jiān)視設備連接到遠程企業(yè)服務器。當面臨尋找將數(shù)據(jù)從沙漠中的管道傳感器推送到異地監(jiān)督控制和數(shù)據(jù)采集(SCADA)系統(tǒng)的挑戰(zhàn)時,他們決定采用基于事件的TCP / IP發(fā)布/訂閱拓撲, 以保持衛(wèi)星鏈路傳輸成本下降。
盡管MQTT仍與IBM緊密聯(lián)系,但它現(xiàn)在是由結構化信息標準促進組織(OASIS)監(jiān)督的開放協(xié)議。
盡管顧名思義,MQTT并不是原始IBM MQSeries的一部分;但是,從7.1版開始,它在WebSphere MQ中可用。MQTT以前被稱為SCADA協(xié)議,MQ Integrator SCADA設備協(xié)議(MQIsdp)和WebSphere MQTT(WMQTT),盡管所有這些變體都已廢棄。
MQTT協(xié)議應用程序和用例
Facebook當前在其Messenger應用中使用MQTT,這不僅是因為該協(xié)議節(jié)省了手機到電話的消息收發(fā)過程中的電池電量,而且還因為該協(xié)議可以使消息有效地以毫秒(ms)的速度傳遞,盡管全球互聯(lián)網(wǎng)連接不一致。
大多數(shù)主要的云服務提供商(包括Amazon Web Services(AWS),Google Cloud,IBM Cloud和Microsoft Azure)都支持MQTT。
MQTT非常適合使用M2M和IoT設備進行諸如實時分析,預防性維護和監(jiān)視等環(huán)境中的應用,這些環(huán)境包括智能家居,醫(yī)療保健,物流,工業(yè)和制造業(yè)。
物聯(lián)網(wǎng)中的MQTT
MQTT是有關物聯(lián)網(wǎng)的最常用協(xié)議之一。MQTT使資源受限的IoT設備可以將有關給定主題的信息發(fā)送或發(fā)布到充當MQTT消息代理的服務器。然后,代理 將 信息推送給先前已訂閱該主題的那些客戶端。對人類而言,主題看起來像分層文件路徑??蛻艨梢杂嗛喼黝}層次結構的特定級別,也可以使用通配符訂閱多個級別。
MQTT的挑戰(zhàn):安全性,互操作性和認證
由于MQTT協(xié)議在設計時并未考慮安全性,因此該協(xié)議傳統(tǒng)上已在安全后端網(wǎng)絡中用于特定于應用程序的目的。MQTT的主題結構可以輕松地形成一棵巨大的樹,并且沒有明確的方法將樹劃分為可以聯(lián)合的較小邏輯域。這使得創(chuàng)建全局可擴展的MQTT網(wǎng)絡變得很困難,因為隨著主題樹大小的增加,復雜性也會增加。
MQTT的另一個負面方面是它缺乏互操作性。由于消息有效負載是二進制的,而沒有有關其編碼方式的信息,因此可能會出現(xiàn)問題-尤其是在開放體系結構中,來自不同制造商的不同應用程序應該可以無縫地協(xié)同工作。
如前所述,MQTT在協(xié)議中內(nèi)置了最少的身份驗證功能。用戶名和密碼以明文形式發(fā)送,并且任何安全使用MQTT的形式都必須使用SSL / TLS,但不幸的是,它不是輕量級協(xié)議。
使用客戶端證書對客戶端進行身份驗證不是一個簡單的過程,并且在MQTT中無法控制誰擁有主題以及可以在主題上發(fā)布信息,除非使用專有的帶外方法。這樣可以很容易地有意或無意地將有害消息注入網(wǎng)絡。
此外,消息接收者無法知道誰發(fā)送了原始消息,除非該信息包含在實際消息中。必須以專有方式在MQTT之上實現(xiàn)的安全功能會增加代碼占用空間,并使實現(xiàn)更加困難。
服務質(zhì)量水平
QoS是指消息的發(fā)送者和消息的接收者之間的協(xié)議。QoS將在引用特定消息時定義傳遞的保證。QoS是MQTT的一項關鍵功能,使客戶端能夠在三個服務級別之間進行選擇。
三種不同的QoS級別決定了MQTT協(xié)議如何管理內(nèi)容。盡管更高級別的QoS更加可靠,但是它們具有更高的延遲和帶寬要求,因此訂閱客戶端可以指定他們希望接收的最高QoS級別。
MQTT服務質(zhì)量級別
最簡單的QoS級別是未確認的服務。此QoS級別使用PUBLISH數(shù)據(jù)包序列。發(fā)布者一次將消息發(fā)送給代理,而代理一次將消息傳遞給訂閱者。沒有適當?shù)臋C制來確保已正確接收消息,并且代理不會保存消息。該QoS級別也被稱為 最多一次,QoS0或發(fā)射后不管。
第二QoS級別是確認服務。此QoS級別在發(fā)布者與其代理之間以及代理與訂閱者之間使用PUBLISH / PUBACK數(shù)據(jù)包序列。確認包會驗證是否已接收到內(nèi)容,如果未及時收到確認,重試機制將再次發(fā)送原始內(nèi)容。這可能導致訂戶接收同一消息的多個副本。該QoS等級也可以被稱為至少一次或QoS1。
第三QoS級別是有保證的服務。此QoS級別通過兩對數(shù)據(jù)包傳遞消息。第一對稱為PUBLISH / PUBREC,第二對稱為PUBREL / PUBCOMP。這兩對確保無論重試次數(shù)如何,郵件都只會傳遞一次。該QoS等級也可以被稱為恰好一次或QoS2。
