MQTT 是一種輕量級且簡單有效的通訊協定,可以在物聯網( IoT )設備之間進行通訊,目前已被廣泛使用在各種物聯網應用中。本文將介紹 MQTT 的概念搭配 Webduino 萬用遙控器體驗,幫助讀者更好地理解和應用 MQTT!

MQTT picture from https://www.freepik.com/

MQTT 是什麼?

歷史沿革

起初 IBM 公司正在開發一個物聯網項目,需要一種輕量的二進制通訊協定,以實現設備之間的通訊。因此,由 IBM 的 Andy Stanford-Clark 及 Arcom 公司的 Arlen Nipper 於 1999 年開發了此協定的第一個版本,並在 2001 年開源,隨後在 2014 年被 OASIS 標準化。

OASIS( 結構化資訊標準促進組織 ):全球的非營利組織,主要在發展及整合物聯網、網路服務等領域的相關標準。

基本原理

MQTT ( Message Queuing Telemetry Transport ) 的設計目的,是讓設備能夠透過網路傳送小型數據包,控制訊息最小只有 2 位元組的資料,將訊息用最精簡的方式傳送出去,並且使用較少的網路頻寬和電力。由於 MQTT 具備可靠性高、可擴展性強、網路傳輸效率高⋯⋯等特點,故廣泛應用於各種場景中,例如物聯網、Facebook Messenger 即時通訊、遠程控制等。

MQTT LOGO
MQTT LOGO

MQTT 及 HTTP 的比較

HTTP ( 超文本傳輸協定 ) 是一種客戶端 / 伺服器端的通訊協定,使用請求 / 回應模式進行通訊。當用戶端發送請求給伺服器時,伺服器會回應一個包含狀態碼和資料的回應。HTTP 通常用於網頁和 API 傳輸,並且設計為一種無狀態協定,每次請求都是獨立的,不會保留任何狀態資訊

MQTT 及 HTTP 的共通點

  • 使用 TCP / IP 協定來傳輸資料
  • 用於實現客戶端和伺服器之間的通訊
  • 傳輸二進制或文本數據,支援不同的傳輸格式

MQTT 及 HTTP 的相異點

HTTPMQTT
用途Web 服務器之間的通訊IoT 設備之間的通訊
傳輸方式請求 / 回應模式發布 / 訂閱模式
安全性HTTPS( 超文本傳輸安全協議 )SSL / TLS 和其他安全機制
可靠性需實施附加組件 ( TCP )基於 QoS,完全可靠
可傳輸資料量較小較大
佔用頻寬較大較小
HTTP vs MQTT 相異點比較

MQTT 的訊息規範

1999 年 IBM 提出第一版本的 MQTT 協定時,他們設計了一個基於「 發布 / 訂閱 」模式的訊息規範,來滿足簡單、網路不穩定、輕量級的需求。接下來將說明 MQTT 的「 發布 / 訂閱 」模式、主題( Topic )名稱以及服務品質 ( QoS ) 設定。

發布 / 訂閱( Publish / Subscribe )模式

MQTT 是採用 Publish / Subscribe 模式,Publisher ( 發佈者 )發佈一個 Topic( 主題 )的訊息,Subscriber( 訂閱者 )可以透過 Subscribe( 訂閱 )該主題來接收相關的訊息。當 Publisher 發佈一個新的訊息時,Broker ( 中間人 ) 會將該訊息轉發給所有訂閱了該主題的 Subscriber。而 Subscriber 則可以通過訂閱不同的主題來接收不同的訊息,也可以透過Unsubscribe( 取消訂閱 )某個主題來停止接收相關的訊息。

 MQTT Publish / Subscribe 模式示意圖
 MQTT Publish / Subscribe 模式示意圖

MQTT 的主題( Topic )名稱

MQTT 的 Topic 是萬國碼 UTF – 8 編碼的字串,階層 ( level ) 數量沒有限制,但不能超過 65,535 個位元,主題階層之間需使用斜線 “/ ” 分隔。可以參考下列範例:

  • home/bedroom/temperature:表示家裡臥室的溫度,可以用來監控空調或暖氣的效能。
  • devices/lighting/office/bulb1:表示辦公室的第一盞燈,可以用來遠端控制燈光開關或調整亮度。
  • weather/forecast/week1/temperature:表示未來一周的氣溫預報,可以用來提醒人們注意氣溫變化。

MQTT 的服務品質 ( QoS ) 設定

QoS 是 MQTT 中用於控制訊息傳輸質量的機制,MQTT 定義了三種不同的 QoS 等級:QoS 0、QoS 1 和 QoS 2。

