我正在使用mosquitto MQTT Broker。此外,我有多个(目前有10个,但数量会增加)客户端定期发布一些传感器数据到主题A
。这些客户端在技术上相同,但具有唯一标识符(序列号)。
我还有一个订阅主题A
的客户端,以便接收已发布的消息并将传感器值保存在数据库中。我当然需要知道哪个传感器(即客户端)发送了特定值。
作为解决方案,可以将一些传感器ID附加到每个已发布消息的有效负载中。但由于传感器通过GSM访问代理,我需要保持低流量,所以我试图避免这种情况。
我假设,Broker本身知道哪个消息来自哪个客户端,特别是在使用perisistent连接时,即clean_session=False
。那是对的吗?如果是,订阅客户端在收到消息时是否有机会获得client_id
?可以在mosquitto中配置吗?或者它是默认行为,我错过了什么?
我正在为所有客户使用paho-mqtt 1.3.1。
不,客户端ID不是已发布消息的一部分。它仅用于在建立连接时向代理标识客户端,以确定是否应该遵守存储的消息和持久订阅。
最简单的解决方案是为每个传感器使用单独的主题,但使用共享根。例如
A/1
A/2
然后,客户端将订阅A/+
,然后接收所有消息,并可以使用主题的后半部分来确定它来自哪个传感器。
其他选项如您所建议的那样是在有效负载中包含id。
可以使用有效负载(消息)发送client-id。但是你需要在发布者端使用有效负载(消息)中的分隔符。示例:Publisher将有效负载发送为“client-ID = 3 - temperature = 29”。在订阅方,您使用strtok()删除分隔符。经纪人方面没有配置。
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.