自定义连接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()
评论区