【问题标题】:How to get wildcard value from mqtt topic?如何从 mqtt 主题中获取通配符值?
【发布时间】:2020-05-09 23:26:09
【问题描述】:

假设我有几个设备,每个设备都有温度。所有与设备温度相关的消息都发布在主题device/1/temeraturedevice/2/temperature等上。我使用 Python paho-mqtt 处理在此主题上发布的所有消息,并带有一个回调函数,该函数使用通配符表达式 client.message_on_callback_add("device/+/temperature", ...)。有没有办法直接获取通配符表达式的值,这里是+(不需要解析msg.topic)?

【问题讨论】:

    标签: python python-3.x mqtt paho


    【解决方案1】:

    不,回调包含消息发布到的主题。

    您可以从主题中提取您需要的任何信息。

    【讨论】:

      【解决方案2】:

      我相信您希望从主题中提取客户 ID。回调函数将 clientid 作为回调的一部分。请检查以下网址中的功能。

      https://pypi.org/project/paho-mqtt/#callbacks

      如果您在收到的消息上使用默认回调函数,您将能够获取客户端作为单独的参数。

      【讨论】:

      • 不,不会的。发布者的客户端 ID 不包含在消息中。附加的客户端对象是本地 paho 客户端对象。除非在主题或消息正文中编码,否则无法找到发布者客户端 ID。
      • 感谢指正。我认为要求是已订阅的当前客户。然而。替代方案是在提供 on_message 选项的 Broker 后面编写应用程序。您将在哪里获得发布者的元信息。
      【解决方案3】:

      在此示例中,您可以在消息到达时获取订阅的主题。您可以拆分主题以从订阅的主题中获取通配符。

      import paho.mqtt.client as mqtt
      
      def on_connect(client, userdata, flags, rc):
          client.subscribe("device/+/temperature")
          client.message_callback_add("device/+/temperature", handler("device/+/temperature"))
          
      def handler(subscribed_topic):
          wildcard_expression = subscribed_topic
          def on_message(client, userdata, msg):
              print(msg.topic+" "+str(msg.payload), wildcard_expression)
          return on_message
          
      client = mqtt.Client()
      client.on_connect = on_connect
      client.connect(<mqtt broker url>, 1883, 60)
      client.loop_forever()
      

      【讨论】:

      • 只发布代码而没有说明它是如何工作的或它如何实际解决 OP 的问题实际上是没有用的。这也无助于 OP 获得由 + 表示的值,这是所要求的。
      • 谢谢。我已经添加了描述。
      • 但它仍然没有解决OP询问的问题。
      • 我认为它解决了。 “有没有办法获取通配符表达式的值”。 msg 对象不包含订阅的主题。仅包含已发布的主题(设备/1/温度、设备/2/温度等)。但是将订阅的主题作为参数传递给处理函数使我们能够在消息到达时访问它。
      • 他们明确要求 + 匹配的值,而不是 + 它自己。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      相关资源
      最近更新 更多