[feat] add mqtt for hfc
This commit is contained in:
parent
74f9ac43ab
commit
d223574333
@ -17,6 +17,9 @@ import subprocess
|
|||||||
import platform
|
import platform
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
import json
|
||||||
|
|
||||||
class ModbusGasAnalyzer:
|
class ModbusGasAnalyzer:
|
||||||
def __init__(self, root):
|
def __init__(self, root):
|
||||||
self.root = root
|
self.root = root
|
||||||
@ -65,6 +68,16 @@ class ModbusGasAnalyzer:
|
|||||||
"送样单位": "",
|
"送样单位": "",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# 服务器MQTT信息 - 初始化值
|
||||||
|
self.mqtt_info = {
|
||||||
|
"服务器地址": "122.112.229.121",
|
||||||
|
"端口号": "1883",
|
||||||
|
"主题": "xiaofang/sensor/data",
|
||||||
|
"用户名": "xiaofang",
|
||||||
|
"密码": "xiaofang@qwer",
|
||||||
|
}
|
||||||
|
self.mqtt_client = None
|
||||||
|
|
||||||
# 创建页面
|
# 创建页面
|
||||||
self.create_page1()
|
self.create_page1()
|
||||||
|
|
||||||
@ -310,12 +323,95 @@ class ModbusGasAnalyzer:
|
|||||||
tk.Button(button_frame, text="保存报告", font=('Arial', 12),
|
tk.Button(button_frame, text="保存报告", font=('Arial', 12),
|
||||||
command=self.save_report, bg='blue', fg='white').pack(side='left', padx=20)
|
command=self.save_report, bg='blue', fg='white').pack(side='left', padx=20)
|
||||||
|
|
||||||
|
tk.Button(button_frame, text="上传到云", font=('Arial', 12),
|
||||||
|
command=self.upload_mqtt, bg='green', fg='white').pack(side='left', padx=20)
|
||||||
|
|
||||||
tk.Button(button_frame, text="退出", font=('Arial', 12),
|
tk.Button(button_frame, text="退出", font=('Arial', 12),
|
||||||
command=self.root.quit, bg='red', fg='white').pack(side='right', padx=20)
|
command=self.root.quit, bg='red', fg='white').pack(side='right', padx=20)
|
||||||
|
|
||||||
# 自动保存报告
|
# 自动保存报告
|
||||||
self.save_report()
|
self.save_report()
|
||||||
|
|
||||||
|
def create_page4(self):
|
||||||
|
"""创建第四个页面"""
|
||||||
|
self.clear_window()
|
||||||
|
|
||||||
|
# 创建一个主容器,包含顶部内容区和底部按钮区
|
||||||
|
container = tk.Frame(self.root, bg=self.custom_blue)
|
||||||
|
container.pack(fill='both', expand=True, padx=20, pady=20)
|
||||||
|
|
||||||
|
# 顶部内容框架
|
||||||
|
content_frame = tk.Frame(container, bg=self.custom_blue)
|
||||||
|
content_frame.pack(fill='both', expand=True)
|
||||||
|
|
||||||
|
# 左侧区域
|
||||||
|
left_frame = tk.Frame(content_frame, bg=self.custom_blue)
|
||||||
|
left_frame.pack(side='left', fill='both', expand=True, padx=(0, 10), pady=(50, 0))
|
||||||
|
|
||||||
|
# 右侧区域
|
||||||
|
right_frame = tk.Frame(content_frame, bg=self.custom_blue)
|
||||||
|
right_frame.pack(side='right', fill='both', expand=True, padx=(10, 0))
|
||||||
|
|
||||||
|
# 左侧内容
|
||||||
|
# 服务器地址
|
||||||
|
tk.Label(left_frame, text="服务器地址:", font=('Arial', 12), bg=self.custom_blue).grid(row=0, column=0, sticky='w', pady=15, padx=(30, 20))
|
||||||
|
self.ip_entry = tk.Entry(left_frame, font=('Arial', 12), width=20)
|
||||||
|
self.ip_entry.grid(row=0, column=1, sticky='ew', pady=10)
|
||||||
|
# 保留之前填写的信息
|
||||||
|
if self.mqtt_info["服务器地址"]:
|
||||||
|
self.ip_entry.insert(0, self.mqtt_info["服务器地址"])
|
||||||
|
|
||||||
|
# 端口号
|
||||||
|
tk.Label(left_frame, text="端口号:", font=('Arial', 12), bg=self.custom_blue).grid(row=1, column=0, sticky='w', pady=15, padx=(30, 20))
|
||||||
|
self.port_entry = tk.Entry(left_frame, font=('Arial', 12), width=20)
|
||||||
|
self.port_entry.grid(row=1, column=1, sticky='ew', pady=10)
|
||||||
|
# 自动填入当前时间,但如果已有信息则保留
|
||||||
|
if self.mqtt_info["端口号"]:
|
||||||
|
self.port_entry.insert(0, self.mqtt_info["端口号"])
|
||||||
|
|
||||||
|
# 主题
|
||||||
|
tk.Label(left_frame, text="主题:", font=('Arial', 12), bg=self.custom_blue).grid(row=2, column=0, sticky='w', pady=15, padx=(30, 20))
|
||||||
|
self.topic_entry = tk.Entry(left_frame, font=('Arial', 12), width=20)
|
||||||
|
self.topic_entry.grid(row=2, column=1, sticky='ew', pady=10)
|
||||||
|
if self.mqtt_info["主题"]:
|
||||||
|
self.topic_entry.insert(0, self.mqtt_info["主题"])
|
||||||
|
|
||||||
|
# 用户名
|
||||||
|
tk.Label(left_frame, text="用户名:", font=('Arial', 12), bg=self.custom_blue).grid(row=3, column=0, sticky='w', pady=15, padx=(30, 20))
|
||||||
|
self.user_name_entry = tk.Entry(left_frame, font=('Arial', 12), width=20)
|
||||||
|
self.user_name_entry.grid(row=3, column=1, sticky='ew', pady=10)
|
||||||
|
if self.mqtt_info["用户名"]:
|
||||||
|
self.user_name_entry.insert(0, self.mqtt_info["用户名"])
|
||||||
|
|
||||||
|
# 密码
|
||||||
|
tk.Label(left_frame, text="密码:", font=('Arial', 12), bg=self.custom_blue).grid(row=4, column=0, sticky='w', pady=15, padx=(30, 20))
|
||||||
|
self.user_password_entry = tk.Entry(left_frame, font=('Arial', 12), show="*", width=20)
|
||||||
|
self.user_password_entry.grid(row=4, column=1, sticky='ew', pady=10)
|
||||||
|
if self.mqtt_info["密码"]:
|
||||||
|
self.user_password_entry.insert(0, self.mqtt_info["密码"])
|
||||||
|
|
||||||
|
# 右侧内容 - 标题
|
||||||
|
title_label = tk.Label(right_frame, text="HFC-RapidScan多通道\n灭火剂气体快检仪",
|
||||||
|
font=('Arial', 18, 'bold'), bg=self.custom_blue,
|
||||||
|
justify='center')
|
||||||
|
title_label.pack(pady=40)
|
||||||
|
|
||||||
|
# 开始上传按钮
|
||||||
|
self.upload_mqtt_start_button = tk.Button(right_frame, text="开始上传", font=('Arial', 16, 'bold'),
|
||||||
|
bg='green', fg='white', width=15, height=2,
|
||||||
|
command=self.upload_mqtt_start)
|
||||||
|
self.upload_mqtt_start_button.pack(pady=40)
|
||||||
|
|
||||||
|
# 底部按钮框架 - 放在容器的最下方
|
||||||
|
button_frame = tk.Frame(container, bg=self.custom_blue)
|
||||||
|
button_frame.pack(side='bottom', fill='x', pady=(20, 10))
|
||||||
|
|
||||||
|
tk.Button(button_frame, text="重新测试", font=('Arial', 12),
|
||||||
|
command=self.back_to_page1, bg='green', fg='white').pack(side='left', padx=50)
|
||||||
|
|
||||||
|
tk.Button(button_frame, text="退出", font=('Arial', 12),
|
||||||
|
command=self.root.quit, bg='red', fg='white').pack(side='right', padx=50)
|
||||||
|
|
||||||
def save_report(self):
|
def save_report(self):
|
||||||
"""保存汇总信息为JPG图片"""
|
"""保存汇总信息为JPG图片"""
|
||||||
try:
|
try:
|
||||||
@ -628,6 +724,78 @@ class ModbusGasAnalyzer:
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def upload_mqtt(self):
|
||||||
|
# 切换到MQTT页面准备将数据上传
|
||||||
|
self.create_page4()
|
||||||
|
|
||||||
|
def upload_mqtt_start(self):
|
||||||
|
# 保存MQTT信息
|
||||||
|
self.mqtt_info = {
|
||||||
|
"服务器地址": self.ip_entry.get(),
|
||||||
|
"端口号": self.port_entry.get(),
|
||||||
|
"主题": self.topic_entry.get(),
|
||||||
|
"用户名": self.user_name_entry.get(),
|
||||||
|
"密码": self.user_password_entry.get(),
|
||||||
|
}
|
||||||
|
# 将数据通过MQTT上传到服务器
|
||||||
|
print(f"开始上传到MQTT");
|
||||||
|
"""连接MQTT服务器"""
|
||||||
|
try:
|
||||||
|
self.mqtt_client = mqtt.Client()
|
||||||
|
self.mqtt_client.username_pw_set(
|
||||||
|
self.mqtt_info["用户名"],
|
||||||
|
self.mqtt_info["密码"]
|
||||||
|
)
|
||||||
|
def on_connect(client, userdata, flags, rc):
|
||||||
|
if rc == 0:
|
||||||
|
print(f"MQTT连接成功: {rc}")
|
||||||
|
else:
|
||||||
|
messagebox.showerror("错误", f"MQTT连接失败: {rc}")
|
||||||
|
return
|
||||||
|
self.mqtt_client.on_connect = on_connect
|
||||||
|
self.mqtt_client.connect(
|
||||||
|
self.mqtt_info["服务器地址"],
|
||||||
|
int(self.mqtt_info["端口号"]),
|
||||||
|
3
|
||||||
|
)
|
||||||
|
self.mqtt_client.loop_start()
|
||||||
|
except ValueError as e:
|
||||||
|
# 处理端口号转换错误
|
||||||
|
messagebox.showerror("错误", f"端口号必须是数字: {str(e)}")
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
messagebox.showerror("错误", f"MQTT连接错误: {str(e)}")
|
||||||
|
return
|
||||||
|
"""整理MQTT数据"""
|
||||||
|
mqtt_payload = []
|
||||||
|
for key, value in self.user_info.items():
|
||||||
|
mqtt_payload.append(f"{key}: {value}")
|
||||||
|
mqtt_payload.append(f"浓度: {max(0.0, min(self.show_concentration, 99.990)):.3f}%")
|
||||||
|
"""上传数据到MQTT"""
|
||||||
|
try:
|
||||||
|
if self.mqtt_client:
|
||||||
|
result = self.mqtt_client.publish(
|
||||||
|
self.mqtt_info["主题"],
|
||||||
|
"\r\n".join(mqtt_payload),
|
||||||
|
qos=1 #服务质量等级
|
||||||
|
)
|
||||||
|
if result.rc == mqtt.MQTT_ERR_SUCCESS:
|
||||||
|
messagebox.showinfo("成功", f"MQTT上传成功")
|
||||||
|
else:
|
||||||
|
messagebox.showerror("错误", f"MQTT上传失败: {result}")
|
||||||
|
return
|
||||||
|
except Exception as e:
|
||||||
|
messagebox.showerror("错误", f"MQTT上传错误: {str(e)}")
|
||||||
|
return
|
||||||
|
"""断开MQTT连接"""
|
||||||
|
try:
|
||||||
|
self.mqtt_client.loop_stop()
|
||||||
|
self.mqtt_client.disconnect()
|
||||||
|
self.mqtt_client = None
|
||||||
|
except Exception as e:
|
||||||
|
print(f"MQTT断开错误: {e}")
|
||||||
|
return
|
||||||
|
|
||||||
def get_windows_serial_number():
|
def get_windows_serial_number():
|
||||||
"""
|
"""
|
||||||
获取Windows系统的唯一序列号
|
获取Windows系统的唯一序列号
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user