有没有一种优雅的方法可以在不需要以下操作的情况下从代理中提取一条消息:
- 订阅
- 创建一个消息((
- 接收消息
- 取消订阅
我之所以这么问,是因为我们使用的是一个包含多个字段的json消息。当新数据进入时,我只想更新json消息中的特定字段,但不想删除其余数据。由于我们有很多这样的json主题,我们并不想把它们都保存在程序内存中(以防程序必须重新启动(。除此之外,这个项目可能会在没有监督的情况下运行数月。
因此,理想情况下,我希望将json消息发布到ID为的主题,并将retain标志设置为True。然后,当该ID有新数据时,我会提取该主题的信息,更新json消息中的特定字段,并转发到同一主题。
我可以发布示例代码,但我希望有一个我不知道的简单函数。
提前感谢您的任何建议。
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")
我认为这是不可能的。你说"当新数据进来时…"这正是你需要订阅并使用回调函数的原因。这基本上是一种"当有东西在的时候拉动"。
只是为了了解它应该如何工作:您通过MQTT发送json消息,对吧?当它发生变化时,你会重新发送吗?
但您不必将它们全部保存在RAM中。您可以将保留的消息与固定主题(非ID’ed(结合使用,并在消息中发送ID。
如果使用带有ID主题的保留消息,则可能会占用内存。
身份证代表什么?一个唯一的号码?像时间戳之类的东西?杂碎?发件人?
我认为您可以通过清楚地分离您的东西来解决这个问题,例如在data
和message
中,其中data
是您在Python中维护的东西(例如数据库或RAM中的东西(,而message
是您通过MQTT敏锐地发送/接收的东西。
然后,您可以根据MQTT中接收到的内容添加/发送/更新data
,而不必发送/更新整个集合。