我正在实现一个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()
。任何帮助,直接或推荐阅读将不胜感激。
根据您所显示的内容,您需要使用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消息的异步性质
不使用提到的全局变量方法,也可以使用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
这避免了在使用时丢失任何传入数据或被访问数据的任何损坏。