如何制作paho-mqtt循环超时?

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

使用Python Paho-MQTT,我试图从一个主题中获得1个消息,然后退出。如果在5秒内未收到消息,那么我想超时并退出。我遇到的问题是,即使发消息会更早收到,该代码也总是等待5秒。如果我删除了

sleep()
线,则根本不会收到任何消息。

import paho.mqtt.client as mqtt import logging import time def on_message(client, userdata, message): logging.info(f"Received message: {message.payload}") client.loop_stop() logging.basicConfig(level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s") mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) mqttc.enable_logger() mqttc.on_message = on_message mqttc.connect("mqtt.eclipseprojects.io") mqttc.subscribe("#") mqttc.loop_start() time.sleep(5) logging.info('Complete!')
输出:

2025-01-28 01:39:33,511 [DEBUG] Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k60) client_id=b'' 2025-01-28 01:39:33,511 [DEBUG] Sending SUBSCRIBE (d0, m1) [(b'#', 0)] 2025-01-28 01:39:33,632 [DEBUG] Received CONNACK (0, 0) 2025-01-28 01:39:33,634 [DEBUG] Received SUBACK 2025-01-28 01:39:33,634 [DEBUG] Received PUBLISH (d0, q0, r1, m0), 'AhoyDTU0600-Streusser/version', ... (6 bytes) 2025-01-28 01:39:33,634 [INFO] Received message: b'0.8.83' 2025-01-28 01:39:38,517 [INFO] Complete!
    
python mqtt paho
1个回答
0
投票
在您的代码中,即使您在新线程中与

loop_start()

关闭连接
loop_stop()
,您的主线程仍将执行
time.sleep(5)
.

可能的解决方案是添加一个线程事件,该事件将在收到消息

并在5秒后等待事件或超时之后设置。 import paho.mqtt.client as mqtt import logging import threading # Create an event to signal when a message is received message_received_event = threading.Event() def on_message(client, userdata, message): logging.info(f"Received message: {message.payload}") # Signal that a message has been received message_received_event.set() client.loop_stop() logging.basicConfig(level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s") mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) mqttc.enable_logger() mqttc.on_message = on_message mqttc.connect("mqtt.eclipseprojects.io") mqttc.subscribe("#") mqttc.loop_start() # Wait for a message or timeout after 5 seconds message_received_event.wait(timeout=5) logging.info('Complete!')


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.