MQTT 協(xié)議概述

概述


MQTT是IBM開發(fā)的一個即時通訊協(xié)議择克,有可能成為物聯(lián)網的重要組成部分几迄。該協(xié)議支持所有平臺可训,幾乎可以把所有聯(lián)網物品和外部連接起來沫勿,被用來當做傳感器和制動器之間通信的橋梁。

MQTT協(xié)議是為大量計算能力有限梯找,且工作在低帶寬倦炒、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協(xié)議庸队。有以下特點:

  • 使用發(fā)布/訂閱消息模式获枝,提供一對多的消息發(fā)布
  • 使用TCP/IP提供網絡連接
  • 小型傳輸蠢正,開銷很小(固定長度的頭部是 2 字節(jié))省店,協(xié)議交換最小化嚣崭,以降低網絡流量笨触,傳輸?shù)膬热葑畲鬄?56MB。
  • 使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制雹舀。

1.MQTT協(xié)議實現(xiàn)方式


MQTT系統(tǒng)由與服務器通信的客戶端組成芦劣,通常稱服務器為“代理Broker”∷涤埽客戶可以是信息發(fā)布者Publish或訂閱者Subscribe虚吟。每個客戶端都可以連接到代理。

信息按主題層次結構組織签财。當發(fā)布者具有要分發(fā)的新數(shù)據(jù)時串慰,它會將包含數(shù)據(jù)的控制消息發(fā)送到連接的代理。然后荠卷,代理將信息分發(fā)給已訂閱該主題的任何客戶端模庐。發(fā)布者不需要有關于訂閱者數(shù)量或位置的任何數(shù)據(jù)烛愧,而訂閱者又不必配置有關發(fā)布者的任何數(shù)據(jù)油宜。

MQTT傳輸?shù)南⒎譃椋褐黝}(Topic)和負載(payload)兩部分:
(1)Topic,可以理解為消息的類型怜姿,訂閱者訂閱(Subscribe)后慎冤,就會收到該主題的消息內容(payload);
(2)payload沧卢,可以理解為消息的內容蚁堤,是指訂閱者具體要使用的內容。

2. MQTT協(xié)議中的訂閱但狭、主題披诗、會話


2.1訂閱(Subscription)

訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯(lián)立磁。一個會話可以包含多個訂閱呈队。每一個會話中的每個訂閱都有一個不同的主題篩選器。

2.2會話(Session)

每個客戶端與服務器建立連接后就是一個會話唱歧,客戶端和服務器之間有狀態(tài)交互宪摧。會話存在于一個網絡之間,也可能在客戶端和服務器之間跨越多個連續(xù)的網絡連接颅崩。

2.3主題名(Topic Name)

連接到一個應用程序消息的標簽几于,該標簽與服務器的訂閱相匹配。服務器會將消息發(fā)送給訂閱所匹配標簽的每個客戶端沿后。
系統(tǒng)主題:通過定義$SYS開頭的主題可以查看一些系統(tǒng)信息沿彭,如客戶端連接數(shù)量等,
詳細介紹:https://github.com/mqtt/mqtt.github.io/wiki/SYS-Topics

2.4主題篩選器(Topic Filter)

一個對主題名通配符篩選器尖滚,在訂閱表達式中使用膝蜈,表示訂閱所匹配到的多個主題锅移。
多級匹配符 #
單級匹配符 +
更多主題討論,請移步github wiki https://github.com/mqtt/mqtt.github.io/wiki/topic_format

2.5負載(Payload)

消息訂閱者所具體接收的內容饱搏。

3.保留消息和最后遺囑


保留消息 Retained Messages

MQTT中非剃,無論是發(fā)布還是訂閱都不會有任何觸發(fā)事件。
1個Topic只有唯一的retain消息推沸,Broker會保存每個Topic的最后一條retain消息备绽。
發(fā)布消息時把retain設置為true,即為保留信息鬓催。每個Client訂閱Topic后會立即讀取到retain消息肺素。如果需要刪除retain消息,可以發(fā)布一個空的retain消息宇驾,因為每個新的retain消息都會覆蓋最后一個retain消息倍靡。

最后遺囑 Last Will & Testament

MQTT本身就是為信號不穩(wěn)定的網絡設計的,所以難免一些客戶端會無故的和Broker斷開連接课舍。 當客戶端連接到Broker時塌西,可以指定LWT,Broker會定期檢測客戶端是否有異常筝尾。
當客戶端異常掉線時捡需,Broker就往連接時指定的topic里推送當時指定的LWT消息。

4.消息服務質量


有三種消息發(fā)布服務質量qos(Quality of Service):

4.1“至多一次”

至多一次

消息發(fā)布完全依賴底層TCP/IP網絡筹淫。會發(fā)生消息丟失或重復站辉。這一級別可用于如下情況,環(huán)境傳感器數(shù)據(jù)损姜,丟失一次讀記錄無所謂饰剥,因為不久后還會有第二次發(fā)送。

4.2“至少一次”

至少一次

