物聯網的基礎協議之MQTT
- 2020 年 3 月 17 日
- 筆記
1.本文概述
本文主要介紹MQTT相關的概念,並且通過搭建MQTT伺服器和客戶端,測試MQTT的通訊。本文主要從實際使用的角度去理解MQTT,並不會講述過於深奧的理論知識。可以通過下面的文章了解MQTT的相關介紹。
2.MQTT基本介紹
MQTT的全稱為Message Queuing Telemetry Transport,也就是消息隊列遙測傳輸。1999年,IBM公司的Andy Stanford-Clark 和來自Eurotech公司的Arlen Nipper創造了MQTT協議。其中「MQTT」中的「MQ」是來自IBM的MQ系列消息隊列產品線。
MQTT最初的用法是在石YouTube道控制中,將每一個節點的資訊通過衛星傳到到控制中心去。所以MQTT從創立之初就是為物聯網創立。
那麼什麼是MQTT協議呢?簡單地說,主要有下面三個特點:
(1)協議本身基於TCP/IP,輕量級的發布和訂閱
(2)開放的協議
(3)簡單,容易實現
所以該協議可以應用於各種環境中,非常適合需要低功耗而且頻寬有限的IoT場景中,比如:
- 遙感數據
- 汽車
- 智慧家居
- 智慧城市
- 醫療醫護
運用MQTT協議,設備可以很方便的接入物聯網服務,管理並處理數據,最後應用到各種業務場景

3.mqtt伺服器的搭建
目前伺服器的搭建環境是ubuntu16.04
採用的伺服器是mosquitto,官方網站https://mosquitto.org

在控制台上輸入下面的命令進行下載。
wget https://mosquitto.org/files/source/mosquitto-1.5.7.tar.gz
下載完成後解壓並進入mosquitto-1.5.7目錄
在編譯時,先安裝gcc編譯工具,然後下載依賴的環境
sudo apt-get install openssl sudo apt-get install libssl-dev sudo apt-get install uuid-dev
最後執行 make
開始編譯,編譯完成後輸入 sudo make install
安裝程式。
接著配置伺服器相關資訊
sudo cp /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf sudo vim /etc/mosquitto/mosquitto.conf
添加一個用戶,如下圖所示

這樣,mqtt伺服器就安裝完成了。
下面啟動伺服器
mosquitto -c /etc/mosquitto/mosquitto.conf -v
測試
對於MQTT協議來說,有一個非常關鍵的模式:發布/訂閱模式。發布/訂閱模式(pub / sub)是傳統客戶端 – 伺服器模型的替代方案,客戶端直接與端點通訊。然而,Pub / Sub將正在接收消息(稱為訂戶)的另一客戶端(或更多客戶端)發送特定消息(稱為發布者)的客戶端去耦,這意味著發布者和訂閱者不了解彼此的存在,有一個第三個組件,稱為代理,由它作為中轉,它將過濾所有傳入的消息並相應地分發給它們,所以我們來詳細介紹一下剛剛提及的方面。
訂閱者
訂閱者的角色要保持長連接狀態,我們可以另外開一個控制台窗口進行測試訂閱一個topic01的主題,去接收這個主題的消息。
mosquitto_sub -v -t topic01
這個過程可能會遇到如下的錯誤

解決辦法
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
這樣訂閱者就處於不斷等待消息到來的模式。
發布者
這時可以另外再開一個控制台,去發布topic01主題的消息。
mosquitto_pub -t topic01 -m "123456"

不難看出,我們的訂閱者已經接收到消息了。
4. mqtt客戶端的使用
對於mqtt客戶端的使用,可以測試mqtt,所以我們的環境選擇Windows平台。可以使用MQTT.fx。
MQTT.fx 是目前主流的mqtt客戶端,可以快速驗證是否可以與IoT Hub 服務交流發布或訂閱消息。設備將當前所處的狀態作為MQTT主題發送給IoT Hub,每個MQTT主題topic具有不同等級的名稱,如「建築/樓層/溫度。」 MQTT代理伺服器將接收到的主題topic發送給給所有訂閱的客戶端。
下載地址:http://www.jensd.de/apps/mqttfx
安裝最新的版本就可以了

由於我們前面已經在ubuntu上搭建好了MQTT伺服器,所以接下來直接使用

點擊publish即可在我們的訂閱者上監聽到消息

同時MQTT.fx 也可以作為監聽者


這樣我們就創建好了一個mqtt本地的測試環境。
5. 總結
本次的實驗目的是體驗一下mqtt的數據傳輸,同時學習了mqtt的一些基本的使用方法,後面會詳細介紹物聯網通訊以及雲伺服器相關的知識,本文並沒有詳細介紹mqtt具體在項目中的使用方法,後面再做完善。