在python paho mqtt中返回数据on_message

问题描述 投票:0回答:2

我正在实现一个paho mqtt客户端。这是我的代码:

import paho.mqtt.client as mqtt


def mess(client, userdata, message):
   print("{'" + str(message.payload) + "', " + str(message.topic) + "}")


def subscribe(c_id, topic, server, port):
   cl = mqtt.Client(c_id)
   cl.connect(server, port)
   cl.subscribe(topic)
   cl.on_message = mess
   cl.loop_forever()

这很好用,但我不想在'乱'中打印数据。我需要将print()中的字符串返回给调用函数。我从另一个程序调用subscribe()。任何帮助,直接或推荐阅读将不胜感激。

python mqtt paho
2个回答
1
投票

根据您所显示的内容,您需要使用global标志来更新函数外部的data变量。

data = ''

def mess(client, userdata, message):
  global data
  data = "{'" + str(message.payload) + "', " + str(message.topic) + "}"

此外,subscribe函数将永远不会返回,因为它调用cl.loop_forever()。如果你想要它返回你应该打电话给cl.loop_start()

data中打印subscribe将无法正常工作,因为在您启动网络循环(打印后的行)之前,客户端无法实际处理传入的消息。

在订阅主题后,无法保证何时会传递消息。

在不知道你想要实现什么的更多信息的情况下,我无法提供更多帮助,但我认为你需要回过头来看看你的整个方法,以了解pub / sub消息的异步性质


-1
投票

不使用提到的全局变量方法,也可以使用Queue包。

import Queue
import paho.mqtt.client as mqtt

q = Queue.Queue() #initialises a first in first out queue

def mess(client, userdata, message):
    q.put(("{'" + str(message.payload) + "', " + str(message.topic) + "}"))

if not q.empty(): #check if the queue is empty
    msg = q.get()  #get the first message which was received and delete

这避免了在使用时丢失任何传入数据或被访问数据的任何损坏。

© www.soinside.com 2019 - 2024. All rights reserved.