【问题标题】:Using Paho's message_callback_add() function, but no results使用 Paho 的 message_callback_add() 函数,但没有结果
【发布时间】:2014-07-11 17:35:45
【问题描述】:

我正在尝试使用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)

【问题讨论】:

    标签: python mqtt paho


    【解决方案1】:

    我打错地方了loop_start

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

    这里是sn-p:

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

    【讨论】:

    • 程序在连接实际发生之前就退出了,顺序与它无关(只是阻塞连接调用使程序结束前更容易看到)
    【解决方案2】:

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

    您在message_callback_add() 之前还调用了subscribe(),这没有意义,尽管在这个特定示例中它可能无关紧要。

    【讨论】:

    • 我认为loop_start() 会生成一个线程在后台运行,因此它不会阻塞。
    • 是的...所以它会立即返回,然后您的 def pub(topic, value): 不会做任何事情,这就是程序的结束。所以它退出了。
    猜你喜欢
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多