開放原始碼的MQTT伺服器(broker)Mosquitto 2.x版,需要經過設置才能允許本機以外的裝置連線,本文將說明設置檔的設定方式。
安裝Mosquitto的過程,你可以勾選”Service”(服務)選項,讓它安裝成Windows服務,只要Windows開機,即可一併啟動Mosquitto伺服器(broker)。
如果你只是要測試、開發MQTT應用程式,可以用手動方式啟動MQTT伺服器。Mosquitto預設安裝在C:\Program File\mosquitto路徑,其中的.exe可執行檔僅能在命令行模式運作,也就是在命令提示字元或PowerShell裡面執行。
這些是mosquitto資料夾裡的部份檔案:
- mosquito:執行Mosquitto伺服器
- mosquitto_pub:發布(publish)訊息給伺服器
- mosquitto_sub:訂閱(subscribe)伺服器上的主題
- mosquitto_passwd:產生密碼檔案
- mosquitto.conf:Mosquitto 伺服器的設置檔
- pwfile.example:使用者名稱和密碼範例檔
在命令提示字元手動執行Mosquitto伺服器的命令如下,參數v代表verbose(顯示詳細訊息)。
從訊息可知,Mosquitto預設只允許本機的用戶端連線。如果啟動Mosquitto發生如下的錯誤:
代表已經有MQTT伺服器運作在1883埠;若停止Mosquitto服務(參閱MQTT教學(二)),即可順利執行上面的指令。
修改mosquitto.conf設置檔
允許外部裝置連入本機Mosquitto伺服器的辦法是修改mosquitto.conf設置檔,在裡面加入幾個參數,你可以直接修改C:\Program File\mosquitto路徑裡的mosquitto.conf設置檔,筆者是將它命名成mosquitto.conf.bak備份,然後新增一個mosquitto.conf。
mosquitto.conf是個純文字檔,可以用記事本或程式編輯器建立,以記事本為例,在其中輸入這兩行:
allow_anonymous true listener 1883 192.168.0.117
然後命名成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 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”路徑。
透過參數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 – c mosquito.conf -v”命令,啟動Mosquitto伺服器。
使用MQTTlens連線Mosquitto伺服器
在MQTTlens中新增連線設定時,請在Hostname(主機名稱)欄位輸入執行Mosquitto伺服器的電腦的IP位址,最底下的Username(使用者名稱)和Password(密碼)請輸入之前的設定。
按下右下角的SAVE CHANGES(儲存變更)鈕,MQTTlens將成功連上指定IP的Mosquitto伺服器:
最後補充,除了在mosquitto.conf設置檔透過listener參數指定IP和埠號,也可以透過將“per_listener_setting”參數設成true,代表個別設置每個偵聽器物件的安全性:
allow_anonymous false per_listener_setting true password_file C:\Program Files\mosquitto\froggy.pwd
這樣也能允許使用者從遠端連上此Mosquitto伺服器。
老師好,
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則沒辦法連線,請問為什麼呢?
求解 謝謝老師
請參閱這個貼文和這個貼文的留言回應。
thanks,
jeffrey
試了老半天,用手動輸入指令可以從外面連線,
但從服務去啟動就不行。
我暫時的解決辦法是寫一個BAT檔讓它開機自己啟動,
前兩年挖礦學到的知識居然可應用到這裡
BAT檔內容
cd C:\Program Files\mosquitto
mosquitto -c mosquitto.conf -v
感謝分享!
老師您好
我是用的環境是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.
請問是哪裡出問題可以的話麻煩老師解答