diff --git a/gateway_config.py b/gateway_config.py index b15f1eb..b5af6a3 100644 --- a/gateway_config.py +++ b/gateway_config.py @@ -144,7 +144,7 @@ class GatewayConfigTool(QMainWindow): self.refresh_ports() def init_ui(self): - self.setWindowTitle("网关配置工具(窄带版 V1.2.1)") + self.setWindowTitle("网关配置工具(窄带版 V1.2.2)") self.setWindowIcon(QIcon(resource_path("物联网网关.png"))) self.setMinimumSize(940, 640) self.resize(1000, 700) @@ -873,7 +873,6 @@ class DeviceDialog(QDialog): self.resize(860, 520) self._buf = "" - self._pending_del = None # 等待删除结果的MAC,"all"表示删除全部 self._parsed = False # 本次查询是否已完成解析(防止数据流中途误触发) self._quiet = QTimer(self) self._quiet.setSingleShot(True) @@ -921,7 +920,6 @@ class DeviceDialog(QDialog): if not self._serial_ok(): return self._buf = "" - self._pending_del = None self._parsed = False self._quiet.stop() self.table.setRowCount(0) # 清空旧数据,避免新旧混淆 @@ -936,20 +934,17 @@ class DeviceDialog(QDialog): self._buf += text self._quiet.start(600) # 数据流仍在到达,重置静默定时器 + def _remove_row_by_mac(self, mac): + """从表格中移除指定MAC的设备行, 返回是否移除成功。""" + mac_u = mac.upper() + for row in range(self.table.rowCount()): + item = self.table.item(row, 1) + if item and mac_u in item.text(): + self.table.removeRow(row) + return True + return False + def _on_quiet(self): - if self._pending_del is not None: - buf = self._buf - if "deleted" in buf.lower(): - self.status_lbl.setText(f"删除成功 ({self._pending_del})") - elif "not registered" in buf: - self.status_lbl.setText("删除失败:设备未注册") - elif "Para Error" in buf: - self.status_lbl.setText("删除失败:指令参数错误") - else: - self.status_lbl.setText("删除失败:设备无响应") - self._pending_del = None - self.query() - return # 仅解析一次:避免数据流间歇触发的中途解析把表格清零 if self._parsed: return @@ -1051,11 +1046,12 @@ class DeviceDialog(QDialog): QMessageBox.Yes | QMessageBox.No) if ret != QMessageBox.Yes: return - self._buf = "" - self._pending_del = mac - self.status_lbl.setText(f"正在删除 {mac} ...") + # 网关cudel无应答, 直接本地移除该行 self.main.send_command(f"cudel {mac}") - self._quiet.start(800) + if self._remove_row_by_mac(mac): + self.status_lbl.setText(f"已删除 {mac} (共 {self.table.rowCount()} 个设备)") + else: + self.status_lbl.setText(f"删除命令已发送 ({mac})") def _del_all(self): if not self._serial_ok(): @@ -1064,11 +1060,10 @@ class DeviceDialog(QDialog): QMessageBox.Yes | QMessageBox.No) if ret != QMessageBox.Yes: return - self._buf = "" - self._pending_del = "all" - self.status_lbl.setText("正在删除全部设备 ...") + # 网关cudel无应答, 直接清空表格 self.main.send_command("cudel all") - self._quiet.start(800) + self.table.setRowCount(0) + self.status_lbl.setText("已删除全部设备") def closeEvent(self, event): self._quiet.stop() diff --git a/generate_manual.py b/generate_manual.py index 0c8d72c..6ffa1e0 100644 --- a/generate_manual.py +++ b/generate_manual.py @@ -150,7 +150,7 @@ cover_info = [ ["适用设备", "物联网网关"], ["通信接口", "串口(UART),波特率默认500000可修改"], ["运行环境", "Windows 7/10/11"], - ["文档版本", "V1.0"], + ["文档版本", "V1.1"], ] cover_table = Table(cover_info, colWidths=[40 * mm, 90 * mm]) cover_table.setStyle(TableStyle([ @@ -187,6 +187,7 @@ toc_items = [ (" 3.3", "Lora信道配置"), (" 3.4", "自定义指令"), (" 3.5", "通讯日志"), + (" 3.6", "设备管理"), ("4", "指令参考"), ("5", "常见问题(FAQ)"), ("6", "注意事项"), @@ -213,6 +214,7 @@ features = [ ["Lora信道配置", "选择并设置Lora通信信道频率(470.1MHz ~ 492.6MHz)"], ["自定义指令", "支持手动输入任意指令与网关交互"], ["通讯日志", "实时显示发送和接收的通讯数据,便于调试"], + ["设备管理", "查询/删除网关已注册的通讯单元设备,删除后即时更新列表"], ] story.append(make_table(features[0], features[1:], col_widths=[35 * mm, 115 * mm])) story.append(Spacer(1, 3 * mm)) @@ -352,6 +354,19 @@ story.append(make_table(["颜色", "类型", "说明"], log_rows, col_widths=[25 story.append(Spacer(1, 2 * mm)) story.append(note(f"点击{LQ}清空日志{RQ}按钮可清除当前日志内容。日志数据仅保留在内存中,关闭软件后自动清除。")) +story.append(heading2("3.6 设备管理")) +story.append(body( + f"点击{LQ}设备管理{RQ}按钮打开设备管理对话框,可查询与删除网关已注册的通讯单元设备:" +)) +mgmt_rows = [ + [f"{LQ}刷新查询{RQ}", "向网关发送查询指令,列出全部已注册设备(类型、MAC、传感器类型、电量、RSSI/SNR、在线状态等)"], + [f"{LQ}删除{RQ}", "点击设备行右侧的删除按钮并确认后,立即从列表中移除该设备(列表即时更新,无需重新查询)"], + [f"{LQ}删除全部设备{RQ}", "删除网关上全部已注册设备,列表清空"], +] +story.append(make_table(["操作", "说明"], mgmt_rows, col_widths=[35 * mm, 115 * mm])) +story.append(Spacer(1, 2 * mm)) +story.append(note("删除操作直接生效,若需确认设备列表最新状态,可再次点击刷新查询。")) + story.append(PageBreak()) # ==================== 4. 指令参考 ==================== @@ -363,6 +378,9 @@ story.append(Spacer(1, 2 * mm)) cmd_rows = [ ["para", "读取网关全部配置参数", "查看配置(para)"], ["lora fc <频率>", "设置Lora信道频率(Hz)", "Lora信道配置"], + ["culs", "查询已注册通讯单元设备列表", "设备管理-刷新查询"], + ["cudel <MAC>", "删除指定MAC的通讯单元设备", "设备管理-删除"], + ["cudel all", "删除全部已注册通讯单元设备", "设备管理-删除全部设备"], ] story.append(make_table( ["指令格式", "功能说明", "对应操作"], diff --git a/网关配置工具使用说明书.pdf b/网关配置工具使用说明书.pdf index 1f3f188..3c73b27 100644 Binary files a/网关配置工具使用说明书.pdf and b/网关配置工具使用说明书.pdf differ