Mosquitto MQTT 桥接模式及其配置

最近在研究如何利用 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 test
        address 192.168.2.140:1883
        topic /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》
  • 树莓派启动 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 就行。
  • 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 "你的消息" ,比如下面我写的两个例子,回车之后这个终端没有提示。
    • 如果没有错误的话,在树莓派第二个终端中就会显示处内容了,如下图。中间有很多重复信息是心跳信息,每隔一段时间就会有。
posted @ 2019-06-14 11:21  Zhenqi  阅读(7980)  评论(4编辑  收藏  举报