如何在Python的paho.mqtt中打印单条数据而非持续循环输出
解决MQTT订阅脚本仅接收一条消息后终止的问题
原脚本使用client.loop_forever()会持续运行并输出所有收到的消息,换成client.loop_start()后主线程直接退出,导致未收到消息就终止。以下是两种可行的修改方案:
方案1:基于loop_forever()的简化实现
在消息回调中处理完数据后直接断开连接,loop_forever()会在客户端断开后自动终止运行:
import random import json from paho.mqtt import client as mqtt_client broker = '192.168.62.24' port = 1883 topic = "tvekrani" client_id = f'python-mqtt-{random.randint(0, 100)}' username = 'admin' password = 'admin' def connect_mqtt() -> mqtt_client: def on_connect(client, userdata, flags, rc): if rc != 0: print(f"连接失败,返回码: {rc}") client = mqtt_client.Client(client_id) # client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client def subscribe(client: mqtt_client): def on_message(client, userdata, msg): data = msg.payload.decode() veri = json.loads(data) print(veri["speakers"]) # 处理完单条消息后断开MQTT连接 client.disconnect() client.subscribe(topic) client.on_message = on_message def run(): client = connect_mqtt() subscribe(client) # loop_forever会在client.disconnect()后自动终止循环 client.loop_forever() if __name__ == '__main__': run()
方案2:基于loop_start()的后台线程实现
启动后台线程处理MQTT事件,主线程等待客户端断开后再终止:
import random import json import time from paho.mqtt import client as mqtt_client broker = '192.168.62.24' port = 1883 topic = "tvekrani" client_id = f'python-mqtt-{random.randint(0, 100)}' username = 'admin' password = 'admin' def connect_mqtt() -> mqtt_client: def on_connect(client, userdata, flags, rc): if rc != 0: print(f"连接失败,返回码: {rc}") client = mqtt_client.Client(client_id) # client.username_pw_set(username, password) client.on_connect = on_connect client.connect(broker, port) return client def subscribe(client: mqtt_client): def on_message(client, userdata, msg): data = msg.payload.decode() veri = json.loads(data) print(veri["speakers"]) # 处理完单条消息后断开MQTT连接 client.disconnect() client.subscribe(topic) client.on_message = on_message def run(): client = connect_mqtt() subscribe(client) # 启动后台线程处理MQTT网络事件 client.loop_start() # 主线程等待,直到客户端断开连接 while client.is_connected(): time.sleep(0.1) # 停止后台循环线程 client.loop_stop() if __name__ == '__main__': run()
两种方案核心逻辑一致:在收到第一条消息并处理完成后,主动断开MQTT连接,触发脚本终止运行。
内容的提问来源于stack exchange,提问作者ismailk
相关产品推荐
相关产品推荐

