侧边栏壁纸
博主头像
Epoch

Java开发、Python爬虫、微服务、分布式、前端

  • 累计撰写 94 篇文章
  • 累计创建 111 个标签
  • 累计收到 8 条评论

目 录CONTENT

文章目录

基于python编写mqtt上位机

Epoch
2023-04-18 / 0 评论 / 0 点赞 / 34 阅读 / 699 字 / 正在检测是否收录...

自定义连接IP、端口、发送订阅消息、订阅主题

import tkinter as tk
import paho.mqtt.client as mqtt

class MQTT_Client():
    def __init__(self):
        self.connected = False
        self.client = mqtt.Client()
        self.client.on_connect = self.on_connect
        self.client.on_message = self.on_message

    def on_connect(self, client, userdata, flags, rc):
        if rc == 0:
            print("Connected to broker")
            self.connected = True
            self.master.status_label.config(text="Connected", fg="green")
            self.master.connect_button.configure(text="Disconnect")
        else:
            print("Connection failed")
            self.master.status_label.config(text="Disconnected", fg="red")
            self.connected = False

    def on_message(self, client, userdata, msg):
        topic = msg.topic
        message = msg.payload.decode()
        self.master.add_message(topic, message)

    def connect(self, broker_ip, broker_port):
        self.client.connect(broker_ip, broker_port)
        self.client.loop_start()

    def disconnect(self):
        self.client.disconnect()
        self.client.loop_stop(force=True)

    def publish(self, topic, message):
        self.client.publish(topic, message)

    def subscribe(self, topic):
        self.client.subscribe(topic)

class MainGUI():
    def __init__(self, master):
        self.master = master
        self.master.title("MQTT Client")

        # Create widgets for IP and port input and connect button
        self.ip_label = tk.Label(master, text="服务端 IP:")
        self.ip_label.grid(row=0, column=0, padx=5, pady=5)
        self.ip_entry = tk.Entry(master)
        self.ip_entry.grid(row=0, column=1, padx=5, pady=5)
        self.port_label = tk.Label(master, text="服务端 Port:")
        self.port_label.grid(row=1, column=0, padx=5, pady=5)
        self.port_entry = tk.Entry(master)
        self.port_entry.grid(row=1, column=1, padx=5, pady=5)
        self.connect_button = tk.Button(master, text="Connect", command=self.toggle_connection)
        self.connect_button.grid(row=0, column=2, rowspan=2, padx=5, pady=5)
        self.status_label = tk.Label(master, text="Disconnected", fg="red")
        self.status_label.grid(row=0, column=3, padx=5, pady=5)

        # Create widgets for message sending and receiving
        self.send_label = tk.Label(master, text="发送消息:")
        self.send_label.grid(row=2, column=0, padx=5, pady=5)
        self.send_entry = tk.Entry(master)
        self.send_entry.grid(row=2, column=1, padx=5, pady=5)
        self.send_button = tk.Button(master, text="发送", command=self.send_message)
        self.send_button.grid(row=2, column=2, padx=5, pady=5)
        self.receive_label = tk.Label(master, text="接受消息:")
        self.receive_label.grid(row=3, column=0, padx=5, pady=5)
        self.receive_text = tk.Text(master, height=10, width=30)
        self.receive_text.grid(row=4, column=0, columnspan=3, padx=5, pady=5)

        # Create widgets for subscribing to topics
        self.topic_label = tk.Label(master, text="订阅 主题:")
        self.topic_label.grid(row=5, column=0, padx=5, pady=5)
        self.topic_entry = tk.Entry(master)
        self.topic_entry.grid(row=5, column=1, padx=5, pady=5)
        self.subscribe_button = tk.Button(master, text="订阅", command=self.subscribe_topic)
        self.subscribe_button.grid(row=5, column=2, padx=5, pady=5)
        self.subscribed_label = tk.Label(master, text="")
        self.subscribed_label.grid(row=5, column=3, padx=5, pady=5)

        self.client = MQTT_Client()

    def toggle_connection(self):
        if not self.client.connected:
            broker_ip = self.ip_entry.get()
            broker_port = int(self.port_entry.get())
            self.client.connect(broker_ip, broker_port)
        else:
            self.client.disconnect()

    def send_message(self):
        if self.client.connected:
            message = self.send_entry.get()
            topic = "test"
            self.client.publish(topic, message)

    def add_message(self, topic, message):
        self.receive_text.insert(tk.END, f"{topic}: {message}\n")

    def subscribe_topic(self):
        topic = self.topic_entry.get()
        self.client.subscribe(topic)
        self.subscribed_label.config(text=f"Subscribed to {topic}")

    def start(self):
        self.master.mainloop()

if __name__ == '__main__':
    root = tk.Tk()
    app = MainGUI(root)
    app.start()
0

评论区