MQTT教學(十):設定Mosquitto 2.x版的mosquitto.conf設置檔

開放原始碼的MQTT伺服器(broker)Mosquitto 2.x版,需要經過設置才能允許本機以外的裝置連線,本文將說明設置檔的設定方式。

安裝Mosquitto的過程,你可以勾選”Service”(服務)選項,讓它安裝成Windows服務,只要Windows開機,即可一併啟動Mosquitto伺服器(broker)。

安裝Mosquitto

如果你只是要測試、開發MQTT應用程式,可以用手動方式啟動MQTT伺服器。Mosquitto預設安裝在C:\Program File\mosquitto路徑,其中的.exe可執行檔僅能在命令行模式運作,也就是在命令提示字元PowerShell裡面執行。

Mosquitto資料夾

這些是mosquitto資料夾裡的部份檔案:

  • mosquito:執行Mosquitto伺服器
  • mosquitto_pub:發布(publish)訊息給伺服器
  • mosquitto_sub:訂閱(subscribe)伺服器上的主題
  • mosquitto_passwd:產生密碼檔案
  • mosquitto.conf:Mosquitto 伺服器的設置檔
  • pwfile.example:使用者名稱和密碼範例檔

命令提示字元手動執行Mosquitto伺服器的命令如下,參數v代表verbose(顯示詳細訊息)。

手動執行Mosquitto伺服器

從訊息可知,Mosquitto預設只允許本機的用戶端連線。如果啟動Mosquitto發生如下的錯誤:

Mosquitto預設只允許本機的用戶端連線

代表已經有MQTT伺服器運作在1883埠;若停止Mosquitto服務(參閱MQTT教學(二)),即可順利執行上面的指令。

停止Mosquitto服務

修改mosquitto.conf設置檔

允許外部裝置連入本機Mosquitto伺服器的辦法是修改mosquitto.conf設置檔,在裡面加入幾個參數,你可以直接修改C:\Program File\mosquitto路徑裡的mosquitto.conf設置檔,筆者是將它命名成mosquitto.conf.bak備份,然後新增一個mosquitto.conf。

mosquitto.conf設置檔

mosquitto.conf是個純文字檔,可以用記事本或程式編輯器建立,以記事本為例,在其中輸入這兩行:

allow_anonymous true
listener 1883 192.168.0.117
mosquitto.conf設置檔

然後命名成mosquitto.conf(存檔時,檔名前後請用雙引號包圍,以免副檔名變成.txt),存入C:\Program File\mosquitto路徑。其中的listener代表偵測指定位址通訊埠(如:192.168.0.117:1883)動靜的物件,請把IP位址改成你的電腦IP位址。

回到命令提示字元,啟動Mosquitto伺服器時透過c參數(代表config., 設置)指定設置檔,即可允許遠端連入本機的Mosquitto broker:

mosquitto -c mosquitto.conf -v
啟動Mosquitto伺服器

若採用服務方式執行Mosquitto,只需要重新啟動Mosquitto broker服務,它會自動載入“C:\Program Files\mosquitto”路徑裡的mosquitto.conf設置檔。

你可以用MQTTlens測試連線(參閱:MQTT教學(四):使用MQTTlens訂閱與發布MQTT訊息)。關閉命令提示字元或在命令提示字元中按Ctrl+C鍵,即可停止Mosquitto伺服器。

新增Mosquitto的使用者帳號和密碼

假如要禁止匿名連線,首先要建立Mosquitto的使用者帳號和密碼。

使用者的帳號密碼以純文字格式儲存,檔名和副檔名隨意。用文字編輯器開啟pwfile.example範例,將能看到帳密的設置格式:每個帳號寫成一行,帳號和密碼用冒號隔開,密碼預設用sha512-pbkdf2編碼。

使用者帳號和密碼

自行產生使用者帳號、密碼的命令行工具是mosquitto_passwd,請先用系統管理員身份執行命令提示字元(因為Windows系統可能不允許非系統管理員寫入檔案到C:\Program Files\mosquitto路徑):

