如何使用QThread的回调函数?
回调函数on_message不打印任何数据。在run()中,我连接到mqtt-broker并订阅主题。当我收到新消息时,on_message必须正常工作。
简单的QT应用示例。与简单的QLCD连接的更改值事件。订阅主题来自仪表板
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
from random import uniform, normalvariate, randint
import time
import paho.mqtt.client as mqtt
import paho.mqtt.subscribe as subscribe
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
self.data=DataThread()
vbox = QVBoxLayout()
vbox.addWidget(lcd)
self.setLayout(vbox)
self.data.valueChanged.connect(lcd.display)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Callback')
self.data.start()
self.show()
class DataThread(QThread):
valueChanged = pyqtSignal(object)
val=0
def on_message(mqttc, obj, msg):
mstr=msg.payload.decode("ascii")
val=mstr
self.valueChanged.emit(val)
def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos))
def run(self):
msg = subscribe.simple("shok2", hostname="broker.hivemq.com")
print("%s %s" % (msg.topic, msg.payload))
mqttc = mqtt.Client()
mqttc.on_subscribe = self.on_subscribe
mqttc.on_message = self.on_message
mqttc.connect("broker.hivemq.com")
print("subsrcibe")
mqttc.subscribe("shok2")
mqttc.loop_forever()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
不必使用线程,只需遵循Qt的逻辑:让我们使用信号。在下面的代码中,我展示了我正在实现的MQTT客户端库的高级功能,至少到现在为止已经实现了所需的功能,在接下来的几天中,我将添加更多的功能。
from PyQt5 import QtCore, QtWidgets
import paho.mqtt.client as mqtt
class MqttClient(QtCore.QObject):
Disconnected = 0
Connecting = 1
Connected = 2
MQTT_3_1 = mqtt.MQTTv31
MQTT_3_1_1 = mqtt.MQTTv311
connected = QtCore.pyqtSignal()
disconnected = QtCore.pyqtSignal()
stateChanged = QtCore.pyqtSignal(int)
hostnameChanged = QtCore.pyqtSignal(str)
portChanged = QtCore.pyqtSignal(int)
keepAliveChanged = QtCore.pyqtSignal(int)
cleanSessionChanged = QtCore.pyqtSignal(bool)
protocolVersionChanged = QtCore.pyqtSignal(int)
messageSignal = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super(MqttClient, self).__init__(parent)
self.m_hostname = ""
self.m_port = 1883
self.m_keepAlive = 60
self.m_cleanSession = True
self.m_protocolVersion = MqttClient.MQTT_3_1
self.m_state = MqttClient.Disconnected
self.m_client = mqtt.Client(clean_session=self.m_cleanSession,
protocol=self.protocolVersion)
self.m_client.on_connect = self.on_connect
self.m_client.on_message = self.on_message
self.m_client.on_disconnect = self.on_disconnect
@QtCore.pyqtProperty(int, notify=stateChanged)
def state(self):
return self.m_state
@state.setter
def state(self, state):
if self.m_state == state: return
self.m_state = state
self.stateChanged.emit(state)
@QtCore.pyqtProperty(str, notify=hostnameChanged)
def hostname(self):
return self.m_hostname
@hostname.setter
def hostname(self, hostname):
if self.m_hostname == hostname: return
self.m_hostname = hostname
self.hostnameChanged.emit(hostname)
@QtCore.pyqtProperty(int, notify=portChanged)
def port(self):
return self.m_port
@port.setter
def port(self, port):
if self.m_port == port: return
self.m_port = port
self.portChanged.emit(port)
@QtCore.pyqtProperty(int, notify=keepAliveChanged)
def keepAlive(self):
return self.m_keepAlive
@keepAlive.setter
def keepAlive(self, keepAlive):
if self.m_keepAlive == keepAlive: return
self.m_keepAlive = keepAlive
self.keepAliveChanged.emit(keepAlive)
@QtCore.pyqtProperty(bool, notify=cleanSessionChanged)
def cleanSession(self):
return self.m_cleanSession
@cleanSession.setter
def cleanSession(self, cleanSession):
if self.m_cleanSession == cleanSession: return
self.m_cleanSession = cleanSession
self.cleanSessionChanged.emit(cleanSession)
@QtCore.pyqtProperty(int, notify=protocolVersionChanged)
def protocolVersion(self):
return self.m_protocolVersion
@protocolVersion.setter
def protocolVersion(self, protocolVersion):
if self.m_protocolVersion == protocolVersion: return
if protocolVersion in (MqttClient.MQTT_3_1, MQTT_3_1_1):
self.m_protocolVersion = protocolVersion
self.protocolVersionChanged.emit(protocolVersion)
#################################################################
@QtCore.pyqtSlot()
def connectToHost(self):
if self.m_hostname:
self.m_client.connect(self.m_hostname,
port=self.port,
keepalive=self.keepAlive)
self.state = MqttClient.Connecting
self.m_client.loop_start()
@QtCore.pyqtSlot()
def disconnectFromHost(self):
self.m_client.disconnect()
def subscribe(self, path):
if self.state == MqttClient.Connected:
self.m_client.subscribe(path)
#################################################################
# callbacks
def on_message(self, mqttc, obj, msg):
mstr = msg.payload.decode("ascii")
# print("on_message", mstr, obj, mqttc)
self.messageSignal.emit(mstr)
def on_connect(self, *args):
# print("on_connect", args)
self.state = MqttClient.Connected
self.connected.emit()
def on_disconnect(self, *args):
# print("on_disconnect", args)
self.state = MqttClient.Disconnected
self.disconnected.emit()
class Widget(QtWidgets.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent)
lay = QtWidgets.QVBoxLayout(self)
self.lcd_number = QtWidgets.QLCDNumber()
lay.addWidget(self.lcd_number)
self.client = MqttClient(self)
self.client.stateChanged.connect(self.on_stateChanged)
self.client.messageSignal.connect(self.on_messageSignal)
self.client.hostname = "broker.hivemq.com"
self.client.connectToHost()
@QtCore.pyqtSlot(int)
def on_stateChanged(self, state):
if state == MqttClient.Connected:
print(state)
self.client.subscribe("shok2")
@QtCore.pyqtSlot(str)
def on_messageSignal(self, msg):
try:
val = float(msg)
self.lcd_number.display(val)
except ValueError:
print("error: Not is number")
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
我该怎么修好它?
问题内容: 我正在使用Paho发送和接收mqtt消息。到目前为止,发送消息一直没有问题,我正在使用mosquitto接收消息。 现在,我想使用Java客户端读取消息,并且注意到关于接收消息的文档越来越少。 我实现了MqttCallback接口,但仍然无法弄清楚如何阅读已订阅的主题的消息。 到目前为止,这是我的源代码,我可以使用mosquitto_sub读取消息。 问题答案: 您将在代理有时间将消息
问题内容: 我正在编写django应用程序,该应用程序应充当MQTT发布者和订阅者。 我应该在哪里启动Paho客户端并运行loop_forever()函数。 应该在wsgi.py中吗? 问题答案: 更新: 如果您需要在Django的多个线程运行,那么发布您的Django应用程序的信息,您可以使用辅助功能从发布泛美卫生组织的模块- https://eclipse.org/paho/clients/p
我正在开发一个网站,可以连接到一个mqtt代理,并获得有效负载消息。 我使用的库是(https://eclipse.org/paho/clients/js/)。 我的问题是以下几点。当我试图获得一个标准压缩消息(gzipped)时,库抛出一个异常“错误:AMQJS0009E Malformed UTF Data:F53-52”。 如何处理压缩消息? 下面是我的代码:
问题内容: 因此,我一直在为这个(应该是)简单的练习而绞尽脑汁,以使该程序将日期字符串转换为对象,对其进行格式化,并在完成后将其作为字符串再次返回。 这是程序的最后一点,它从文件中获取一小段文本,将其分解为单独的记录,然后将记录分解为单独的数据并将它们分配给个人对象。 我已经在多个位置检查了该代码,并且该代码完全执行了应该执行的操作,直到调用了format函数(该函数抛出)为止。为对象分配了应该分
问题内容: 我想在目录中获取具有特定扩展名的文件列表。在中,我看到了可以做到这一点的方法。 由于我需要特定的扩展名,因此我创建了一个。但是,当我与此一起使用时,出现编译错误。我以为自以来,我应该能够做到这一点。代码如下: 最后一行显示编译错误: 类型的方法不适用于类型的参数 我正在尝试使用,不是。为何编译器无法识别这一点? 如果我编写自己的扩展筛选器,则此方法有效。我宁愿使用而不愿自己写。我究竟做
问题内容: 我正在尝试在我的watchKit应用中使用firebase数据库。我已经在我的iPhone应用程序上开发了此功能,但是发现在我的Watch应用程序上很难做到这一点。当我尝试将firebase导入watch应用程序的VC类中时,它正在创建error 。 可以在Watch app中使用Firebase吗? 问题答案: 可悲的是,没有支持,并由于这样的事实,有没有支持在这些版本中,并高度依赖
问题内容: 当请求来自Ajax.ActionLink(使用Http方法发布)时,是否可以在控制器操作上使用ValidateAntiForgeryToken属性。替代方法似乎是手动滚动JQuery Ajax请求,但我很好奇MVC Ajax框架中是否有办法。 问题答案: 我还没看过。您必须将令牌放入POST中记录的数据中。每次都使用相同的防伪令牌ID(或名称,我不记得了),但是您必须非常小心,并确保您