前言
在 IoT 領域第一個碰到的傳輸協定應該會是 http,再深入一點則是 MQTT,MQTT 是一個非常輕便的傳輸協定,沒有像是 http header 的東西,可以節省相當的流量!實現 MQTT 傳輸協定最有名的軟體應該莫過於 Mosquitto,網路上有許多 Mosquitto 的說明,這裡只紀錄如何架設與測試。
環境
- CentOS 7.9
安裝
Mosquitto 預設是不在安裝套件內的,因此需要先安裝 Extra Packages for Enterprise Linux (EPEL)
1 | [user@localhost ~]$ sudo yum install -y epel-release |
安裝 Mosquitto 並啟動服務
1 | [user@localhost ~]$ sudo yum install -y mosquitto |
測試
開啟一個新的 Terminal (在此稱 tty1),輸入指令來訂閱主題
1 | [user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 |
mosquitto_sub
:訂閱主題。-h
:指定 MQTT Broker 的 IP 或 FQDN。-t
:指定訂閱的主題名稱。
開啟另一個新的 Terminal (在此稱 tty2),輸入指令來發布主題
1 | [user@localhost ~]$ mosquitto_pub -h localhost -t Try/MQTT/CentOS7 -m "Test Message" |
mosquitto_pub
:發布主題。-h
:指定 MQTT Broker 的 IP 或 FQDN。-t
:指定發布的主題。-m
:發布的訊息。
這時在 tty1 應該就能看到 Test Message
的訊息,此時代表 Mosquitto 安裝完成且可以正常運行!測試完畢後,可以關閉 tty1 與 tty2。
建立使用者帳號
創建帳號
1 | [user@localhost ~]$ sudo mosquitto_passwd -c /etc/mosquitto/passwd test_account |
-c
:執行指令的同時建立一個帳密檔。/etc/mosquitto/passwd
:為帳密檔位置。test_account
:為所要新增的帳號,可以自行更改。
修改 Mosquitto 設定檔 (/etc/mosquitto/mosquitto.conf
),加入以下兩行
1 | allow_anonymous false # 不可匿名登入,一定要輸入帳密 |
重啟 Mosquitto 服務
1 | [user@localhost ~]$ sudo systemctl restart mosquitto |
使用者帳號測試
開啟一個新的 Terminal (在此稱 tty1),使用指令來訂閱主題。但由於我們已經設定為不可匿名登入,可以預想到的是會無法正常運作,因為沒有授權 (也就是沒有輸入帳號)
1 | [user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 |
tty1 中的指令更改如下
1 | [user@localhost ~]$ mosquitto_sub -h localhost -t Try/MQTT/CentOS7 -u test_account -P 1234 |
-u
:指定使用者帳號。-P
:指定密碼,注意是大寫 P。
開啟另一個新的 Terminal (在此稱 tty2)
1 | [user@localhost ~]$ mosquitto_pub -h localhost -t Try/MQTT/CentOS7 -m "Test Message" -u test_account -P 1234 |
這時在 tty1 應該就能看到 Test Message
的訊息,此時代表帳號密碼機制設定完成並且有正常運作!
設定防火牆
在 CentOS 中幾乎所有的 Port 預設對外服務都是關閉的,無法由外部連入,因此需要另外設定才能開放給其他主機連線,MQTT 預設的 Port 為 1883
1 | [user@localhost ~]$ sudo firewall-cmd --permanent --add-port=1883/tcp |