Java中的“org.eclipse.paho.client.mqttv3-1.2.0”库是否可以一次获取多条MQTT消息?

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

我是Stackoverflow的新手,有一个问题。

我想创建一个带有ESP8266的物联网气象站,它有两个传感器(湿度,温度)并将数据发送到在Pi上运行的代理(Mosquitto)。除了使用nodered获取和可视化数据的简单方法之外,我还想用Java编写桌面应用程序。

我使用“org.eclipse.paho.client.mqttv3-1.2.0”包来创建客户端并获取消息。通过一个主题(例如“/ test / temperature”),可以很容易地接收温度值。但是,如果我为湿度添加第二个客户端,则无法同时接收这两个客户端。当实现两个客户端时,后面的被调用客户端获取其值。

我通过一点时间移动从ESP8266发送值来解决问题。但有没有办法同时获取消息?我想过Threads但它不起作用。

有没有人已经有同样的问题或有想法?

提前致谢,不要犹豫,提出进一步的问题。

干杯。

知更鸟

java mqtt iot esp8266 mosquitto
2个回答
0
投票

首先,您需要重新考虑您的主题结构。不要那么严格。分发房子等主题在万圣节派出糖果。 :)

robin/weather/ESP8266/temperature
robin/weather/ESP8266/humidity

状态机几乎可以是任何东西。即Hashtable,数据库等。如果你想保存历史数据,那么我会选择数据库。即SQLiteDerbyH2等。我使用Taro L. Saito的“sqlite-jdbc”驱动程序。 JDBC驱动程序运行得非常好,并使代码与SQLite代码库保持同步。

基本数据库有2个表:温度和湿度。让客户端订阅这两个主题,并在消息到达时,使用传入值和当前日期和时间更新相应的表。

如果需要,您可以创建第3个表(即“最近”),并且表中只有2行(一个用于当前温度,一个用于当前湿度),这些行经常被替换。


0
投票

不,消息不是从代理获取的,而是由代理推送的。代理将在消息到达时推送消息,它们将始终是一个消息,这就是MQTT的工作方式。

执行此操作的方法是维护一个状态机,该状态机保存每个传感器的最后一个值,并在一个值发生更改时使用这些值来更新输出。

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