本篇利用 Mosquitto 設置一個 MQTT 伺服器,伺服器的 OS 為 Ubuntu 24.04.1 LTS。

在開始之前,MQTT 預設使用的 Port 號是 1883,防火牆的傳出傳入規則務必要設定一下,記得打開。

安裝 Mosquitto

此例為 Linux 環境,我們利用 apt 進行 Mosquitto 套件的安裝:

1
sudo apt install mosquitto mosquitto-clients -y

其中 mosquitto 套件是主要的 Mosquitto 伺服器,而 mosquitto-clients 包含了指令工具如 mosquitto_sub, mosquitto_pub

而指令開頭的 sudo 的意思是:

Super Idol 的笑容,都沒你的甜。八月正午的陽光,都沒你耀眼。

我開玩笑的,其實是 superuser do。

接著我們透過 configuration 設定一下我們 Mosquitto 的規則。我們在 /etc/mosquitto/conf.d/ 中,加入一個設定檔:

1
sudo nano /etc/mosquitto/conf.d/default.conf

nano 是 Linux 自帶的文件編輯程式,你可以用其他你會的方式來編輯這個 conf 檔。我們添加下列設定:

1
2
allow_anonymous true
listener 1883 0.0.0.0

這代表我接受任何匿名傳入資訊,只要你從 1883 這個 port 進來,來者不拒,方便我們前期快速測試。

設定好之後,我們重啟 mosquitto:

1
sudo systemctl restart mosquitto

現在,我們想要讓這台伺服器接受傳入。我們輸入指令 mosquitto_sub -h my_public_ip -t my_topic

其中,my_public_ip 填入這台伺服器的外網IP外置、my_topic 隨意填入你要訂閱的主題。

此時,這裡的 mosquitto_sub 代表我現在作為 subscriber,要訂閱所有關於 my_topic 的消息,以後有 publisher 發出 my_topic 的消息,我都會收到。

收發消息

假設我伺服器的 IP 現在是 87.87.87.87,所以我輸入:

1
mosquitto_sub -h 87.87.87.87 -t beiqi

我用另一台電腦輸入如下指令:

1
mosquitto_pub -h 87.87.87.87 -t beiqi -m "呼叫波士頓,over!"

此時 server 應該就會收到「呼叫波士頓,over!」。

當然,請注意作為 publisher 的電腦也要允許傳出,如果你失敗了請查看一下是否是防火牆在搞。

設定認證機制

現在,我不想收到一堆垃圾訊息,希望可以建立認證方式,讓擁有權限的人才能 publish 內容過來。那麼我們可以透過 mosquitto_passwd -c <password file> <username> 來創建帳號密碼。

好的此時我們輸入:

1
sudo mosquitto_passwd -c /etc/mosquitto/passwd user_87

其中 -c 代表 create,因為這是我們第一次設置用戶跟密碼,這步驟會幫我們建立一個名為 passwd 的檔案(passwd可以自己隨意取名)。而 user_87 為用戶名。

執行後會請你輸入密碼,此例中,我們輸入 12345。

完成之後,我們要回頭修改前面的 /etc/mosquitto/conf.d/default.conf,改成:

1
2
3
allow_anonymous false
password_file /etc/mosquitto/passwd
listener 1883 0.0.0.0

目前為止,標準的做法是這樣沒錯。但根據我的經驗,如果此時就重啟 Mosquitto,會報如下錯誤:

Job for mosquitto.service failed because the control process exited with error code. See “systemctl status mosquitto.service” and “journalctl -xeu mosquitto.service” for details.

問題其實是,我們建立出來的 passwd 的權限太高了,我們要調整一下:

1
sudo chmod 644 /etc/mosquitto/passwd

此處的 chmod 是 change mode 的意思,644 旨在把權限調低,這裡有點離題所以不做展開咯。

收發帶認證的消息

設定完賬號密碼後,我們的伺服器作為 subscriber 輸入:

1
mosquitto_sub -h 87.87.87.87 -t beiqi -u user_87 -P 12345

其中 -u 代表用戶名、-P 代表密碼。這裡都輸入剛剛設定好的內容。

而另一台電腦作為 publisher 則輸入:

1
mosquitto_pub -h 87.87.87.87 -t beiqi -u user_87 -P 12345 -m "還要打帳號密碼好麻煩!"

此時伺服器就會收到「還要打帳號密碼好麻煩!」的訊息咯!