Raspberry Pi 筆記(48):IoT裝置間的通訊協定 MQTT

近年來由於物聯網的進步,物與物之間的通訊變的很重要,其中常被用來作為通訊的協定是MQTT,什麼是MQTT呢?看一下維基百科的解釋:

MQTT(Message Queuing Telemetry Transport) 是ISO 標準(ISO/IEC PRF 20922)下基於發布/訂閱範式的消息協議。它工作在 TCP/IP協議族上,是為硬體性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議,為此,它需要一個消息中間件 。IBM公司的安迪·斯坦福-克拉克及Arcom公司的阿蘭·尼普於1999年撰寫了該協議的第一個版本。[維基百科]

MQTT.ORG的解釋如下:
MQTT是機器對機器(M2M)/“物聯網”連接協議。它被設計為一個非常輕量級的發布/訂閱消息傳輸。對於需要較小代碼佔用空間和/或網絡帶寬非常寶貴的遠程位置的連接非常有用。例如,它已被用於通過衛星鏈路與代理通信的傳感器,偶爾與醫療服務提供商的撥號連接,以及一系列家庭自動化和小型設備場景。它也是移動應用的理想選擇,因為它體積小,功耗低,數據包最小化,並且可以有效地將信息分配給一個或多個接收器。[mqtt.org]

MQTT的傳遞架構如下圖,發佈者將要傳遞的訊息,透過代理Broker將訊息送到訂閱者,這就是 MQTT 基本的訊息傳遞基本架構。

以下就來實作如何透過 MQTT協定傳送訊息在兩台電腦之間。

[安裝 Mosquitto]

在repo.mosquitto.org 上使用debian存儲庫,簽名密鑰於2017年底到期,請使用以下命令更新密鑰:
$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ sudo apt-key add mosquitto-repo.gpg.key

變更套件下載時詢問的伺服主機路徑
$ cd /etc/apt/sources.list.d/
$ sudo wget http://repo.mosquitto.org/debian/mosquitto-stretch.list
回目錄,並進行更新
$ cd
$ sudo apt-get update
以下指令可以查詢 mosquitto 哪些套件可以使用:
$ apt-cache search mosquitto
執行安裝
$ sudo apt install -y mosquitto mosquitto-clients
將 mosquitto 啟動成服務
$ sudo systemctl enable mosquitto.service
檢視 mosquitto 狀態
$ service mosquitto status

注意:有時命令mosquitto -v會提示警告消息“ 錯誤:地址已在使用中 ”。該警告信息意味著您的Mosquitto Broker已經在運行,所以不要擔心。

[訂閱主題]

執行 mosquitto_sub指令訂閱主題,-h參數後面帶主機IP,-t 參數後面帶著訂閱的主題,ceiling/test 就是主題的名稱。「Hi, Ceiling!」
$ mosquitto_sub -h 192.168.1.128 -t ceiling/test



[發佈訊息]

開啟另一個新的終端機視窗,輸入以下指令,也可以使用 -h 指定送達的IP位址,也就是mosquitto_sub 執行的主機IP,-t 參數後面帶著訂閱的主題,-m 發佈的訊息內容。
$ mosquitto_pub -t ceiling/test -m "Hi, Ceiling"
執行之後,前一個終端機視窗會出現以下訊息:

我們測試一下在Windows安裝 mosquitto 來進行訊息發佈,請先到官網下載安裝檔,我安裝的版本是:mosquitto-1.5.8-install-windows-x64.exe 。

執行後,按下一步,將 mosquitto 安裝成 Service,再按  Next。

指定安裝目錄,按 Next,再下一部就完成了,很簡單。

安裝完成後,有 mosquitto 的服務程式可以執行,我們測試一下發佈訊息的指令。執行前需先變更所在目錄路徑到 mosquitto 程式位置。執行 cmd.exe啟動視窗,輸入以下指令:
C:\>cd "\Program Files\mosquitto"
C:\Program Files\mosquitto> mosquitto_pub -h 192.168.1.128 -t ceiling/test -m "Hi, Ceiling"

mosquitto_pub 執行後,在 mosquitto_sub 視窗會顯示收到的訊息,而 mosquitto 視窗則會顯示 log 訊息。

[使用者認證機制]

上述傳送訊息時,並沒有限定特定用戶端可以傳送,這在網路的世界裡是非常危險的。MQTT也同樣具有認證的機制。有兩個方法密碼來建立密碼檔,一是在文字檔編輯後,執行轉譯加密,二是直接透過指令寫入密碼檔。

方法一:建立密碼檔
$ cd /etc/mosquitto/
建立一個密碼檔 mosq_pwd
$ sudo nano mosq_pwd
執行以下指令,將密碼檔內的密碼加密
$ sudo mosquitto_passwd -U passwordfile
結果如下:

方法二:輸入指令建立密碼檔
另一個方法是使用指令直接建立密碼檔,使用 -c 的參數,例如以下指令在執行後,會將方法一的密碼檔覆蓋掉,僅留下最後一筆。
$ sudo mosquitto_passwd -c /etc/mosquitto/mosq_pwd 

之後系統會要求輸入密碼兩次:

如果不使用-c參數,則會繼續加在密碼檔的最後一筆。

建立好密碼檔後,還要停用匿名使用,可以修改 mosquitto.conf 設定檔,將密碼檔位置加入,並設定匿名無法存取。
$ sudo nano /etc/mosquitto/mosquitto.conf
加上以下兩行文字:
password_file /etc/mosquitto/mosq_pwd
allow_anonymous false
第二行的 allow_anonymous false會讓所有的 Client端均需要密碼才能連線至代理Broker。

改好設定後,需要執行以下指令重新啟動 mosquitto 服務
$sudo /etc/init.d/mosquitto restart
訂閱指令需加上帳號密碼:
$ mosquitto_sub -h 192.168.1.128 -t ceiling/test -u ceiling -P abc123

需要使用帳號/密碼進行訊息發佈:
$ mosquitto_pub -h 192.168.1.128 -t ceiling/test -m "Hi, Ceiling" -u ceiling -P abc123

若要刪除一個用戶,則可執行以下指令:
$ sudo mosquitto_passwd -D passwordfile user

[參考資料]



Post a Comment

較新的 較舊