【问题标题】:How to filter messages from MQTT topic?如何过滤来自 MQTT 主题的消息?
【发布时间】:2021-07-13 16:12:57
【问题描述】:

我的问题是这样的。我想提取发送到我订阅的频道的消息,并相应地向系统添加功能。这是我在代码中想要的算法:

我将 Qt5 用于 UI。我可以在特定主题中发布消息。我的 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()

【问题讨论】:

  • 使用 MQTT 子主题怎么样?
  • 你需要edit这个问题来解释你的代码是如何不工作的。
  • 我的代码正在运行。我只是问如何添加。
  • 克里斯你能给我举个例子吗?

标签: python mqtt paho


【解决方案1】:

正如@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() 和on_message_msg2() 回调中。

请看一下这个例子: 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

【讨论】:

  • 所以我需要做这样的事情吗?对吧?: if (on_message_msg2()) "我要执行的代码"
  • 没有。请看上面的例子。您将拥有自己的回调,而不是 on_message_msgs() 和 on_message_bytes()。
  • 你写了一个函数,叫它on_message_msg1()。然后将此函数注册为回调。这意味着 MQTT 库将在消息 msg1 到达时调用您的函数。
猜你喜欢
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多