PUBACK消息是對QoS級別為1的PUBLISH消息的響應.PUBACK消息由服務器發(fā)送以響應來自發(fā)布端的PUBLISH消息摧阅,訂閱端也會響應來自服務器的PUBLISH消息汰蓉。當發(fā)布端收到PUBACK消息時,它會丟棄原始消息逸尖,因為它也被服務器接收(并記錄)古沥。

如果一定時間內,發(fā)布端或服務器沒有收到PUBACK消息娇跟,則會進行重發(fā)岩齿。這種方式雖然確保了消息到達,但消息重復可能會發(fā)生苞俘。

4.3“只有一次”

只有一次

PUBREC消息是對QoS級別為2的PUBLISH消息的響應盹沈。它是QoS級別2協(xié)議流的第二個消息。 PUBREC消息由服務器響應來自發(fā)布端的PUBLISH消息,或訂閱端響應來自服務器的PUBLISH消息乞封。發(fā)布端或服務器收到PUBREC消息時做裙,會響應PUBREL消息。

PUBREL消息是從發(fā)布端對PUBREC的響應肃晚,或從服務器對訂閱端PUBREC消息的響應锚贱。 這是QoS 2協(xié)議流中第三個消息。當服務器從發(fā)布者收到PUBREL消息時关串,服務器會將PUBLISH消息發(fā)送到訂閱端拧廊,并發(fā)送PUBCOMP消息到發(fā)布端。 當訂閱端收到來自服務器的消息PUBREL時晋修,使得消息可用于應用程序并將PUBCOMP消息發(fā)送到服務器吧碾。

PUBCOMP消息是服務器對來自發(fā)布端的PUBREL消息的響應,或訂閱者對來自服務器的PUBREL消息的響應墓卦。 它是QoS 2協(xié)議流程中的第四個也是最后一個消息倦春。當發(fā)布端收到PUBCOMP消息時,它會丟棄原始消息落剪,因為它已經將消息發(fā)給了服務器睁本。

在一些要求比較嚴格的計費系統(tǒng)中,可以使用此級別著榴。在計費系統(tǒng)中添履,消息重復或丟失會導致不正確的結果屁倔。這種最高質量的消息發(fā)布服務還可以用于即時通訊類的APP的推送脑又,確保用戶收到且只會收到一次。


附錄:各編程語言對MQTT客戶端/服務器的實現(xiàn)

Name Language Type Last release License
Adafruit IO Ruby on Rails, Node.js Client 2.0.0 ?
flespi C Broker ? Proprietary License
M2Mqtt C# Client 4.3.0.0 Eclipse Public License 1.0
Machine Head Clojure Client 1.0.0 Creative Commons Attribution 3.0 Unported License
moquette Java Broker 0.10 Apache License 2.0
Mosquitto C, Python Broker and client 1.4.15 Eclipse Public License 1.0, Eclipse Distribution License 1.0 (BSD)
Paho MQTT C, C++, Java, Javascript, Python, Go Client 1.3.0 Eclipse Public License 1.0, Eclipse Distribution License 1.0 (BSD)
SharkMQTT C Client 1.5 Proprietary License
VerneMQ Erlang/OTP Broker 1.4.1 Apache License 2.0
wolfMQTT C Client 0.14 GNU Public License, version 2
MQTTRoute C, Python Broker 1.0 Proprietary License
HiveMQ Java Broker 3.4.0 Proprietary License
SwiftMQ Java Broker 11.1.0 Proprietary License
JoramMQ Java Broker 11.1.0 Proprietary License
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末锐借,一起剝皮案震驚了整個濱河市问麸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钞翔,老刑警劉巖严卖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異布轿,居然都是意外死亡哮笆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門汰扭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稠肘,“玉大人,你說我怎么就攤上這事萝毛∠钜酰” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵笆包,是天一觀的道長环揽。 經常有香客問我略荡,道長,這世上最難降的妖魔是什么歉胶? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任汛兜,我火速辦了婚禮,結果婚禮上通今,老公的妹妹穿的比我還像新娘序无。我一直安慰自己,他們只是感情好衡创,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布帝嗡。 她就那樣靜靜地躺著,像睡著了一般璃氢。 火紅的嫁衣襯著肌膚如雪哟玷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天一也,我揣著相機與錄音巢寡,去河邊找鬼。 笑死椰苟,一個胖子當著我的面吹牛抑月,可吹牛的內容都是我干的。 我是一名探鬼主播舆蝴,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谦絮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洁仗?” 一聲冷哼從身側響起层皱,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赠潦,沒想到半個月后叫胖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡她奥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年瓮增,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩俭。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绷跑,死狀恐怖,靈堂內的尸體忽然破棺而出携茂,到底是詐尸還是另有隱情你踩,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站带膜,受9級特大地震影響吩谦,放射性物質發(fā)生泄漏。R本人自食惡果不足惜膝藕,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一式廷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芭挽,春花似錦滑废、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辛馆,卻和暖如春俺陋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昙篙。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工腊状, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苔可。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓缴挖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親焚辅。 傳聞我的和親對象是個殘疾皇子映屋,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359