【问题标题】:Paho-mqtt subscribe one-time messagepaho-mqtt 订阅一次性消息
【发布时间】:2020-05-01 17:57:02
【问题描述】:

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

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

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

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

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

提前感谢您的任何建议。

【问题讨论】:

    标签: python json mqtt subscribe


    【解决方案1】:

    Paho Python 客户端带有一组帮助类,可以为您执行这种单次模式。

    文档here

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

    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 功能。
    【解决方案2】:

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

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

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

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

    ID 代表什么?独一无二的号码?时间戳之类的东西?哈希?发件人?

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

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

    【讨论】:

    • 我的错误......我没有正确解释它。我有 TCP 连接,它接收有关 unique_id 模块的数据。这些模块有一堆不同的参数,我们通过专有字符串获得。我们解析这些字符串......并在代理上为它们更新新信息。更糟糕的是这些模块不断被创建和销毁。因此,我们没有有限数量的这些模块(每个模块都有自己的主题)。因此应用程序的内存使用量可能会增长得非常快。
    • 伪代码:tcp_socket_messge(msg): id, new_params = parse_socket_msg(msg) write_to_broker(id, new_params) write_to_broker(id, new): topic = "module/" out = json。 dump(new) client.publish(topic, out, retain=True) 说(假设)模块 ID#: 001,有 35 个参数,其中一个是“温度”......然后当我得到温度数据时,我将结束仅更新该 ID 的一个参数时,将覆盖 24 个参数的整个数据集。请注意,每个模块的参数数量(和名称)是动态的...
    • 对不起...我不知道如何向 cmets 添加代码
    • 为问题添加了一些建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多