diff --git a/batch_dialog.py b/batch_dialog.py index 22f9c7a..bfb4564 100644 --- a/batch_dialog.py +++ b/batch_dialog.py @@ -1,5 +1,9 @@ +import os import sys import csv +import socket, struct +import time + from PyQt5.QtWidgets import QApplication, QDialog, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, \ QPushButton, QCheckBox, QFileDialog, QMessageBox from PyQt5.QtCore import Qt @@ -104,13 +108,150 @@ class BatchOperationDialog(QDialog): item.setCheckState(0) # 未选中 def get_version(self): - print("获取版本按钮被点击") + # 遍历表格的第1列,获取选中的行的IP地址 + for row in range(self.table_widget.rowCount()): + item = self.table_widget.item(row, 0) + if item.checkState() == Qt.Checked: # 如果该行被选中 + ip = self.table_widget.item(row, 1).text() # 获取IP地址 + if ip: + try: + # 创建TCP连接到IP地址的12345端口 + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(5) # 设置连接超时时间为5秒 + s.connect((ip, 12345)) + + # 发送消息 + message = bytes([0xAA, 0x55, 0xAA, 0x0F, 0x01, 0x00]) + s.sendall(message) + + # 接收返回的数据(假设返回数据至少有8个字节) + response = s.recv(1024) + if len(response) >= 8: + # 解析第7、8字节作为版本号 + version = f"{response[6]}-{response[7]}" + # 将版本号写入到第4列(版本号列) + self.table_widget.setItem(row, 3, QTableWidgetItem(version)) + else: + print(f"接收到的数据长度不足:{len(response)},无法提取版本号") + except Exception as e: + print(f"与IP {ip} 连接失败: {e}") + self.table_widget.setItem(row, 3, QTableWidgetItem("连接失败")) def get_mac(self): - print("获取MAC按钮被点击") + for row in range(self.table_widget.rowCount()): + item = self.table_widget.item(row, 0) + if item.checkState() == Qt.Checked: # 如果该行被选中 + ip = self.table_widget.item(row, 1).text() # 获取IP地址 + if ip: + try: + # 创建TCP连接到IP地址的12345端口 + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(5) # 设置连接超时时间为5秒 + s.connect((ip, 12345)) + + # 发送消息 + message = bytes([0xAA, 0x55, 0xAA, 0x12, 0x01, 0x00]) + s.sendall(message) + + # 接收返回的数据(假设返回数据至少有8个字节) + response = s.recv(1024) + if len(response) >= 8: + # 解析第7、8字节作为mac后2字节 + mac = f"50-29-4D-20-{response[6]}-{response[7]}" + # 将版本号写入到第3列(MAC列) + self.table_widget.setItem(row, 2, QTableWidgetItem(mac)) + else: + print(f"接收到的数据长度不足:{len(response)},无法提取版本号") + except Exception as e: + print(f"与IP {ip} 连接失败: {e}") + self.table_widget.setItem(row, 3, QTableWidgetItem("连接失败")) + + def calculate_crc(self, data: bytes) -> int: + """计算数据的累加和CRC""" + crc = 0 + for byte in data: + crc += byte + return crc & 0xFF # 只保留最低字节 def upgrade_node(self): - print("升级节点按钮被点击") + """打开文件选择对话框""" + file_path, _ = QFileDialog.getOpenFileName( + self, "选择升级文件", "", "二进制文件 (*.bin);;所有文件 (*)" + ) + + if file_path: + file_name = os.path.basename(file_path) + # self.status_bar.showMessage(f"已选择: {file_name}") + + try: + print("Starting upgrade process...") + if not os.path.exists(file_path): + raise FileNotFoundError(f"Upgrade file {file_path} not found") + + with open(file_path, "rb") as f: + package_data = f.read() + + if not package_data: + raise ValueError("Upgrade file is empty") + + print(f"Read upgrade package, size: {len(package_data)} bytes") + + upgrade_len = len(package_data) + crc = self.calculate_crc(package_data) + upgrade_req = struct.pack("