QoS 0 為最多傳輸一次,且不保證訊息能夠成功傳出;QoS 1 為至少傳輸一次,可以確保消息能夠到達接收端,但可能會重複傳輸;QoS 2 為確實傳輸一次,傳送訊息時會分成兩段式,並保證消息能夠到達接收端,但也可能導致較高的延遲。

總體而言,MQTT 的訊息規範非常靈活和容易擴展,可以應用於各種不同的場景。MQTT 的主題( TOPIC )和品質 ( QoS ) 設定使得訊息傳輸非常高效,同時也讓 MQTT 易於實現和部署。

體驗 MQTT 在物聯網的實際應用

上述提及 MQTT 是物聯網中重要的通訊協定之一,利用簡單而有效的方法來即時傳輸物聯網設備之間的數據,加速系統進行處理和分析。接下來將分享 MQTT 實際應用在物聯網的案例「 萬用遙控器 」提供讀者參考。

Webduino 萬用遙控器

為方便教學現場使用,Webduino 在 MQTT 上疊加了視覺化操作介面,不需要額外設定主機、帳號跟密碼。以 Webduino 萬用遙控器 為例,我們可以直接透過網頁設置「 發佈 」跟「 接收 」的頻道,並且串接 Webduino 的服務,不需要另外註冊該平台的帳號也能互相傳送訊息。

Webduino 萬用遙控器

接下來我們可以模擬教室教學現場扮演老師和學生,拿出手邊的手機或電腦開啟 Webduino 萬用遙控器體驗,藉由淺顯易懂的方式讓學生們快速了解 MQTT 。

實際體驗範例

˙ 步驟一
老師及學生打開網路並開啟 Webduino 萬用遙控器,開啟後點選右上角設定 ≡ 輸入相同的頻道名稱 ( 可以自行更改頻道名稱 ),設定後即可互相發送、接收訊息。

以下圖為例,根據上述提及 MQTT 的訊息規範( Publish / Subscribe 模式 ),使用者必須訂閱「 webduino 」這個頻道才能接收到訊息。假設有學生沒有訂閱此頻道,也就是接收頻道不是「 webduino 」,則該學生不會接收到老師或同學在 「 webduino 」頻道中發送的訊息。

Webduino 萬用遙控器 - 設定廣播頻道
Webduino 萬用遙控器 – 設定廣播頻道

˙ 步驟二
自行設定每個按鈕想要發送的訊息,例如:老師可以設定按鈕 1 對應的是座號尾數 1 的同學,當老師在萬用遙控器上點擊按鈕 1 時,廣播訊息會發送到該頻道,則座號尾數對應到的同學們要回答問題。

設定好頻道及按鈕廣播訊息後,該頻道會自動更新及儲存設定好的訊息。若想要將連結分享給其他人則要拉至最底下「 儲存分享連結 」,待產生特定連結後就可以將連結傳送給其他人。

設定不同按鈕對應的廣播訊息
設定不同按鈕對應的廣播訊息
點擊「 按鈕 1 」會顯示廣播訊息 「 座號尾數 1 的同學回答 」
點擊「 按鈕 1 」會顯示廣播訊息 「 座號尾數 1 的同學回答 」

˙ 步驟三
設定好廣播頻道及訊息後,老師可以點選左上角的九宮格,開始發送訊息,也可以直接手動輸入要傳送的訊息在對話框中,點擊「 傳送 」訊息後,則會顯示在最上方給有訂閱頻道的學生。

自行輸入想發送的訊息
自行輸入想發送的訊息

MQTT 的特點

體驗完 Webduino 萬用遙控器後,會發現只要訂閱相同的頻道,便可輕鬆地在各種裝置上互相傳送訊息,無論是電腦或手機都可以輕鬆操作。如果在教學現場,老師可以在學生體驗完萬用遙控器後,引導學生一同探討 MQTT,並觀察學生們是否有發現特別之處。此外,小編也提供幾個 MQTT 的特點,供老師們在課堂中分享:

  • 相同頻道一次只能接收一個訊息。
  • 新的訊息會覆蓋舊的訊息,且傳送過的訊息不會被記錄下來。
  • 除非經過設計,否則訊息是採匿名,無法得知是哪部裝置傳送。
  • 裝置必須有網路才能傳送訊息,但訊息不受裝置間的距離限制,不管距離多遠都可以傳送。

結語

MQTT 作為一個輕量級且高效的通訊協定,在物聯網領域已經得到了廣泛的應用和認可。透過本文的介紹,讀者一定深入了解 MQTT 的基本概念、原理以及應用情境等方面的知識,對於如何在物聯網設備之間進行高效通訊有更清晰的認識和理解。如果需要在許多設備之間進行即時、可靠的數據傳輸,那麼 MQTT 一定是個不錯的選擇!