Linux 系統架設 MQTT 伺服器
本篇利用 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 | allow_anonymous true |
這代表我接受任何匿名傳入資訊,只要你從 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 | allow_anonymous false |
目前為止,標準的做法是這樣沒錯。但根據我的經驗,如果此時就重啟 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 "還要打帳號密碼好麻煩!" |
此時伺服器就會收到「還要打帳號密碼好麻煩!」的訊息咯!