Paho-mqtt订阅一次性消息

Paho-mqtt subscribe one-time message

有没有一种优雅的方法可以从代理中提取一条消息而不必:

  1. 订阅
  2. 创建一个 on_message()
  3. 收到消息
  4. 退订

我问是因为我们正在使用具有多个字段的 json 消息。当新数据进来时,我只想更新 json 消息中的特定字段,而不是删除其余数据。由于我们有大量这些 json 主题,我们真的不想将它们全部保存在程序内存中(以防程序必须重新启动)。最重要的是,这个项目可以在没有监督的情况下 运行 几个月。

所以理想情况下,我想 post 将 json 消息发送到保留标志设置为 True 的 ID 主题。然后,当该 ID 收到新数据时,我会提取有关该主题的信息,更新 json 消息中的特定字段,然后重新post 到同一主题。

我可以 post 示例代码,但我希望有一个我不知道的简单函数。

提前感谢您提出任何建议。

我认为这是不可能的。你说 "When new data comes in..." 这正是你需要订阅和使用回调函数的原因。这基本上是一个 "pull when something is actually there".

只是为了了解它应该如何工作:您正在通过 MQTT 发送 json 消息,对吗?当它改变时你重新发送它?

但您不必将它们全部保存在 RAM 中。您可以将保留消息与固定主题(未 ID)结合使用,并在消息中发送 ID。

如果您使用带有 ID 主题的保留消息,那可能会填满内存。

ID 代表什么?唯一号码?像时间戳一样的东西?哈希?发件人?

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

然后您可以根据 MQTT 中收到的内容添加/发送/更新 data,您不必发送/更新完整的集合。

Paho Python 客户端附带了一组帮助 类 可以为您完成这种单一类型的模式。

文档here

例如以下连接到代理,订阅主题并 returns 收到关于该主题的第一条消息。

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")