MQTT 基本認(rèn)知

初始 MQTT

物聯(lián)網(wǎng) (internet of thing) ,表示的是可以把一些帶某些傳感器的設(shè)備(終端),接入到互聯(lián)網(wǎng)的行為策菜。
通過互聯(lián)網(wǎng)連接這些設(shè)備厚掷,這些設(shè)備就能夠互相協(xié)作。
MQTT就是這些設(shè)備之間數(shù)據(jù)通信的一個(gè)基于 TCP/IP 的協(xié)議。

image.png

每個(gè)終端都和實(shí)現(xiàn)了 MQTT 協(xié)議的代理/服務(wù)器相連。
通過 published MQTT 代理服務(wù)器的某個(gè)主題 發(fā)送數(shù)據(jù)。
通過 subscription 從 MQTT 代理服務(wù)器獲取自己訂閱的 主題 數(shù)據(jù)栓始。

代理服務(wù)器本身不產(chǎn)生數(shù)據(jù),數(shù)據(jù)全是由鏈接到這個(gè)代理服務(wù)器的終端產(chǎn)生血当。
終端往服務(wù)器發(fā)送數(shù)據(jù)幻赚,在服務(wù)器訂閱了主題的終端禀忆,接受另外一個(gè)終端發(fā)送到服務(wù)器,并通過服務(wù)器轉(zhuǎn)發(fā)到自己落恼。


為何選擇 MQTT 協(xié)議箩退?

MQTT 協(xié)議是一種輕量級(jí)的、靈活的網(wǎng)絡(luò)協(xié)議佳谦。并且非常適合 IOT 的場(chǎng)景戴涝。

  1. 首先 IOT 協(xié)議的定義非常小巧,不會(huì)像 HTTP钻蔑、HTTPS 那么重量級(jí)啥刻。
  2. 一般支持 IOT 的設(shè)備的網(wǎng)絡(luò)傳輸環(huán)境和自身的計(jì)算能力都比價(jià)薄弱。正好合適MQTT 對(duì)網(wǎng)絡(luò)和數(shù)據(jù)要求不高的輕量級(jí)協(xié)議咪笑。

為什么不選擇其他的網(wǎng)絡(luò)協(xié)議可帽?

大多數(shù)開發(fā)人員已經(jīng)熟悉了 HTTP WEB 協(xié)議。那么為什么不讓 IOT 設(shè)置鏈接到 WEB 服務(wù)窗怒?
設(shè)備可以采用 HTTP 請(qǐng)求的形式發(fā)送數(shù)據(jù)映跟,并采用 HTTP 響應(yīng)的形式從服務(wù)器獲取數(shù)據(jù),接受更新扬虚。
因?yàn)閷?duì)于 IOT 的設(shè)備來說努隙,這種主動(dòng)請(qǐng)求--> 被動(dòng)等待應(yīng)答的 數(shù)據(jù)傳輸模型存在嚴(yán)重的局限性:

  • HTTP 是一種同步協(xié)議」缄牵客戶端需要等待服務(wù)器的響應(yīng)荸镊。Web 瀏覽器具有這樣的要求,但它的代價(jià)是犧牲了可伸縮性路鹰。 在 IoT 領(lǐng)域,大量的設(shè)備以及很可能不可靠或者高延遲的網(wǎng)絡(luò)使得同步通信成為問題收厨。異步消息協(xié)議更適合 IoT 應(yīng)用程序晋柱。傳感器只負(fù)責(zé)發(fā)送數(shù)據(jù),讓網(wǎng)絡(luò)確定將其傳送到目標(biāo)設(shè)備和服務(wù)器的最佳路線和時(shí)間诵叁。

  • HTTP 是單向的雁竞。客戶端必須主動(dòng)的發(fā)起請(qǐng)求拧额。在 IoT 應(yīng)用程序中碑诉,設(shè)備或傳感器通常是客戶端,就意味著侥锦,除非用戶或應(yīng)用程序主動(dòng)請(qǐng)求进栽,否則無法接受來自服務(wù)器的數(shù)據(jù)。

  • HTTP 是一個(gè) 1-1 的協(xié)議恭垦】烀客戶端發(fā)出請(qǐng)求格嗅,服務(wù)器進(jìn)行相應(yīng)。它們是一對(duì)一的對(duì)應(yīng)關(guān)系唠帝。但是需要把 HTTP 這種 1-1的關(guān)系屯掖,改進(jìn)程 IOT 中很常見的 1 對(duì)多的關(guān)系,實(shí)現(xiàn)起來很困難襟衰,而且成本也很高贴铜。而 1 對(duì)多在 IoT 中很常見。

  • HTTP 相對(duì)于 MQTT 來說瀑晒,是一個(gè)比較重的協(xié)議绍坝,它不適合IOT 終端設(shè)備受限的網(wǎng)絡(luò)和較差的計(jì)算能力。

