基于PYQT的MQTT协议测试工具

这段时间公司有个项目使用到了MQTT的协议与智能硬件终端进行通信,需要对通讯协议进行验证,正好这段时间一直在研究PYQT,正好写个GUI小工具,给测试组的同事们使用

主界面
主界面主要实现Publish和Subscribe 消息订阅和发送,使用了PAHO的mqtt库,我这边主要是实现了一个界面的封装
这里写图片描述

设置界面
设置界面主要是使用了python自带的sqlite数据库保存用户连接MQTT服务器时的一些个性化参数,用户可以对自己的保存的连接进行个性化命名,选中相应的连接,点击ok即可

整个小工具去掉库文件,自己实现的代码在1000行左右,只是一个初级版本,其中ConfigDialog.py就是设置页面编码,mtest.py是主界面的编码,mqttimage文件是一些图片的集合,对PYQT不是很了解的同学可以去查阅一下相关资料。

上代码
ConfigDialog.py

from PyQt4 import QtCore, QtGui
import random, mqttimage
import sqlite3, sys, os
# from PyQt4.QtGui import *  
# from PyQt4.QtCore import *  
from PyQt4.Qt import QMessageBox, QRegExpValidator


QtCore.QTextCodec.setCodecForTr(QtCore.QTextCodec.codecForName("utf8"))
childlist=[] 
user=''
class ConfigDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(ConfigDialog, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.Window) #设置最大化最小化按钮
        self.setWindowTitle(self.tr("设置"))
        self.resize(800,450)    
        QtGui.QApplication.setStyle(QtGui.QStyleFactory.create('Cleanlooks'))#设置整体风格
        QtGui.QApplication.setPalette(QtGui.QApplication.style().standardPalette())#设置整体风格
        mainSplitter = QtGui.QSplitter(QtCore.Qt.Horizontal,self)

        amendPushButton = QtGui.QPushButton(self.tr("OK"))
        closePushButton = QtGui.QPushButton(self.tr("Cancel"))
        self.applyPushButton = QtGui.QPushButton(self.tr("Save"))
        self.applyPushButton.setDisabled(True)# 初始化save不可用
        buttonLayout = QtGui.QHBoxLayout()
        buttonLayout.addStretch(9)
        buttonLayout.addWidget(self.applyPushButton)
        buttonLayout.addWidget(amendPushButton)
#         buttonLayout.addWidget(closePushButton)  

        addButton = QtGui.QPushButton(self.tr(""))
        addButton.setFlat(True)
        addButton.setIcon(QtGui.QIcon(":img/image/plus.png"))   
        delButton = QtGui.QPushButton(self.tr(""))
        delButton.setFlat(True)          
        delButton.setIcon(QtGui.QIcon(":img/image/minus.png")) 
        buttonLayout1 = QtGui.QGridLayout()
        buttonLayout1.addWidget(addButton,0,0)
        buttonLayout1.addWidget(delButton,0,2)  


        self.treeWidget = QtGui.QTreeWidget()
        self.treeWidget.setColumnCount(1)#设置列数1
        self.treeWidget.setHeaderLabels([self.tr("Connections")])

        self.root= QtGui.QTreeWidgetItem(self.treeWidget)
        self.root.setText(0,self.tr("Profile"))
        self.treeWidget.expandAll() #节点全部展开
        treeLayout = QtGui.QVBoxLayout()
        treeLayout.addWidget(self.treeWidget)
        treeLayout.addLayout(buttonLayout1)

        self.Param1 = Param()
        rightQSplitter = QtGui.QFrame(mainSplitter)    
        stack = QtGui.QStackedWidget()
        stack.setFrameStyle(QtGui.QFrame.Panel|QtGui.QFrame.Raised)
        stack.addWidget(self.Param1)

        mainLayout_1 = QtGui.QHBoxLayout()   
        mainLayout_1.addLayout(treeLayout)
        mainLayout_1.addWidget(stack)        


        mainLayout = QtGui.QVBoxLayout(rightQSplitter)
        mainLayout.setMargin(1)
        mainLayout.setSpacing(6)      
        mainLayout.addLayout(mainLayout_1)

        Layout = QtGui.QVBoxLayout()
        Layout.addWidget(mainSplitter)
        Layout.addLayout(buttonLayout)
        self.setLayout(Layout)
        self.initDB()#初始化数据库     



        '''槽函数'''
        amendPushButton.clicked.connect(self.accept)
        closePushButton.clicked.connect(self.reject)
        self.applyPushButton.clicked.connect(self.apply)
        addButton.clicked.connect(self.add)
        delButton.clicked.connect(self.delete)
        self.connect(self.treeWidget, QtCore.SIGNAL("itemClicked(QTreeWidgetItem*,int)"),self.data_query) 
        ''''''   

    def getsetdata(self):
        self.ProfileName = self.Param1.nameEdit.text()
        self.Host = self.Param1.HostEdit.text()
        self.portValue = self.Param1.portSpinbox.value()
        self.keepValue = self.Param1.keepaliveSpinbox.value()
        self.client = self.Param1.ClientEdit.text()
        self.user = self.Param1.tab.gen.UserEdit.text()
        self.password = self.Param1.tab.gen.PassWordEdit.text()
        self.visionValue = self.Param1.tab.gen.visionComboBox.currentText()
        self.cleanssionValue = self.Param1.tab.gen.CleanSessionComboBox.currentText()
        if self.cleanssionValue =='True':
            self.cleanssion = True
