【零基礎(chǔ)學物聯(lián)網(wǎng)】MQTT篇 1-2 MQTT基本原理
為了幫助您學習,我們專門為本教程制作了視頻。
在上節(jié)課“MQTT篇 1-1 MQTT是什么”里我們學習了MQTT協(xié)議的背景知識和基本特點,這節(jié)課我們一起了解MQTT的基本工作原理。
在MQTT協(xié)議通訊中,有兩個最為重要的角色。它們分別是服務(wù)端和客戶端。首先我們來初步了解一下它們。
MQTT服務(wù)端:
MQTT服務(wù)端通常是一臺服務(wù)器。它是MQTT信息傳輸?shù)臉屑~,負責將MQTT客戶端發(fā)送來的信息傳遞給MQTT客戶端。MQTT服務(wù)端還負責管理MQTT客戶端。確??蛻舳酥g的通訊順暢,保證MQTT消息得以正確接收和準確投遞。
MQTT客戶端:
MQTT客戶端可以向服務(wù)端發(fā)布信息,也可以從服務(wù)端收取信息。我們把客戶端發(fā)送信息的行為成為“發(fā)布”信息。而客戶端要想從服務(wù)端收取信息,則首先要向服務(wù)端“訂閱”信息?!坝嗛啞毙畔⑦@一操作很像我們在視頻網(wǎng)站訂閱某一部電視劇。當這部電視劇上新后,視頻網(wǎng)站會向訂閱了該劇的用戶發(fā)送信息,告訴他們有新劇上線了。
MQTT主題
剛剛我們在講解MQTT客戶端訂閱信息時,使用了用戶在視頻網(wǎng)站訂閱電視劇這個例子。在MQTT通訊中,客戶端所訂閱的肯定不是一部部電視劇,而是一個個“主題”。MQTT服務(wù)端在管理MQTT信息通訊時,就是使用“主題”來控制的。
為了便于您更好理解服務(wù)端是如何通過主題來控制客戶端之間的信息通訊,我們來看看下圖實例:

在以上圖示中一共有三個MQTT客戶端。它們分別是汽車,手機和電腦。MQTT服務(wù)端在管理MQTT通訊時使用了“主題”來對信息進行管理的。比如上圖所示,假設(shè)我們需要利用手機和電腦獲取汽車的速度,那么我們首先要利用電腦和手機向MQTT服務(wù)器訂閱主題“汽車速度”。接下來,當汽車客戶端向服務(wù)端的“汽車速度”主題發(fā)布信息后,服務(wù)端就會首先檢查以下都有哪些客戶端訂閱了“汽車速度”這一主題的信息。當它發(fā)現(xiàn)訂閱了該主題的客戶端有一個手機和一個電腦,于是服務(wù)端就會將剛剛收到的“汽車速度”信息轉(zhuǎn)發(fā)給訂閱了該主題的手機和電腦客戶端。
在以上實例中,汽車是“汽車速度”主題的發(fā)布者,而手機和電腦則是該主題的訂閱者。
值得注意的是,MQTT客戶端在通訊時,往往角色不是單一的。它既可以作為信息發(fā)布者也可以同時作為信息訂閱者。如下圖所示:

上圖中的所有客戶端都是圍繞“空調(diào)溫度”這一主題進行通訊的。對于“空調(diào)溫度”這一主題,手機和電腦客戶端成為了MQTT信息的發(fā)布者而汽車則成為了MQTT信息的訂閱者(接收者)。
可以看到,針對不同的主題,MQTT客戶端可以切換自己的角色。它們可能對主題A來說是信息發(fā)布者,但是對于主題B就成了信息訂閱者。
MQTT 發(fā)布/訂閱 特性
從以上實例我們可以看到,MQTT通訊的核心樞紐是MQTT服務(wù)端。有了服務(wù)端對MQTT信息的接收、儲存、處理和發(fā)送,客戶端在發(fā)布和訂閱信息時,可以相互獨立,且在空間上可以分離,時間上可以異步。這里所說的相互獨立、空間和時間分離具體指的是什么呢?
相互可獨立:MQTT客戶端是一個個獨立的個體。它們無需了解彼此的存在,依然可以實現(xiàn)信息交流。比如以上實例中汽車客戶端在發(fā)布“汽車速度”信息時,汽車客戶端本身可以完全不知道有多少個MQTT客戶端訂閱了“汽車速度”這一主題。而訂閱了“汽車速度”主題的手機和電腦客戶端也完全不知道彼此的存在。大家只要訂閱了“汽車速度”主題,MQTT服務(wù)端就會在每次收到新信息時,將信息發(fā)送給訂閱了“汽車速度”主題的客戶端。
空間可分離:空間分離相對容易理解,MQTT客戶端在通訊比要條件是連接到了同一個MQTT通訊網(wǎng)絡(luò)。這個網(wǎng)絡(luò)可以是互聯(lián)網(wǎng)或者局域網(wǎng)。只要客戶端聯(lián)網(wǎng),無論他們遠在天邊還是近在眼前,都可以實現(xiàn)彼此間的通訊交流。
時間可異步:MQTT客戶端在發(fā)送和接收信息時無需同步。這一特點對物聯(lián)網(wǎng)設(shè)備尤為重要。有時物聯(lián)網(wǎng)設(shè)備會發(fā)生意外離線的情況。我們使用以上實例二的場景來作為示例。當我們的汽車在行駛過程中,可能會突然進入隧道,這時汽車可能會斷開與MQTT服務(wù)端的連接。假設(shè)在此時我們的手機客戶端向汽車客戶端所訂閱的“空調(diào)溫度”主題發(fā)布了信息,而汽車恰恰不在線。這時,MQTT服務(wù)端可以將“空調(diào)溫度”主題的新信息保存,待汽車再次上線后,服務(wù)端再將“空調(diào)溫度”信息推送給汽車。
以上幾點概括了MQTT通訊時客戶端的相互關(guān)系以及服務(wù)端在其中所起的作用。講到這里請您注意:以上總結(jié)的幾個特點中都有一個“可”字。這個“可”字意味著客戶端彼此之間可以獨立,空間可以分離,時間可以異步。在我們實際應(yīng)用中,客戶端之間的關(guān)系既可以獨立也可以相互依存。在空間上,既可以相距甚遠,也可以彼此相鄰。在時間上,既可以異步也可以同步。這個“可”字所體現(xiàn)的是MQTT通訊的靈活性。
可能有些朋友看過以上文字后感覺有些抽象。畢竟這些都是純理論知識,在后面的教程里,我們將通過實例向您講解MQTT的應(yīng)用,屆時相信您會對MQTT有深切的認識。到這里,請您務(wù)必留意MQTT通訊的三個特點,彼此可獨立,空間可分離、時間可異步。

本教程為 太極創(chuàng)客團隊 制作的《零基礎(chǔ)入門學用物聯(lián)網(wǎng)》系列教程第二篇- MQTT篇。假如您學習本教程感到有些吃力,那么您可能還沒有觀看本系列教程 第一篇 - 基礎(chǔ)知識篇。您可以通過以下鏈接前往本教程的第一篇 - 基礎(chǔ)知識篇 教程頁面。


假如您也喜歡太極創(chuàng)客,希望您將本文“分享”給更多的人,讓更多朋友認識我們。您的每一份點贊與投幣,都是對我們最溫暖的鼓勵與支持。
本文編輯制作:CYNO朔 (https://space.bilibili.com/415252426/)