用pyQt5写的一个简单的mqtt客户端demo

这篇博客介绍了一个使用Python PyQt5库和paho-mqtt库编写的MQTT客户端DEMO。首先,你需要安装必要的软件包:pyQt5、paho-mqtt和json。然后,配置好MQTT服务器信息并修改同级目录下的setting.json文件。客户端会根据设置连接到MQTT服务器,并订阅指定主题。当收到消息时,会在GUI界面上显示。你可以使用MQTT.fx发送消息来测试这个客户端。
摘要由CSDN通过智能技术生成

用pyQt5写的一个简单的mqtt客户端demo

软件包安装

  1. pyQt5
  2. paho-mqtt
  3. json

使用方法

  1. 确保配置好mqtt服务器,并连接网络。
  2. 修改同级目录下setting.json文件中的服务器配置信息。
    {
        "broker":"129.211.xx.xxx",
        "port":1883,
        "client":"ternimal",
        "passwd":"Mjk2NTE3NDY5MTQ1OTg4OdawdawdaTg************AyNDA",
        "topic":"/python/mqtt"
    }
    
  3. 然后即可运行客户端等待MQTT数据。
     python app.py
    
  4. MQTT.fx发送话题,即可在客户端显示。
    在这里插入图片描述
    在这里插入图片描述

代码

import random
import time
import sys
import os

from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLabel, QWidget, QHBoxLayout, QVBoxLayout, QTextEdit, QPushButton
from PyQt5.QtCore import pyqtSignal, QObject, Qt

from paho.mqtt import client as mqtt_client

import json

# 读取配置信息
with open("./setting.json", "r") as f:
    setting = json.load(f)
    broker = setting['broker']
    port = setting['port']
    username = setting['client']
    password = setting['passwd']
    topic = setting['topic']

# 随机生成Client ID
client_id = f'ternimal-mqtt-{random.randint(0, 100)}'


class MQTT(QObject):
    """MQTT通信"""

    signal = pyqtSignal(str, str)

    def __init__(self, parent=None):
        super().__init__(parent)

    def _connect_mqtt(self) -> mqtt_client:
        def on_connect(client, userdata, flags, rc):
            if rc == 0:
                print("Connected to MQTT Broker!")
            else:
                print("Failed to connect, return code %d\n", rc)

        client = mqtt_client.Client(client_id)
        client.username_pw_set(username=username, password=password)
        client.on_connect = on_connect
        client.connect(broker, port)
        return client

    def _subscribe(self, client: mqtt_client):
        def on_message(client, userdata, msg):
            print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
            self.signal.emit(msg.topic, msg.payload.decode())

        client.subscribe(topic)
        client.on_message = on_message

    def mqtt_run(self):

        client = self._connect_mqtt()
        self._subscribe(client)
        client.loop_start()  # 开启新线程处理MQTT数据


class Window(QWidget):
    """窗口界面"""

    def __init__(self, parent=None):
        super().__init__(parent)
        self._ui_init()

    def _ui_init(self):
        """绘制UI"""
        self.setWindowTitle("MQTT")
        self.setFixedWidth(900)
        self.setFixedHeight(450)

        self.topic_wgt = QTextEdit()
        self.data_wgt = QTextEdit()

        self.clear_btn = QPushButton("clear")

        layout_h1 = QHBoxLayout()
        layout_h2 = QHBoxLayout()
        layoutV = QVBoxLayout()
        layout_h1.addWidget(QLabel("Topic:"))
        layout_h1.addWidget(QLabel("Payload:"))
        layout_h2.addWidget(self.topic_wgt)
        layout_h2.addWidget(self.data_wgt)
        layoutV.addLayout(layout_h1)
        layoutV.addLayout(layout_h2)
        layoutV.addWidget(self.clear_btn)

        self.clear_btn.clicked.connect(self.clear_data)  # 连接槽函数
        self.setLayout(layoutV)

    def show_data(self, topic, payload):
        self.topic_wgt.append(topic)
        self.data_wgt.append(payload)
        pass

    def clear_data(self):
        self.topic_wgt.clear()
        self.data_wgt.clear()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 创建MQTT客户端
    client = MQTT()
    client.mqtt_run()
    # 显示界面
    Win = Window()
    Win.show()

    client.signal.connect(Win.show_data)  # 将MQTT数据接收信号和UI刷新槽关联
    sys.exit(app.exec())

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liangtao`

请作者喝杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值