如何过滤来自 MQTT 主题的消息?
How to filter messages from MQTT topic?
我的问题是这样的。我想提取发送到我订阅的频道的消息,并相应地向系统添加功能。这是我在代码中想要的算法:
我在 UI 中使用了 Qt5。我可以发布特定主题的消息。我的 MQTT 服务器和客户端 运行 正常。
这是我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import QApplication
import sys
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected successfully")
else:
print("Connect returned result code: " + str(rc))
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print("Received message: " + msg.topic + " -> " + msg.payload.decode("utf-8"))
class mqttbrokerconnection:
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
client.username_pw_set("usrnm", "pwd")
client.connect("server", port)
client.subscribe("deneme")
client.publish("deneme", "selam dünya!")
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("deneme")#pencere ismi
MainWindow.resize(1280, 960)#pencere boyutu
MainWindow.setStyleSheet("background-color: rgb(100, 100, 100);")#renk
self.centralwidget = QtWidgets.QWidget(MainWindow)#bu ne amk
self.centralwidget.setObjectName("centralwidget")#bunu da bilmiom
self.widget = QWebEngineView(self.centralwidget)#Webviev şeysi
self.widget.setGeometry(QtCore.QRect(320, 100, 640, 460))#Webviev boyutu
self.widget.setObjectName("widget")#Webview ismi
self.ileri = QtWidgets.QPushButton(self.centralwidget)
self.ileri.setGeometry(QtCore.QRect(600, 710, 71, 61))
self.ileri.setObjectName("ileri")
self.ileri.setStyleSheet("color: rgb(255, 255, 255);")
self.geri = QtWidgets.QPushButton(self.centralwidget)
self.geri.setGeometry(QtCore.QRect(600, 770, 71, 61))
self.geri.setObjectName("geri")
self.geri.setStyleSheet("color: rgb(255, 255, 255);")
self.sol = QtWidgets.QPushButton(self.centralwidget)
self.sol.setGeometry(QtCore.QRect(529, 770, 71, 61))
self.sol.setObjectName("sol")
self.sol.setStyleSheet("color: rgb(255, 255, 255);")
self.sag = QtWidgets.QPushButton(self.centralwidget)
self.sag.setGeometry(QtCore.QRect(671, 770, 71, 61))
self.sag.setObjectName("sag")
self.sag.setStyleSheet("color: rgb(255, 255, 255);")
MainWindow.setCentralWidget(self.centralwidget)#bunuda bilmiom mk
self.menubar = QtWidgets.QMenuBar(MainWindow)#sanırım menü barı
self.widget.load(QUrl("http://google.com"))#webviev yüklenecek url
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))#menübar konum şeysi
self.menubar.setObjectName("menubar")#menübar isim
MainWindow.setMenuBar(self.menubar)#mainwindows'daki menübarın menübar olduğunu tanımlama
self.statusbar = QtWidgets.QStatusBar(MainWindow)#idfc
self.statusbar.setObjectName("statusbar")#idfc
MainWindow.setStatusBar(self.statusbar)#mainwindowdaki idfcin idfc olduğunu tanımlama
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):#çeviri kısm
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "skrt app"))
self.ileri.setText(_translate("MainWindow", "↑↑"))
self.geri.setText(_translate("MainWindow", "↓↓"))
self.sol.setText(_translate("MainWindow", "←←"))
self.sag.setText(_translate("MainWindow", "→→"))
if __name__ == "__main__":#uygulama çekirdeği
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
client.loop_forever()
如@chrislondon 所述,您可以有子主题:例如your_topic/msg1
和 your_topic/msg2
。然后发布到这些主题。使用 client.message_callback_add("your_topic/msg1", on_message_msg1)
和 client.message_callback_add("your_topic/msg2", on_message_msg2)
订阅它们,并在 msg1
或 msg2
到达订阅者的情况下执行您的自定义逻辑 - 在 on_message_msg1()
和 [=17 中=] 回调。
请看这个例子:
https://github.com/eclipse/paho.mqtt.python/blob/master/examples/client_sub-multiple-callback.py
还有更多使用 Paho MQTT 的例子:
https://github.com/eclipse/paho.mqtt.python/tree/master/examples
我的问题是这样的。我想提取发送到我订阅的频道的消息,并相应地向系统添加功能。这是我在代码中想要的算法:
我在 UI 中使用了 Qt5。我可以发布特定主题的消息。我的 MQTT 服务器和客户端 运行 正常。 这是我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWidgets import QApplication
import sys
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected successfully")
else:
print("Connect returned result code: " + str(rc))
# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
print("Received message: " + msg.topic + " -> " + msg.payload.decode("utf-8"))
class mqttbrokerconnection:
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.tls_set(tls_version=mqtt.ssl.PROTOCOL_TLS)
client.username_pw_set("usrnm", "pwd")
client.connect("server", port)
client.subscribe("deneme")
client.publish("deneme", "selam dünya!")
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("deneme")#pencere ismi
MainWindow.resize(1280, 960)#pencere boyutu
MainWindow.setStyleSheet("background-color: rgb(100, 100, 100);")#renk
self.centralwidget = QtWidgets.QWidget(MainWindow)#bu ne amk
self.centralwidget.setObjectName("centralwidget")#bunu da bilmiom
self.widget = QWebEngineView(self.centralwidget)#Webviev şeysi
self.widget.setGeometry(QtCore.QRect(320, 100, 640, 460))#Webviev boyutu
self.widget.setObjectName("widget")#Webview ismi
self.ileri = QtWidgets.QPushButton(self.centralwidget)
self.ileri.setGeometry(QtCore.QRect(600, 710, 71, 61))
self.ileri.setObjectName("ileri")
self.ileri.setStyleSheet("color: rgb(255, 255, 255);")
self.geri = QtWidgets.QPushButton(self.centralwidget)
self.geri.setGeometry(QtCore.QRect(600, 770, 71, 61))
self.geri.setObjectName("geri")
self.geri.setStyleSheet("color: rgb(255, 255, 255);")
self.sol = QtWidgets.QPushButton(self.centralwidget)
self.sol.setGeometry(QtCore.QRect(529, 770, 71, 61))
self.sol.setObjectName("sol")
self.sol.setStyleSheet("color: rgb(255, 255, 255);")
self.sag = QtWidgets.QPushButton(self.centralwidget)
self.sag.setGeometry(QtCore.QRect(671, 770, 71, 61))
self.sag.setObjectName("sag")
self.sag.setStyleSheet("color: rgb(255, 255, 255);")
MainWindow.setCentralWidget(self.centralwidget)#bunuda bilmiom mk
self.menubar = QtWidgets.QMenuBar(MainWindow)#sanırım menü barı
self.widget.load(QUrl("http://google.com"))#webviev yüklenecek url
self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 21))#menübar konum şeysi
self.menubar.setObjectName("menubar")#menübar isim
MainWindow.setMenuBar(self.menubar)#mainwindows'daki menübarın menübar olduğunu tanımlama
self.statusbar = QtWidgets.QStatusBar(MainWindow)#idfc
self.statusbar.setObjectName("statusbar")#idfc
MainWindow.setStatusBar(self.statusbar)#mainwindowdaki idfcin idfc olduğunu tanımlama
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):#çeviri kısm
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "skrt app"))
self.ileri.setText(_translate("MainWindow", "↑↑"))
self.geri.setText(_translate("MainWindow", "↓↓"))
self.sol.setText(_translate("MainWindow", "←←"))
self.sag.setText(_translate("MainWindow", "→→"))
if __name__ == "__main__":#uygulama çekirdeği
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
client.loop_forever()
如@chrislondon 所述,您可以有子主题:例如your_topic/msg1
和 your_topic/msg2
。然后发布到这些主题。使用 client.message_callback_add("your_topic/msg1", on_message_msg1)
和 client.message_callback_add("your_topic/msg2", on_message_msg2)
订阅它们,并在 msg1
或 msg2
到达订阅者的情况下执行您的自定义逻辑 - 在 on_message_msg1()
和 [=17 中=] 回调。
请看这个例子: https://github.com/eclipse/paho.mqtt.python/blob/master/examples/client_sub-multiple-callback.py
还有更多使用 Paho MQTT 的例子: https://github.com/eclipse/paho.mqtt.python/tree/master/examples