那么瑰妄,MQTT 為什么如此輕便且靈活陷嘴?MQTT 協(xié)議的一個(gè)關(guān)鍵的特性是 發(fā)布/訂閱模型。它將數(shù)據(jù)的發(fā)布者和接受者分離间坐。

一個(gè)設(shè)備終端既可以是數(shù)據(jù)的發(fā)布者(published) 也可以是數(shù)據(jù)的訂閱者(subscription)灾挨。

一個(gè)設(shè)備如果要發(fā)布數(shù)據(jù),只需要往代理服務(wù)器中相應(yīng)的主題發(fā)布數(shù)據(jù)內(nèi)容即可竹宋。
一個(gè)設(shè)備如果需要接受到數(shù)據(jù)劳澄,只需要在代理服務(wù)器中,提前訂閱自己需要關(guān)注的主題即可蜈七。


MQTT 的基本體驗(yàn)

MQTT 最基本的體驗(yàn)秒拔,就是使用 mosquitto
Mosquitto是一款實(shí)現(xiàn)了 MQTT v3.1 協(xié)議的開源消息代理軟件飒硅,提供輕量級(jí)的砂缩,支持發(fā)布/訂閱的的消息推送模式,使設(shè)備對(duì)設(shè)備之間的短消息通信簡(jiǎn)單易用三娩。
它可以理解成一個(gè) MQTT 的代理服務(wù)器庵芭。

基本步驟如下:

  1. 首先使用 brew install
brew install mosquitto
image.png

安裝成功截圖

image.png

使用 brew services start mosquitto 啟動(dòng) MQTT 服務(wù)

運(yùn)行截圖

image.png

然后再打開另外兩個(gè)終端窗口,模擬兩個(gè)IOT設(shè)備雀监。A 訂閱 MQTT 服務(wù)双吆。B 向 MQTT 的服務(wù)發(fā)送數(shù)據(jù)。

A訂閱當(dāng)前MQTT的某個(gè)服務(wù)会前。

mosquitto_sub -t "dw/demo"
image.png

B向 MQTT 服務(wù)器發(fā)布(published) 數(shù)據(jù)。

 mosquitto_pub -t "dw/demo" -m "hello MQTT"
image.png

然后瓦宜,我們就可以在A控制臺(tái)里看到由 B 通過 MQTT 服務(wù)發(fā)送的數(shù)據(jù)了临庇。

image.png

基本流程圖

image.png

控制臺(tái) A 向 MQTT 服務(wù)器訂閱 dw/demo 服務(wù)笛坦,并被動(dòng)的等待 MQTT 服務(wù)器返回?cái)?shù)據(jù)区转。
控制臺(tái) B 主動(dòng)的向 MQTT 服務(wù)器的 dw/demo 服務(wù)發(fā)送 published 數(shù)據(jù),之后版扩。服務(wù)器會(huì)主動(dòng)向事先訂閱了 dw/demo 的終端分發(fā)此消息废离。


了解 MQTT 協(xié)議

MQTT 是一種鏈接協(xié)議,它指定了如何組織數(shù)據(jù)字節(jié)并通過 TCP/IP 網(wǎng)絡(luò)傳輸它們礁芦。但實(shí)際上蜻韭,開發(fā)人員并不需要鏈接這個(gè)鏈接協(xié)議的具體細(xì)節(jié)。我們只需要知道柿扣,每條消息都有一個(gè)命令和數(shù)據(jù)有效負(fù)載肖方。該命令定義消息類型(比如 CONNECT 消息或者 SUB SCRIBE 消息)。所有的 MQTT 庫(kù)和工具都提供了直接處理這些消息的基本方法未状,并且能自動(dòng)填充一些必要的字段(在數(shù)據(jù)包的對(duì)應(yīng)字節(jié)填充)俯画,比如消息和客戶端 ID。

首先客戶端發(fā)送一條CONNECT消息來鏈接代理司草。CONNECT 消息要求建立從客戶端到代理服務(wù)器的鏈接艰垂。

