Python Paho mqtt订阅一次性消息

Python Paho mqtt订阅一次性消息,python,json,mqtt,subscribe,Python,Json,Mqtt,Subscribe,是否有一种优雅的方式可以从代理中提取一条消息,而无需: 订阅 创建on_消息() 收到消息 退订 我之所以这样问,是因为我们使用的是一条包含多个字段的json消息。当新数据进来时,我只想更新json消息中的特定字段,而不想删除其余的数据。因为我们有很多这样的json主题,所以我们并不想把它们都保存在程序内存中(同样是在必须重新启动程序的情况下)。最重要的是,这个程序可以在没有监督的情况下运行数月 因此,理想情况下,我希望将json消息发布到ID为的主题,并将retain标志设置为True。然后,

是否有一种优雅的方式可以从代理中提取一条消息,而无需:

  • 订阅
  • 创建on_消息()
  • 收到消息
  • 退订
  • 我之所以这样问,是因为我们使用的是一条包含多个字段的json消息。当新数据进来时,我只想更新json消息中的特定字段,而不想删除其余的数据。因为我们有很多这样的json主题,所以我们并不想把它们都保存在程序内存中(同样是在必须重新启动程序的情况下)。最重要的是,这个程序可以在没有监督的情况下运行数月

    因此,理想情况下,我希望将json消息发布到ID为的主题,并将retain标志设置为True。然后,当该ID的新数据出现时,我会提取该主题的信息,更新json消息中的特定字段,并重新发布到同一主题

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


    提前感谢您的建议。

    我认为这是不可能的。你说“当新数据进来时…”这正是你需要订阅和使用回调函数的原因。这基本上是一种“当某物实际存在时的拉动”

    只是想了解一下它应该如何工作:您正在通过MQTT发送json消息,对吗?当它发生变化时,您是否正在发送它

    但是你不必把它们都放在公羊里。您可以将保留邮件与固定主题(非ID)结合使用,并在邮件中发送ID

    如果使用带有ID主题的保留消息,可能会占用内存

    这个ID代表什么?一个统一号码?时间戳之类的?杂烩?发送者

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


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

    Paho Python客户机附带了一组帮助类,这些帮助类可以为您执行这种单点模式

    医生

    e、 g.以下内容连接到一个代理,订阅一个主题,并在收到该主题的第一条消息时返回

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

    我的错误。。。我解释得不对。我有TCP连接,它接收关于唯一id模块的数据。这些模块有一系列不同的参数,我们通过专有字符串获取这些参数。我们解析那些字符串。。。并在代理上更新他们的新信息。更糟糕的是,这些模块不断被创建和销毁。因此,这些模块的数量不是有限的(每个模块都有自己的主题)。因此,应用程序内存使用量可能会快速增长。伪代码:tcp_socket_messge(msg):id,new_params=parse_socket_msg(msg)write_to_broker(id,new)write_to_broker(id,new):topic=“module/”out=json.dump(new)client.publish(topic,out,retain=True)说(假设)module id#:001,有35个参数,其中一个是“温度”。。。然后,当我得到温度数据时,我将覆盖包含24个参数的整个数据集,只更新该ID的一个参数。注意,每个模块的参数数量(和名称)是动态的…对不起。。。我不知道如何在注释中添加代码。我对这个问题提出了一些建议。这可能正是我想要的。。。我只知道一次发布,但不知道订阅。。。我会测试一下,看看会发生什么。谢谢。我不确定这是否是你需要的。这基本上只是包装在简单函数中的“正常”MQTT功能。