MQTT 检测多个客户端

问题描述 投票:0回答:1

我正在做一个项目,其中多个 MQTT 传感器设备连接到网络。 MQTT 传感器设备是收集各种传感器数据的 ESP32 设备。

我使用的 MQTT 代理是 Mosquitto,它运行在 Ubuntu 虚拟机上。

每个 MQTT 传感器设备(客户端)都有唯一的标识 ID,允许 MQTT master 相应地解析消息并知道数据来自哪个设备。识别 ID 将告诉传感器设备它需要发布哪些主题。

例如识别ID设置为“sensor1”。在这种情况下,传感器将发布到以“sensor1/value”、“sensor1/config”、“sensor1”/ping”等开头的主题

我的主要问题:

我必须确保不可能同时连接 2 个具有相同标识 ID 的设备。如果发生这种情况,最后连接的传感器设备应该断开连接并取消订阅所有主题(基本上就好像它不存在一样)。

更新

我最近阅读了有关 MQTT client_id 功能的信息。据我所知,这个 client_id 允许识别每个客户端,并允许代理识别连接到网络的每个客户端。

如果连接了两个 MQTT 客户端,并且它们都共享匹配的 client_id,则旧设备将自动断开连接,新设备将接管它的位置。我自己测试过,可以确认它有效。

但是,此功能仅在禁用 auto_reconnect 功能时有效。在我的例子中,启用了 auto_reconnect mqtt 功能,这意味着当传感器断开连接时,它将每隔几秒尝试重新连接一次。例如,有人不小心拔掉了以太网电缆,导致设备断开连接。重新插入以太网电缆后,设备将重新连接并正常运行。

此自动重新连接会导致具有匹配 client_id 的 MQTT 客户端保持连接/断开连接,从而将彼此踢出网络。

c mqtt esp32
1个回答
0
投票

如果发生这种情况,最后连接的传感器设备应该断开连接并取消订阅所有主题(基本上就好像它不存在一样)。

此声明直接反对 MQTT 规范,该规范规定:

如果 ClientId 表示已经连接到服务器的客户端,则服务器必须断开现有客户端。

http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html#_Toc398718032

这里的解决方案是从附加到每个设备的物理序列号中导出客户端 ID,这对于每个传感器在您的环境中是真正全球唯一的。例如。如这个问题/答案中所述ESP32 Arduino-ide如何获得唯一ID

© www.soinside.com 2019 - 2024. All rights reserved.