用系統管理員身份執行命令提示字元(

儲存帳密的檔案可任意取名,筆者將它命名成“froggy.pwd”。在其中儲存帳號“cubie”、密碼1234的指令如下:

mosquitto_passwd -c "froggy.pwd" cubie

參數c代表新建(create)一個帳密檔案,如果指定檔案已經存在,將會被新檔覆蓋。指令執行之後,froggy.pwd檔將寫入“C:\Program Files\mosquitto”路徑。

新建(create)一個帳密檔案

透過參數b(代表batch,批次)即可在帳密檔案中新增帳號密碼,底下的命令將在froggy.pwd檔新增一個帳號jeff,密碼abcd:

mosquitto_passwd -b "froggy.pwd" jeff  abcd

但不建議使用這個命令新增帳號,因為多數終端機都會把輸入的命令紀錄在「歷程(history)」檔,你輸入的帳號密碼可能因此而曝光。如果要建立多組帳號密碼,建議先寫在一個文字檔,然後透過U參數(U大寫,代表upgrade)執行編碼、轉換密碼檔。筆者先在「記事本」中輸入底下的帳號密碼:

記事本」中輸入帳號密碼:

再將它命名成“froggy.pwd”,存入D磁碟根目錄。接著在命令提示字元執行底下的命令:

mosquitto_passwd -U d:\froggy.pwd

執行之後,froggy.pwd檔的密碼部份就變成sha512-pbkdf2編碼文字。

帳密編碼

最後把這個檔案複製到“C:\Program Files\mosquitto”路徑備用。

密碼檔

在mosquitto.conf中加入使用者帳密檔的路徑

修改mosquitto.conf設置檔,取消允許匿名登入、加入“password_file”(密碼檔)的設定:

allow_anonymous false
listener 1883 192.168.0.117
password_file C:\Program  Files\mosquitto\froggy.pwd
修改mosquitto.conf設置檔

再次於命令提示字元中執行“mosquitto – c mosquito.conf -v”命令,啟動Mosquitto伺服器。

使用MQTTlens連線Mosquitto伺服器

在MQTTlens中新增連線設定時,請在Hostname(主機名稱)欄位輸入執行Mosquitto伺服器的電腦的IP位址,最底下的Username(使用者名稱)Password(密碼)請輸入之前的設定。

MQTTlens

按下右下角的SAVE CHANGES(儲存變更)鈕,MQTTlens將成功連上指定IP的Mosquitto伺服器:

MQTTlens

最後補充,除了在mosquitto.conf設置檔透過listener參數指定IP和埠號,也可以透過將“per_listener_setting”參數設成true,代表個別設置每個偵聽器物件的安全性:

allow_anonymous false
per_listener_setting true
password_file C:\Program  Files\mosquitto\froggy.pwd

這樣也能允許使用者從遠端連上此Mosquitto伺服器。

Posts created 483

5 thoughts on “MQTT教學(十):設定Mosquitto 2.x版的mosquitto.conf設置檔

  1. 老師好,

    allow_anonymous true
    listener 1883
    #password_file C:\Program Files\mosquitto\usrlist.txt

    我使用手機的EasyMQTT測試,如果ip和mosquitto相同為192.168.1.10可以連線,
    但是如果我使用手機網路的ip 172.20.10.5則沒辦法連線,請問為什麼呢?
    求解 謝謝老師

  2. 試了老半天,用手動輸入指令可以從外面連線,
    但從服務去啟動就不行。
    我暫時的解決辦法是寫一個BAT檔讓它開機自己啟動,
    前兩年挖礦學到的知識居然可應用到這裡
    BAT檔內容
    cd C:\Program Files\mosquitto
    mosquitto -c mosquitto.conf -v

  3. 老師您好
    我是用的環境是azure的windows虛擬機
    修改完
    allow_anonymous true
    listener 1883
    cmd顯示:1712140174: Error: The requested address is not valid in its context.
    且services的mosquitto無法啟動:
    The Mosquitto Broker service on Local Computer started and then stopped. Some services stop automatically if they are not in use by other services or programs.

    請問是哪裡出問題可以的話麻煩老師解答

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top