最近在研究如何利用 MQTT 連接兩個設備。在查詢了很多資料后,我了解到可以利用 Mosquitto 的橋接模式。其中有篇文章《Mosquitto MQTT Bridge-Usage and Configuration》(
http://www.steves-internet-guide.com/mosquitto-bridge-configuration/)給了我很多啟發。下面是我結合這篇文章學習並且時間后的知識整理。
Mosquitto broker 可以被配置為一個 MQTT bridge 橋,連接着兩個 MQTT broker。通常的做法是連接邊緣 MQTT brokers 到一個中心/遠程的 MQTT 網絡。
你只需要配置兩個 broker 中的其中一個作為 bridge,另一個就是正常的 broker。
運行原理
當你配置一個 broker 為 bridge 時,它就成為了一個 MQTT 客戶,可以訂閱/發布消息給另一個broker,並且它自己依賴
mosquitto.conf 配置文件。
配置文件 mosquitto.conf
Mac 和 Windows 上安裝 mosquitto 后的 mosquitto.conf 文件很長,里面有參數的解釋和例子,可以查找”bridges”,找到 Bridges 部分,如下。
# =================================================================# Bridges# =================================================================
然后再往下翻就能找到以下內容,這三行就是我們定義的地方。
#connection <name>#address <host>[:<port>] [<host>[:<port>]]#topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]
關於所有的參數內容,可以查看
官方網站,全英文。
關於上面配置文件中三行內容的具體解釋,特別是關於 topic 那行的設置,建議查看前面提到的文章
《Mosquitto MQTT Bridge-Usage and Configuration》。下面我把我實踐的內容分享給大家。
我用到的設備:
- 樹莓派 Model 3B+
- Macbook Pro
當然可以用別的設備和別的系統,終端中的命令會有差異,本文只記錄我用這兩個設備試驗的過程。
兩個設備連入相同 Wi-Fi。
具體操作步驟:
- 兩個設備各作為一個 broker,都需要安裝 mosquitto
- 樹莓派上安裝 mosquitto:終端執行 sudo apt-get install mosquito mosquitto-clients ,按 Y 確認下載,如下圖。
- Mac 上安裝 mosquitto:終端執行 brew install mosquitto
- 你可能會出現和我一樣的問題,如上圖紅框中提示,我發現我電腦中並沒有 /usr/local/sbin 文件夾,於是我新建了一個,然后再執行sudo chown -R $(whoami):admin /usr/local/sbin ,再brew link mosquitto ,如下圖。
- 修改配置文件 mosquitto.conf。我選擇將樹莓派作為我的 bridge,所以只需要修改樹莓派中的配置文件就好了。
- 打開 /etc/mosquitto.conf,發現內容如下,第一行提示就說將自定義的配置文件放入 /etc/mosquitto/conf.d/ 中。於是我新建一個 mosquitto_1.conf 在 /etc/mosquitto/conf.d/ 中,內容看下面紅色字段。因權限問題,建議使用 sudo nano 的終端指令來做修改。(如果你是用 Mac 或是 Linux 系統建立 bridge,如我前面提到過的一樣,下載 mosquitto 后會有模版格式的 mosquitto.conf ,直接在里面修改就行。)
-
# Place your local configuration in /etc/mosquitto/conf.d/
pid_file /var/run/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
#log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d -
connection testaddress 192.168.2.140:1883topic /house/sensor both 0 b1/ b2/
- 第一行 test 是起的 bridge 連接的名字,可替換。
- 192.168.2.140 是我 MacBook 的IP地址,大家就改成自己 bridge 之外的另一個 broker 的 IP 。1883 是默認端口號。
- topic /house/sensor both 0 b1/ b2/ 限制了訂閱和發布消息時只有為特定的 topic 才能成功收到信息,如果不符合 topic 的設定不會報錯只會收不到信息。可以替換成 topic # both 0 "" "",則對於訂閱和發布消息時的 topic 沒有任何限制(#是通配符)。關於具體如何定義 topic,因為文章篇幅問題就不細述了。建議大家去看最開始提到的文章《Mosquitto MQTT Bridge-Usage and Configuration》。
-
- 打開 /etc/mosquitto.conf,發現內容如下,第一行提示就說將自定義的配置文件放入 /etc/mosquitto/conf.d/ 中。於是我新建一個 mosquitto_1.conf 在 /etc/mosquitto/conf.d/ 中,內容看下面紅色字段。因權限問題,建議使用 sudo nano 的終端指令來做修改。(如果你是用 Mac 或是 Linux 系統建立 bridge,如我前面提到過的一樣,下載 mosquitto 后會有模版格式的 mosquitto.conf ,直接在里面修改就行。)
- 樹莓派啟動 bridge。
- 樹莓派終端中執行 mosquitto -c /etc/mosquitto/conf.d/mosquitto_1.conf ,如下圖,mosquitto_1.conf 是我之前自定義的名字,因為我事先進入了該文件的路徑,我就沒有加絕對路徑在文件名前。
- 圖中最后兩行的連接提示出現在樹莓派 broker 成功訂閱之后,這個在后面會講到。
- 執行前面這個命令的時候可能會出現 Error: Address already in use 錯誤,這時候只要先執行 sudo service mosquitto stop 中止 mosquitto 服務,再執行前面的命令啟動 mosquitto 就行。
- 樹莓派終端中執行 mosquitto -c /etc/mosquitto/conf.d/mosquitto_1.conf ,如下圖,mosquitto_1.conf 是我之前自定義的名字,因為我事先進入了該文件的路徑,我就沒有加絕對路徑在文件名前。
- MacBook 啟動 mosquitto。在 Mac 上下載 mosquitto 時會出現如下提示,不知道為什么我執行 mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf 時會出現找不到 mosquitto 指令的錯誤提示,所以我只有執行 brew services start mosquitto ,執行后終端會提示成功啟動。
-
To have launchd start mosquitto now and restart at login: brew services start mosquittoOr, if you don't want/need a background service you can just run: mosquitto -c /usr/local/etc/mosquitto/mosquitto.conf
- 這個是在后台執行的,如果要中斷,執行 brew services stop mosquitto ,成功后會有提示成功停止。
- 想要重啟則執行 brew services restart mosquitto ,成功后會有兩個提示:成功停止與成功啟動。
-
- 樹莓派訂閱。需要先訂閱,再發布消息,才能及時收到消息。
- 打開樹莓派新的終端窗口,執行mosquitto_sub -t b1/house/sensor -d ,如下圖,同時在前一個終端中會出現上圖所示新連接的提示。
- -d 或 --debug : 顯示調試信息(Enable debug messages),如果沒有,后面幾行的連接信息就不會提示。
- MacBook 發布消息。終端執行 mosquitto_pub -t b2/house/sensor -m "你的消息" ,比如下面我寫的兩個例子,回車之后這個終端沒有提示。
- 如果沒有錯誤的話,在樹莓派第二個終端中就會顯示處內容了,如下圖。中間有很多重復信息是心跳信息,每隔一段時間就會有。