Mqtt paho 处理程序没有被调用

问题描述 投票:0回答:1

我正在开发一个在 Raspberrypi 上运行的 python 2.7 脚本。这个 Raspberry 是 v4 并且有一个 grovepi hat。按钮和 LCD 显示屏连接到这顶帽子。

所以我一直在使用 paho mqtt 库,但我不明白为什么我的回调(on_message 和 on_intrusion)没有被调用。这是我的代码:

import time
import LCDDisplay
import paho.mqtt.client as paho
import grovepi
import threading

broker_ip = '192.168.1.23'
broker_port = 1883
turn_on_topic = 'GreenHouse/Security/TurnOn'
intrusion_topic = 'GreenHouse/Security/IntrusionDetected'
message_topic = 'GreenHouse/Message'
message_display_duration = 5.0

button_port = 3
last_message = 'Initial display'

def display_last_message():
    print('Timer starting')
    LCDDisplay.setText(last_message)
    LCDDisplay.setRGB(160,240,70)

message_timer = threading.Timer(message_display_duration, display_last_message)

def on_message(client, userdata, msg):
    print('Message received')
    LCDDisplay.setText('Message received')
    LCDDisplay.setRGB(60,190,250)
    if message_timer.is_alive():
        message_timer.cancel()
        message_timer = threading.Timer(message_display_duration, display_last_message)
    message_timer.start()

def on_intrusion(client, userdata, msg):
    LCDDisplay.setText('ALERT - INTRUSION DETECTED')
    LCDDisplay.setRGB(240,65,65)

if __name__=="__main__":
    display_last_message()
    print('Connecting to broker...')
    mqttClient = paho.Client('Button_LCD_Main')
    mqttClient.message_callback_add(message_topic, on_message)
    mqttClient.message_callback_add(intrusion_topic, on_intrusion)
    mqttClient.connect(broker_ip, broker_port, 60)

    print('Starting loop and button check')
    mqttClient.loop_start()
    grovepi.pinMode(button_port,"INPUT")
    time.sleep(2) # Wait for button to initialize
    try:
        while True:
            button_output = grovepi.digitalRead(button_port)
            if button_output == 1:
                print('Button activated')
                mqttClient.publish(turn_on_topic)
                time.sleep(1)
            else:
                time.sleep(0.2)
    finally:
        mqttClient.loop_stop()
        mqttClient.disconnect()

我检查了 Raspberry 可以使用 'sudo mosquitto_sub -h -t 'MyTopic' -q 0 访问我的代理,并且它有效。我还使用单独的脚本测试了 LCD 和按钮,它们工作得很好。此外,LCD 在程序开头显示“初始显示”字符串,我在控制台上得到此输出:

Timer starting
Connecting to broker...
Starting loop and button check

但最奇怪的是“发布”有效(我也检查了它,但在节点中使用带有 mqtt 的节点红色服务器)。 我还仔细检查了主题网址。

我很困惑,你能帮我吗?

python-2.7 mqtt raspberry-pi4 paho
1个回答
0
投票

调用

mqttClient.message_callback_add(topic, handler)
实际上并不订阅该主题,它只是为该主题设置一个特定的处理程序。

您仍然必须致电

mqttClient.subscribe(topic)
才能让经纪人向您发送匹配的消息。

最好的解决方案是添加一个

on_connect
回调来处理订阅

...
def on_connect(client, userdata, flags, rc):
  client.subscribe(intrusion_topic)
  client.subscribe(message_topic)

...
if __name__=="__main__":
    display_last_message()
    print('Connecting to broker...')
    mqttClient = paho.Client('Button_LCD_Main')
    mqttClient.message_callback_add(message_topic, on_message)
    mqttClient.message_callback_add(intrusion_topic, on_intrusion)
    mqttClient.on_connect = on_connect
    mqttClient.connect(broker_ip, broker_port, 60)
...
© www.soinside.com 2019 - 2024. All rights reserved.