使用Paho的message_callback_add()函数,但没有结果

时间:2014-07-11 17:35:46

标签: python mqtt paho

我尝试使用this library中的message_callback_add()函数按主题捕获消息。下面是我用来处理mqtt订阅和发布需求的整个模块。我已经能够测试发布是否有效,但我似乎无法捕获任何传入的消息。没有任何类型的警告/错误,print("position")语句仅适用于1和2。

import sys
import os
import time
import Things
import paho.mqtt.client as paho

global mqttclient;
global broker;
global port;

broker = "10.64.16.199";
port = 1883;

mypid = os.getpid()
client_uniq = "pubclient_"+str(mypid)
mqttclient = paho.Client(client_uniq, False) #nocleanstart
mqttclient.connect(broker, port, 60)
mqttclient.subscribe("Commands/#")

def Pump_callback(client, userdata, message):
    #print("Received message '" + str(message.payload) + "' on topic '"
    #    + message.topic + "' with QoS " + str(message.qos))
    print("position 3")
    Things.set_waterPumpSpeed(int(message.payload))

def Valve_callback(client, userdata, message):
    #print("Received message '" + str(message.payload) + "' on topic '"
    #    + message.topic + "' with QoS " + str(message.qos))
    print("position 4")
    Things.set_valvePosition(int(message.payload))

mqttclient.message_callback_add("Commands/PumpSpeed", Pump_callback)
mqttclient.message_callback_add("Commands/ValvePosition", Valve_callback)

print("position 1")
mqttclient.loop_start()
print("position 2")


def pub(topic, value):
  mqttclient.publish(topic, value, 0, True)

2 个答案:

答案 0 :(得分:1)

我在错误的地方打电话给loop_start

我在connect语句之后将调用移到了右边,现在它可以工作了。

以下是摘录:

client_uniq = "pubclient_"+str(mypid)
mqttclient = paho.Client(client_uniq, False) #nocleanstart
mqttclient.connect(broker, port, 60)

mqttclient.loop_start()
mqttclient.subscribe("FM_WaterPump/Commands/#")

在loop_start的文档中,它提到在连接之前或之后调用loop_start(),但它应该在澄清之前或之后立即说明。

文档摘录:

  

这些函数实现了网络循环的线程接口。在connect *()之前或之后调用loop_start()一次,在后台运行一个线程以自动调用loop()。这释放了可能阻塞的其他工作的主线程。此调用还处理重新连接到代理。调用loop_stop()来停止后台线程。

答案 1 :(得分:0)

loop_start()会立即返回,因此您的程序会在有机会做任何事情之前退出。

你还在subscribe()之前调用message_callback_add()这是没有意义的,尽管在这个具体的例子中它可能并不重要。