GUIZERO结合MQTT传感器读数刷新文本功能无法正常更新问题求助
问题修正说明
核心错误点
- MQTT的
on_connect回调参数不符合paho-mqtt的规范,且未绑定到client实例,导致连接成功后无法自动订阅主题:- paho-mqtt要求
on_connect回调必须接收client, userdata, flags, rc四个参数,原代码缺少flags和rc参数,函数内引用的rc变量未定义 - 代码未执行
client.on_connect = on_connect绑定操作,连接成功后不会触发订阅逻辑
- paho-mqtt要求
- MQTT后台循环被提前终止:
client.loop_stop()被放在了app.display()之前,而app.display()是GUI的阻塞式主循环,程序运行到UI创建完成后就直接停止了MQTT消息处理循环,自然无法接收任何消息 - 传感器读数赋值逻辑存在多余前缀:
on_message中给sensorReading赋值时直接用str(message.payload),会保留字节串的b''前缀,显示不符合预期
修正后的完整代码
from guizero import App, Text import paho.mqtt.client as mqtt sensorReading = '' def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) # 连接成功后订阅主题,重连时会自动重新订阅 client.subscribe("room/temperature") def on_message(client, userdata, message): global sensorReading # 直接用解码后的内容赋值,避免b''前缀 sensorReading = str(message.payload.decode("utf-8")) print("message received " , sensorReading) print("message topic=",message.topic) print("message qos=",message.qos) print("message retain flag=",message.retain) def updateReading(): # 测试用发布逻辑,不需要可以删除 # client.publish('room/temperature','84') reading.value = sensorReading reading.after(1000,updateReading) brokerAddress = 'redacted' client = mqtt.Client('GG1') # 绑定on_connect回调 client.on_connect = on_connect client.on_message = on_message print("connecting to broker") try: client.connect(brokerAddress, port=1883) print('Connection Successful!') except: print('Connection Failed') exit(1) app = App(title='Admin Page Test', layout='auto', height=480,width=640) app.bg = 'white' # 启动MQTT后台循环,只要程序不退出就一直运行 client.loop_start() welcomeText = Text(app, text='Welcome!', size=40, font='Times New Roman', color='darkgreen', align='top') clientReading = Text(app,text='Latest Reading is: ') reading=Text(app,text='****') reading.after(1000, updateReading) app.display() # GUI关闭后再停止MQTT循环 client.loop_stop()
内容的提问来源于stack exchange,提问作者Secretasianman7
相关产品推荐
相关产品推荐