CONNECT 命令的基本參數(shù)

  • cleanSession : 此標(biāo)志指定是否是持久鏈接。持久會(huì)話會(huì)將所有的訂閱和可能丟失的消息(具體取決于 QoS)都存儲(chǔ)在代理(服務(wù)器)中埋虹。
  • username : 鏈接代理服務(wù)器的用戶名猜憎。(對(duì),代理服務(wù)器不是誰想連搔课,想連就能連)
  • password : 鏈接代理服務(wù)器的密碼胰柑。(對(duì),代理服務(wù)器不是誰想連爬泥,想連就能連)
  • lasWillTopic: 鏈接意外中斷柬讨,代理服務(wù)器會(huì)像某個(gè)主題發(fā)送一條 last will 消息。
  • lastWillQos : last will 消息的 QoS袍啡。
  • lastWillMessage : last will 消息本身踩官。
  • KeepAlive : 這是客戶端通過 ping 服務(wù)器來保持鏈接有效所需的時(shí)間間隔。

當(dāng)客戶端向代理服務(wù)器發(fā)送一條 CONNECT 命令之后葬馋,服務(wù)器會(huì)調(diào)用 CONNACK命令卖鲤,告知服務(wù)鏈接的狀態(tài)肾扰。

CONNACK 命令的基本參數(shù)

  • sessionPresent : 此參數(shù)表明鏈接是否已有一個(gè)持久會(huì)話畴嘶。也就是說,連接了訂閱的主題集晚,而且會(huì)接受丟失的消息窗悯??偷拔?
  • returnCode : 0 表示成功蒋院。otherwise 失敗亏钩。

當(dāng)客戶端和服務(wù)器建立連接之后,客戶端就可以向服務(wù)器訂閱某些主題的欺旧。(發(fā)送一條或多條 SUBSCRIBE消息)姑丑。
表明當(dāng)服務(wù)器接受到其他終端推送的此主題數(shù)據(jù)時(shí),服務(wù)器會(huì)默認(rèn)發(fā)送給它辞友。

SUBSCRIBE 參數(shù)列表

  • QoS : 服務(wù)質(zhì)量 (quality of services)栅哀。一般有3個(gè)枚舉值。
    • 0 : 表示不可靠服務(wù)称龙,消息僅推送一次留拾,如果當(dāng)前客戶端在線,或者因?yàn)榫W(wǎng)絡(luò)原因鲫尊,沒有收到就沒有收到痴柔。
    • 1 : 消息至少傳遞 1 次。一次不成功疫向,傳遞第二次咳蔚,第 N 次『枧酰可能會(huì)出現(xiàn)重復(fù)數(shù)據(jù)的情況屹篓。
    • 2 : 消息恰好傳遞 1 次。雙方通過 4 次握手匙奴,保證消息能準(zhǔn)確的從服務(wù)器傳遞給客戶端堆巧,而且只傳一次。
      d

QoS 參數(shù)雖然在客戶端指定泼菌,但規(guī)定的是服務(wù)器傳遞數(shù)據(jù)的模式谍肤。所以,QOS 是用來約束服務(wù)器哗伯,而不是客戶端本身荒揣。

  • topic : 客戶端要訂閱的主題。

一個(gè)主題可以有多個(gè)級(jí)別焊刹,級(jí)別之間用斜杠字符分隔系任。例如 , "dw/demo""/ibm/bluemix/qmqt" 都是有效主題。


當(dāng)客戶端成功的向服務(wù)器訂閱某個(gè)主題之后虐块,服務(wù)器會(huì)返回一條 SUBACK 的消息俩滥,其中包含一個(gè)或者多個(gè) returnCode 參數(shù)。

SUBACK消息參數(shù)

returnCode : 值 0 - 2 贺奠,表示成功訂閱霜旧,并返回這個(gè)訂閱消息的 QOS。值 128 : 訂閱失敗儡率。


既然客戶端可以向服務(wù)器訂閱某個(gè)主題挂据,當(dāng)然也可以取消訂閱以清。
SUBSCRIBE訂閱命令相反的命令是UNSUBSCRIBE取消訂閱命令。
此命令非常簡(jiǎn)單崎逃。只有一個(gè)topic(主題)參數(shù)掷倔。

  • topic : 此參數(shù)就是客戶端取消訂閱的主題。

