我有一个连接 Mosquitto 经纪人的桥梁,工作正常。但它显示错误:
Connection Refused: not authorised
当我尝试在桥接代理上使用这个简单的 ACL 文件时:
user topic1_user
topic topic1/#
在我的网桥配置中,我在
Bridges
部分下有这些设置:
connection bridge-conn1
address remotebroker:8887
topic topic1/# both
remote_username topic1_user
remote_password secret
我错过了什么吗?
所以我在这个问题上挣扎了一段时间。
我的用例:
我有一个 VerneMQ 代理作为云代理,然后对于每个边缘客户端,每个边缘设备上运行 x 数量的基于 MQTT 的应用程序。
这些应用程序连接到边缘设备上的本地 Mosquitto Bridge Broker,因此通信通过 Bridge 进行身份验证,每个应用程序仅连接到 Bridge,并且所有流量如果转发到 Cloud Broker,边缘设备 ID 为前缀。
现在我也收到了这个可怕的
Connection Refused: not authorised
消息,并且无法理解为什么,因为如果我在 MQTTX 的 MQTTExplorer 上测试用户凭据,它会按预期工作。
但是当浏览我的 VerneMQ 代理的日志时,我可以看到桥试图访问 $SYS 主题以告诉云代理它们的连接。
解决方案是让每个客户端都可以使用其 ClientID 写入此主题:
云代理的 ACL 文件:
user admin
topic #
pattern device/%u/#
pattern $SYS/broker/connection/%c/#
pattern device/%u/#
让每个桥获取本地流量并在device/some_id/#
下发布
pattern $SYS/broker/connection/%c/#
让每个网桥通知并完成其连接并设置任何主题转发
现在,如果 $SYS 主题对于所有代理来说结构都相同,我不知道,但是在我使用 VerneMQ 和 Mosquitto 的情况下,这对我有用。
Mosquitto 日志 在为 Bridge 启用 $SYS 主题之前:
1700743699: Bridge e36b28a2-d5bf-4a25-a048-7aea60b7b596 sending CONNECT
1700743699: Received CONNACK on connection local.e36b28a2-d5bf-4a25-a048-7aea60b7b596.
1700743699: Connection Refused: Not authorized
1700743699: Client local.e36b28a2-d5bf-4a25-a048-7aea60b7b596 closed its connection.
Mosquitto 日志为 Bridge 启用 $SYS 主题后:
1700743841: Bridge e36b28a2-d5bf-4a25-a048-7aea60b7b596 sending CONNECT
1700743841: Received CONNACK on connection local.e36b28a2-d5bf-4a25-a048-7aea60b7b596.
1700743841: Bridge local.e36b28a2-d5bf-4a25-a048-7aea60b7b596 sending SUBSCRIBE (Mid: 2, Topic: device/e36b28a2-d5bf-4a25-a048-7aea60b7b596/#, QoS: 0, Options: 0x0c)
1700743841: Received SUBACK from local.e36b28a2-d5bf-4a25-a048-7aea60b7b596
来自物联网开发者同事,希望这对遇到困难的人有帮助!