Paho-mqtt订阅一次性消息
Paho-mqtt subscribe one-time message
有没有一种优雅的方法可以从代理中提取一条消息而不必:
- 订阅
- 创建一个 on_message()
- 收到消息
- 退订
我问是因为我们正在使用具有多个字段的 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 代表什么?唯一号码?像时间戳一样的东西?哈希?发件人?
我认为你可以通过清楚地分开你的东西来解决这个问题,例如在 data
和 message
中说,其中 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")
有没有一种优雅的方法可以从代理中提取一条消息而不必:
- 订阅
- 创建一个 on_message()
- 收到消息
- 退订
我问是因为我们正在使用具有多个字段的 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 代表什么?唯一号码?像时间戳一样的东西?哈希?发件人?
我认为你可以通过清楚地分开你的东西来解决这个问题,例如在 data
和 message
中说,其中 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")