mosquitto可以转发邮件发件人的ClientID吗?

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

我正在使用mosquitto MQTT Broker。此外,我有多个(目前有10个,但数量会增加)客户端定期发布一些传感器数据到主题A。这些客户端在技术上相同,但具有唯一标识符(序列号)。

我还有一个订阅主题A的客户端,以便接收已发布的消息并将传感器值保存在数据库中。我当然需要知道哪个传感器(即客户端)发送了特定值。

作为解决方案,可以将一些传感器ID附加到每个已发布消息的有效负载中。但由于传感器通过GSM访问代理,我需要保持低流量,所以我试图避免这种情况。

我假设,Broker本身知道哪个消息来自哪个客户端,特别是在使用perisistent连接时,即clean_session=False。那是对的吗?如果是,订阅客户端在收到消息时是否有机会获得client_id?可以在mosquitto中配置吗?或者它是默认行为,我错过了什么?

我正在为所有客户使用paho-mqtt 1.3.1

mqtt mosquitto paho
3个回答
1
投票

不,客户端ID不是已发布消息的一部分。它仅用于在建立连接时向代理标识客户端,以确定是否应该遵守存储的消息和持久订阅。

最简单的解决方案是为每个传感器使用单独的主题,但使用共享根。例如

  • 传感器1发布到A/1
  • 传感器2发布到A/2

然后,客户端将订阅A/+,然后接收所有消息,并可以使用主题的后半部分来确定它来自哪个传感器。

其他选项如您所建议的那样是在有效负载中包含id。


0
投票

可以使用有效负载(消息)发送client-id。但是你需要在发布者端使用有效负载(消息)中的分隔符。示例:Publisher将有效负载发送为“client-ID = 3 - temperature = 29”。在订阅方,您使用strtok()删除分隔符。经纪人方面没有配置。


0
投票
  1. 根据我对mosquitto的经验,我不认为在重新发布收到的消息时,mosquitto可以选择更改主题或有效负载。
  2. 但是,我认为这只是一个实施问题。从理论上讲,我认为支持这种功能是好的和好的,因为它根本不违反MQTT规范。 (http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/csprd02/mqtt-v3.1.1-csprd02.html#_Toc385349773,第3.3.2.1节) However, since the Server is permitted to override the Topic Name, it might not be the same as the Topic Name in the original PUBLISH Packet.
  3. 正如@hardillb所指出的那样,当前问题的实际解决方案是使用不同的主题发布,但是使用带有通配符(+或#)的主题,或者在有效负载中包含发布者信息。
© www.soinside.com 2019 - 2024. All rights reserved.