Paho-mqtt订阅一次性信息

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

有没有一种优雅的方法,可以把一个消息从经纪人身上拉下来,而不用。

  1. 订阅
  2. 创建一个on_message()
  3. 收信
  4. 取消订阅

我之所以这样问是因为我们使用的是一个有多个字段的json消息,当有新数据进来时,我想只更新json消息中的那个字段,而不删除其他数据。 当有新的数据进来时,我想只更新json消息中的那个特定字段,而不删除其余的数据。 因为我们有很多这样的json主题,我们并不想把所有的json主题都保存在程序内存中(也是为了防止程序被重新启动)。 最重要的是,这个程序可能会在没有人监督的情况下运行几个月。

所以,理想情况下,我想把json消息发布到一个ID的主题中,并把保留标志设置为True。 然后,当该ID有新的数据时,我就会拉出该主题的信息,更新json消息中的特定字段,然后重新发布到同一个主题。

我可以发布示例代码,但我希望有一个我不知道的简单功能。

先谢谢你的建议。

python json mqtt subscribe
2个回答
0
投票

Paho Python 客户端自带了一组帮助类,可以为你做这种单枪匹马的模式。

文件 此处

如:下面连接一个经纪人,订阅一个话题,在收到该话题的第一条消息后返回。

import paho.mqtt.subscribe as subscribe

msg = subscribe.simple("paho/test/simple", hostname="mqtt.eclipse.org")
print("%s %s" % (msg.topic, msg.payload))

并进行匹配的发布调用。

import paho.mqtt.publish as publish

publish.single("paho/test/single", "payload", hostname="mqtt.eclipse.org")

0
投票

我认为这是不可能的. 你说 "当新数据进来时..." 这正是你需要订阅和使用回调函数的原因。这基本上是 "当有东西实际存在时才拉取"。

只是想了解一下它应该如何工作:你是通过MQTT发送那个json消息,对吗?当它发生变化时,你要重新发送?

但你不必把它们全部保留在RAM中。你可以使用保留的消息与固定的主题(不是ID'ed)相结合,并在消息中发送ID。

如果你使用保留的消息与ID'ed主题相结合,那可能会填满内存。

ID代表什么?一个唯一的数字?类似时间戳的东西?一个哈希值?发信人?

我想你可以通过清楚地分离你的东西来解决这个问题,比如说在 datamessage,其中 data 是您在Python中维护的东西 (例如数据库或RAM中的东西),而 message 是你通过MQTT发送接收的东西。

然后你可以添加发送更新 data 取决于MQTT中接收到的内容,你不必发送更新完整的设置。

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