#             print self.cleanssion
        else:
            self.cleanssion = False
#             print self.cleanssion
        self.napsBooL = self.Param1.tab.gen.groupBox.isChecked()#namepassword 框是否勾选
        self.pascheck = self.Param1.tab.gen.checkBox1.checkState() 
        return  self.ProfileName, self.Host, self.portValue, self.keepValue, self.client, self.user, self.password, self.visionValue,  self.cleanssion, self.napsBooL, self.pascheck


    def data_query(self, QTreeWidgetItem, int):
        global rot
        parent = QTreeWidgetItem.parent()
        if parent == -1:
            return 1
        elif parent == None:
            self.Param1.nameEdit.setText('')
            self.Param1.HostEdit.setText('')
            self.Param1.portSpinbox.setValue(0)
            self.Param1.keepaliveSpinbox.setValue(0)
            self.Param1.ClientEdit.setText('')
            self.Param1.tab.gen.UserEdit.setText('')
            self.Param1.tab.gen.PassWordEdit.setText('')
            self.applyPushButton.setDisabled(True)
        else:
            try:
                rot = parent.indexOfChild(QTreeWidgetItem)
                self.applyPushButton.setDisabled(False)
            except AttributeError:
                pass
            cur = self.conn.cursor()
            cur.execute('SELECT * FROM MQ')
            self.MQData = cur.fetchall()
            cur.execute('SELECT * FROM MQ1')
            self.MQData1 = cur.fetchall()
            cur.close()
            self.idname = childlist[rot].text(0)
    #         print childlist[rot].text(0)
            self.index = len(self.MQData)
            self.index1 = len(self.MQData1)
            if self.index > 0 :
                for x in range(self.index):
                    if self.MQData[x][0] == self.idname:
                        self.Param1.nameEdit.setText(self.idname)
                        self.Param1.HostEdit.setText(self.MQData[x][1])
                        self.Param1.portSpinbox.setValue(self.MQData[x][2])
                        self.Param1.keepaliveSpinbox.setValue(self.MQData[x][3])
                        self.Param1.ClientEdit.setText(self.MQData[x][4])
                        self.Param1.tab.gen.UserEdit.setText(self.MQData[x][5])
                        self.Param1.tab.gen.PassWordEdit.setText(self.MQData[x][6])
                        if self.MQData[x][7] == 'True':
                            self.Param1.tab.gen.CleanSessionComboBox.setCurrentIndex(0)
                        else:
                            self.
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是一个使用PyQt和paho-mqtt库实现MQTT客户端订阅多个话题的示例代码。 首先需要安装paho-mqtt库,可以使用以下命令进行安装: ``` pip install paho-mqtt ``` 然后可以使用以下代码实现MQTT客户端: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLineEdit, QPushButton, QTextEdit import paho.mqtt.client as mqtt import threading class MQTTClient(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 设置窗口大小和标题 self.setGeometry(300, 300, 600, 400) self.setWindowTitle('MQTT Client') # 创建控件 self.topicLineEdit = QLineEdit() self.subscribeButton = QPushButton('Subscribe') self.unsubscribeButton = QPushButton('Unsubscribe') self.clearButton = QPushButton('Clear') self.messageTextEdit = QTextEdit() # 创建布局 topicLayout = QHBoxLayout() topicLayout.addWidget(self.topicLineEdit) topicLayout.addWidget(self.subscribeButton) topicLayout.addWidget(self.unsubscribeButton) topicLayout.addWidget(self.clearButton) mainLayout = QVBoxLayout() mainLayout.addLayout(topicLayout) mainLayout.addWidget(self.messageTextEdit) # 设置布局 self.setLayout(mainLayout) # 创建MQTT客户端 self.client = mqtt.Client() # 连接MQTT服务器 self.client.connect('localhost', 1883, 60) # 绑定信号和槽 self.subscribeButton.clicked.connect(self.subscribe) self.unsubscribeButton.clicked.connect(self.unsubscribe) self.clearButton.clicked.connect(self.clear) # 启动多线程 self.thread = threading.Thread(target=self.client.loop_forever) self.thread.start() def subscribe(self): topic = self.topicLineEdit.text() self.client.subscribe(topic) self.messageTextEdit.append('Subscribed to topic: {}'.format(topic)) def unsubscribe(self): topic = self.topicLineEdit.text() self.client.unsubscribe(topic) self.messageTextEdit.append('Unsubscribed from topic: {}'.format(topic)) def clear(self): self.messageTextEdit.clear() if __name__ == '__main__': app = QApplication(sys.argv) client = MQTTClient() client.show() sys.exit(app.exec_()) ``` 在该代码中,我们创建了一个继承自QWidget的MQTTClient类,在initUI方法中创建了窗口控件,并初始化了MQTT客户端。在subscribe方法中订阅了某个话题,在unsubscribe方法中取消订阅某个话题,在clear方法中清空消息文本框。启动多线程后,就可以在主线程中运行PyQt事件循环,而在子线程中运行MQTT客户端的消息循环。 注意,由于PyQt是单线程的,因此如果在主线程中运行MQTT客户端的消息循环,会导致PyQt事件循环无法响应,从而使窗口无法正常显示和响应。因此,我们需要在子线程中运行MQTT客户端的消息循环,以避免这种情况发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值