上面講的是訂閱个绍,訂閱是需要有消息從服務(wù)器發(fā)送過來的今魔。但是服務(wù)器本身基本不產(chǎn)生數(shù)據(jù),那數(shù)據(jù)從何而來呢障贸?
通過另外一個(gè)客戶端執(zhí)行PUBLISH命令错森,往代理服務(wù)器發(fā)送數(shù)據(jù)。并最終通過代理服務(wù)器將數(shù)據(jù)傳遞給訂閱了此服務(wù)的客戶端篮洁。

PUBLISH 消息參數(shù)

  • topicName : 發(fā)布消息的相關(guān)主題涩维。
  • qos : 消息傳遞的質(zhì)量水平。(約束服務(wù)器)
  • retainFlag : 此標(biāo)志表明服務(wù)器是否保留該消息作為針對(duì)此主題的最后一條已知消息袁波。
  • payload : 消息中的實(shí)際數(shù)據(jù)瓦阐。它可以是文本字符串或者二進(jìn)制大對(duì)象數(shù)據(jù)(圖片)

對(duì)于 MQTT 的一張基本理解圖

image.png

基本流程圖:

image.png

最后總結(jié)

  1. MQTT 是一個(gè)輕量級(jí),用于計(jì)算能力弱篷牌,網(wǎng)絡(luò)環(huán)境差的終端設(shè)備之間的數(shù)據(jù)傳輸睡蟋。
  2. MQQ 是基于一個(gè) 發(fā)布/訂閱 的基本模式。
  3. 每個(gè)終端都可以從服務(wù)器訂閱某些主題枷颊,也可以往代理服務(wù)器發(fā)布某些主題戳杀。
  4. 當(dāng)服務(wù)器接受到了某些終端發(fā)送過來的數(shù)據(jù)之后,會(huì)向訂閱了這個(gè)服務(wù)的終端推送這些數(shù)據(jù)夭苗。

參考資料:初識(shí) MQTT

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末信卡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子题造,更是在濱河造成了極大的恐慌傍菇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件界赔,死亡現(xiàn)場(chǎng)離奇詭異丢习,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)淮悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門咐低,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敛惊,你說我怎么就攤上這事渊鞋〈赂” “怎么了瞧挤?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵锡宋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我特恬,道長(zhǎng)执俩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任癌刽,我火速辦了婚禮役首,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘显拜。我一直安慰自己衡奥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布远荠。 她就那樣靜靜地躺著矮固,像睡著了一般。 火紅的嫁衣襯著肌膚如雪譬淳。 梳的紋絲不亂的頭發(fā)上档址,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音邻梆,去河邊找鬼守伸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛浦妄,可吹牛的內(nèi)容都是我干的尼摹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剂娄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窘问!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宜咒,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤惠赫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后故黑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體儿咱,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年场晶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了混埠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诗轻,死狀恐怖钳宪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤吏颖,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布搔体,位于F島的核電站,受9級(jí)特大地震影響半醉,放射性物質(zhì)發(fā)生泄漏疚俱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一缩多、第九天 我趴在偏房一處隱蔽的房頂上張望呆奕。 院中可真熱鬧,春花似錦衬吆、人聲如沸梁钾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陈轿。三九已至,卻和暖如春秦忿,著一層夾襖步出監(jiān)牢的瞬間麦射,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工灯谣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留潜秋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓胎许,卻偏偏與公主長(zhǎng)得像峻呛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜窑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理钩述,服務(wù)發(fā)現(xiàn),斷路器穆碎,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 隨著物聯(lián)網(wǎng)(Internet of Things牙勘,IoT)的興起,機(jī)器之間(Machine-to-Machine所禀,...
    登高且賦閱讀 12,506評(píng)論 0 18
  • 一:前言 最近在了解MQTT協(xié)議相關(guān)的內(nèi)容方面,內(nèi)容有點(diǎn)多,特此把MQTT協(xié)議色徘,以及其從服務(wù)端到客戶端的流程整理出來...
    子夏的不語閱讀 70,071評(píng)論 9 92
  • 是的恭金, 冬日來了 當(dāng)遠(yuǎn)山滿目的綠色 變成凝重的蒼青 當(dāng)天空寂寥得 只剩下灰色的麻雀掠過 當(dāng)寒冷不再是人們訝異的氣候...
    雲(yún)朵閱讀 192評(píng)論 0 1
  • 初心?初心褂策!初心横腿。 不管是誰颓屑?他在做什么?或者準(zhǔn)備做什么耿焊?做成功了揪惦,或者失敗了,他的第一開始的想法被稱為初心搀别。 工...
    獨(dú)孤因果閱讀 250評(píng)論 2 4