【问题标题】:Connection uri of local MQTT broker本地 MQTT 代理的连接 uri
【发布时间】:2017-02-06 20:06:42
【问题描述】:

我目前有两个 MQTT 代理都运行良好。其中之一是我的 本地 网络上的 Raspberry Pi。另一个是托管在CloudMQTT 上的远程 代理。

目标是使两个代理相互同步。当然,最简单的解决方案是使用网桥,但我在设置正确的网桥时遇到了一些麻烦。

如下图所示,当我尝试在CloudMQTT 上设置网桥时,它会要求'Connection uri'。对于远程代理,这将是mqtt://username:password@m20.cloudmqtt.com:1883,但我似乎无法弄清楚如何为本地代理执行此操作。

据我所知,只有当您拥有静态 IP 并且端口转发到 Raspberry Pi 时,您才能连接到本地网络,那么我该如何解决这个问题?两个broker需要保持一个permanent TCP连接打开,但是远程broker自己不能打开。本地代理不能打开这个连接吗?如果是这样,我将如何让两个代理同步?

感谢您的帮助,非常感谢您提前提供的帮助!

编辑:

这是我完整的 /etc/mosquitto/mosquitto.conf 文件:

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 CloudMQTT-Bridge

topic # both 2 local/testing remote/testing

bridge_protocol_version mqttv311

address m20:cloudmqtt.com:17001
remote_username jcw******
remote_password p-fO*****
remote_clientid RaspberryPiBroker

【问题讨论】:

  • 地址开头的地址行中有一个: 而不是.
  • 哦,感谢您指出这一点!我修复了这个错误,但仍然无法发布或子到本地代理..
  • 检查日志以获取输出,这些详细信息对我来说很好(希望我没有获得授权,因为我没有证书)。如果您作为服务运行,您可以停止它并使用 mosquitto -c /path/to/config 手动运行它
  • 哇,感谢这个非常方便的手动运行技巧!通过这种方式,我能够在出错的地方获得一些反馈。原来log_dest不存在,我不得不使用用户名而不是remote_username

标签: networking mqtt mosquitto


【解决方案1】:

您可以使用 mosquitto 创建网桥,man 页面的“配置网桥”部分涵盖了所有选项,但您需要的基本知识是:

connection cloudMQ-Bridge
address m20.cloudmqtt.com
remote_username user
remote_password password
remote_clientid clientid
topic # in 2

棘手的一点是最后的主题行,它控制如何在两个代理之间映射主题。您必须小心不要创建循环。

在示例中,所有主题都从远程代理映射到 QOS 2 的本地代理,没有任何主题重新映射。请仔细阅读手册中关于主题映射的部分,因为它很容易出错。

【讨论】:

  • 非常感谢您的回答。我试过你的例子,但我遇到了一个奇怪的问题。当我编辑 conf 并重新启动 mosquitto 时,我无法订阅或发布到本地代理。出于某种原因,我总是收到“错误:连接被拒绝”。这是什么原因造成的?
  • 这很可能是远程连接的用户名/密码或地址/端口错误
  • 有道理!我尝试从 Arduino 连接到 CloudMQTT,但没有成功,所以在这里我可能遇到了同样的问题。一件奇怪的事情是,它在从终端发布到 CloudMQTT 时确实有效..
  • 尝试添加bridge_protocol_version,其值为mqttv311
  • 没有帮助,很遗憾。所以你认为因为 Mosquitto 无法连接到 CloudMQTT,我什至不能分到本地代理? MQTT 很难排除故障..