Mosquitto: 桥接

如何连接 Mosquitto 服务器(桥接)

👋 欢迎来到 Stackhero 文档!

Stackhero 提供即用型 Mosquitto MQTT 云 解决方案,具有众多优势,包括:

  • 无限制的消息交换和传输。
  • 通过外部 API 进行无限制的设备认证。
  • 针对主题、用户和操作的高级 ACL
  • 使用 HTTPS 保护的可定制域名(例如,https://mqtt.your-company.com)。
  • 只需点击即可轻松更新
  • 专用私有 VM提供的最佳性能和强大安全性

节省时间简化您的生活:只需 5 分钟即可试用 Stackhero 的 Mosquitto MQTT 云托管 解决方案!

连接多个 MQTT 代理可以实现不同位置之间的数据无缝交换。

想象一下,在一个仓库中有一个 Mosquitto 服务器连接了多个设备。您可以使用“桥接”功能将这个远程代理连接到 Stackhero 实例(Mosquitto MQTT)。这种设置允许连接到 Stackhero 实例的设备和仓库中的设备像连接到同一个代理一样进行通信。

对于高级用法,您可以自定义需要共享的主题。您还可以将远程主题添加到类似“warehouse”的子主题中,其中“warehouse/#”将捕获您所有的远程设备。这是通过在 mosquitto.conf 中使用 topic 选项实现的。虽然本指南不涵盖此高级配置,但您可以在 Mosquitto 官方文档中找到更多信息。

在此示例中,远程服务器将使用专用用户通过 TLS 加密连接到 Stackhero 实例,以实现最大安全性。

首先,在 Stackhero MQTT 实例上创建一个新用户。我们称之为 bridge-1,密码为 secretPassword

接下来,在远程 Mosquitto 服务器上,您可以通过在 mosquitto.conf 配置文件(通常位于 /etc/mosquitto/mosquitto.conf)的末尾添加以下行来进行编辑:

# TODO: 将 "<XXXXXX>.stackhero-network.com" 和 "<PORT_TLS>" 替换为您的 Stackhero 实例信息
connection <XXXXXX>.stackhero-network.com
address <XXXXXX>.stackhero-network.com:<PORT_TLS>

# TODO: 将 "bridge-1" 和 "secretPassword" 替换为新创建用户的凭据
remote_clientid bridge-1
remote_username bridge-1
remote_password secretPassword

start_type automatic
try_private true

# 要共享的主题、方向和 QOS。
# 注意,“both” 似乎由于未知原因不起作用。
topic # out 2
topic # in 2

# 启用 TLS 连接以加密远程 Mosquitto 服务器和 Stackhero 实例之间的数据。
bridge_insecure false
bridge_capath /etc/ssl/certs

在使用新配置重启 Mosquitto 之前,请确保远程服务器上存在 TLS 证书。

检查 /etc/ssl/certs 目录是否存在并包含文件,使用命令:

ls /etc/ssl/certs

如果存在并包含文件,您可以简单地重启您的 Mosquitto 服务器。

如果不存在,您可以考虑执行以下命令之一:

  • Ubuntu/Debian 上,您可以运行:

    sudo apt-get install ca-certificates
    
  • Alpine Linux 上,您可以运行:

    apk add ca-certificates
    

或者,您可以手动下载证书。为此,请使用以下命令将 CA 证书下载到 /etc/mosquitto/isrgrootx1.pem

wget https://letsencrypt.org/certs/isrgrootx1.pem -O /etc/mosquitto/isrgrootx1.pem

然后,编辑 mosquitto.conf 文件,将 bridge_capath /etc/ssl/certs 替换为 bridge_cafile /etc/mosquitto/isrgrootx1.pem

最后,重启您的 Mosquitto 服务器。

有关桥接配置的更多信息,您可以参考 Mosquitto 官方文档

Mosquitto 不提供详细的日志来验证您的桥接是否正常工作。

确保其功能的最佳方法是直接测试。

您可以连接到远程服务器,并使用远程服务器上声明的现有用户(和密码)订阅 testBridge 主题:

mosquitto_sub -h 127.0.0.1 -u <user> -P <password> -t "testBridge" -v

在另一个终端中,您可以使用在 Stackhero Mosquitto 实例上声明的现有用户(和密码)连接到您的 Stackhero Mosquitto 实例:

mosquitto_sub -h <XXXXXX>.stackhero-network.com -p <PORT_TLS> -u <user> -P <password> -t "testBridge" -v

打开第三个终端并使用您的 Stackhero 实例(和相应的用户)发送测试消息:

mosquitto_pub -h <XXXXXX>.stackhero-network.com -p <PORT_TLS> -u <user> -P <password> -t "testBridge" -m "Message from Stackhero broker"

您应该在前两个终端上看到“Message from Stackhero broker”。

最后,使用您的远程 Mosquitto 实例发送测试消息:

mosquitto_pub -h 127.0.0.1 -u <user> -P <password> -t "testBridge" -m "Message from remote broker"

恭喜!您现在已经安全地连接了两个 MQTT 服务器,并实现了身份验证和加密!