我正在使用mosquitto MQTT 代理。
此外,我有多个(当前有 10 个,但数量会增加)客户端定期向主题 A
发布一些传感器数据。这些客户端在技术上是相同的,但具有唯一的标识符(序列号)。
我还有一个订阅主题 A
的客户端,以便接收已发布的消息并将传感器值保留在数据库中。
我当然需要知道哪个传感器(即客户端)发送了特定值。
作为一种解决方案,人们可以将一些传感器 ID 附加到每条已发布消息的有效负载中。但由于传感器通过 GSM 访问代理,我需要保持低流量,所以我试图避免这种情况。
我假设,代理本身知道哪条消息来自哪个客户端,特别是在使用持久连接时,即clean_session=False
。那是对的吗?
如果是,订阅客户端在接收消息时是否有机会获取client_id
?
可以在mosquitto中配置吗?或者这是默认行为而我遗漏了一些东西?
我正在使用paho-mqtt 1.3.1对于所有客户。
最佳答案
不,客户端 ID 不是已发布消息的一部分。它仅用于在建立连接时向代理标识客户端,以确定是否应遵守存储的消息和持久订阅。
最简单的解决方案是为每个传感器使用单独的主题,但具有共享的根。例如
- 传感器 1 发布到
A/1
- 传感器 2 发布到
A/2
然后,客户端将订阅 A/+
,这将接收所有消息,并可以使用主题的后半部分来确定它来自哪个传感器。
其他选项如您所建议,即将 id 包含在有效负载中。
关于mqtt - mosquitto 可以转发消息发送者的 ClientID 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51963413/