#python-3.x #user-interface #logic #mqtt
Вопрос:
Итак, я работаю над проектом пользовательского интерфейса для собственного личного обучения и обогащения. Пользовательский интерфейс должен иметь возможность обновлять свой текст с учетом последних показаний датчиков, публикуемых MQTT. Я написал простой тестовый скрипт, чтобы ознакомиться с инструментами, которые я буду использовать, но прямо сейчас мой текст не обновляется с новыми поступающими показаниями. Чтобы добавить к этому, я даже не уверен, что сообщения принимаются, при публикации сообщения на ту же тему в консоли ничего не отображается.
Вот мой код:
from guizero import App, Text, TextBox, PushButton, Window, Box, Picture, Slider
import paho.mqtt.client as mqtt
sensorReading = ''
#######################################
def on_connect(client, userdata):
print("Connected with result code " str(rc))
# Subscribing in on_connect() means that if we lose the connection and
# reconnect then subscriptions will be renewed.
client.subscribe("room/temperature")
#######################################
#######################################
def on_message(client, userdata, message):
global sensorReading
sensorReading = str(message.payload)
print("message received " ,str(message.payload.decode("utf-8")))
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')
print("connecting to broker")
try:
client.connect(brokerAddress, port=1883)
print('Connection Successful!')
except:
print('Connection Failed')
exit(1)
client.on_message=on_message #attach function to callback
print("Subscribing to topic","room/temperature")
app = App(title='Admin Page Test', layout='auto', height=480,width=640)
app.bg = 'white'
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)
client.loop_stop()
app.display()
Я знаю, что это ошибка в моем понимании логики, лежащей в основе этой системы, я просто не знаю, в какой части я ошибся. Спасибо за ваше время.
Комментарии:
1. Что происходит, когда вы запускаете это (т. Е. Выводится ли «полученное сообщение» на консоль?). Предоставление дополнительной информации облегчит помощь (это помогает узнать, связана ли проблема с MQTT или как-то связана с кодом обновления guizero). Я предполагаю, что проблема связана с
client.loop_stop()
(библиотека mqtt не будет обрабатывать никаких дальнейших сообщений после этого вызова — лучше всего вызвать этоon_disconnect
).2. Отличный вопрос. Извините, я забыл добавить эту часть. При запуске этой программы ничего не выдается. При отправке сообщений ничего не распечатывается. Я даже не уверен, получает ли он его.
3. ХОРОШО — тогда проблема будет в соответствии с моим предыдущим комментарием (
client.loop_stop()
вызывается почти сразу послеclient.loop_start()
и никакие сообщения не обрабатываются, если цикл не запущен). Для тестирования просто удалитеclient.loop_stop()
.4. Спасибо. Я сделал это только сейчас, однако сообщения по-прежнему не проходят. Похоже, что функция on_message никогда не вызывается. ничего не выводится из терминала. Я могу подтвердить, что сообщения отправляются. Я запускаю это на Raspberry pi 4, и при выполнении команды подписки MQTT с mosquitto через терминал принимаются сообщения.
5. Поскольку вы указываете, что вообще ничего не распечатывается, кажется, что
on_connect
это не вызывается. Это будет связано с тем, что вы не устанавливаете обратный вызов (client.on_connect = on_connect
). Этот пример может быть полезен.