我使用的是mosquitto MQTT代理。另外,我有多个客户端(目前是10个,但数量还会增加),它们定期向topic A
发布一些传感器数据。这些客户端在技术上是相同的,但具有唯一的标识符(序列号)。
我还有一个客户端,它订阅topic A
,以便接收发布的消息并将传感器值持久化到数据库中。我当然需要知道哪个传感器(即客户端)发送了一个特定值。
作为一种解决方案,只需将一些传感器ID附加到每个已发布消息的有效负载。但是由于传感器通过GSM访问代理,所以我需要保持低流量,所以我正在努力避免这种情况。
我假设,代理本身知道哪个消息来自哪个客户端,特别是在使用持久连接时,即clean_session=False
。对吗?如果是,订阅客户端是否有可能在收到消息时获得client_id
?它可以在蚊子中配置吗?或者这是默认行为,我遗漏了什么?
我对所有客户端都使用paho-mqtt 1.3.1。
发布于 2018-08-22 17:42:55
否,客户端id不是已发布消息的一部分。它仅用于在建立连接时向代理标识客户端,以便确定是否应遵守存储的消息和持久订阅。
最简单的解决方案是为每个传感器使用单独的主题,但具有共享的根目录。例如:
发布到A/2
的A/1
然后,客户端将订阅A/+
,这将接收所有消息,并可以使用主题的后半部分来确定它来自哪个传感器。
其他选项如您所建议的,将id包含在有效负载中。
发布于 2018-09-12 19:40:44
发送带有有效载荷(消息)的客户端id是可能的。但您需要在发布者端的有效负载(消息)中使用分隔符。示例: Publisher将有效负载发送为"client-ID=3 - temperature = 29“。在订户端,使用strtok()删除分隔符。broker端没有可用的配置。
发布于 2018-09-13 07:05:02
根据我使用message.
但是,由于允许服务器覆盖主题名称,因此它可能与原始发布数据包中的主题名称不同。
https://stackoverflow.com/questions/51963413
复制相似问题