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

4 投票
2 回答
10335 浏览
提问于 2025-04-18 12:58

我正在尝试通过使用 这个库 中的 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 个回答

1

loop_start() 会立即返回,这样你的程序就会在有机会执行任何操作之前就退出了。

你还在 message_callback_add() 之前调用了 subscribe(),这其实是没有逻辑的,虽然在这个特定的例子中可能影响不大。

3

我在错误的地方调用了 loop_start

我把这个调用移动到了连接语句后面,现在它可以正常工作了。

下面是相关代码片段:

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(),但其实应该明确说是在连接的前面或后面,这样更清楚。

文档中的一段摘录:

这些函数实现了一个与网络循环的线程接口。在连接之前或之后调用一次 loop_start(),会在后台运行一个线程来自动调用 loop()。这样可以让主线程腾出时间去做其他可能会被阻塞的工作。这个调用还负责重新连接到代理服务器。要停止后台线程,可以调用 loop_stop()

撰写回答