4

我正在尝试使用此库中的 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)
4

2 回答 2

3

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() 来停止后台线程。

于 2014-07-11T19:21:32.067 回答
1

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

你之前也调用subscribe()message_callback_add()这没有意义,尽管在这个特定的例子中它可能无关紧要。

于 2014-07-11T19:13:12.357 回答