6 Commits

3 changed files with 31 additions and 53 deletions
+25 -21
View File
@@ -144,7 +144,7 @@ class GatewayConfigTool(QMainWindow):
self.refresh_ports()
def init_ui(self):
self.setWindowTitle("网关配置工具(宽带版 V1.2.2)")
self.setWindowTitle("网关配置工具(窄带版 V1.2.1)")
self.setWindowIcon(QIcon(resource_path("物联网网关.png")))
self.setMinimumSize(940, 640)
self.resize(1000, 700)
@@ -204,9 +204,8 @@ class GatewayConfigTool(QMainWindow):
lora_layout.addWidget(QLabel("信道频率(fc):"))
self.combo_lora_fc = QComboBox()
self.combo_lora_fc.setFixedWidth(200)
# 宽带 Lora 信道:433.1MHz ~ 492.6MHz,步进0.5MHz,共120信道(信道0起始)
lora_freqs = []
fc_hz = 433100000
fc_hz = 470100000
ch_idx = 0
while fc_hz <= 492600000:
mhz = fc_hz / 1000000
@@ -874,6 +873,7 @@ 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,6 +921,7 @@ 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) # 清空旧数据,避免新旧混淆
@@ -935,17 +936,20 @@ 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
@@ -1047,12 +1051,11 @@ class DeviceDialog(QDialog):
QMessageBox.Yes | QMessageBox.No)
if ret != QMessageBox.Yes:
return
# 网关cudel无应答, 直接本地移除该行
self._buf = ""
self._pending_del = mac
self.status_lbl.setText(f"正在删除 {mac} ...")
self.main.send_command(f"cudel {mac}")
if self._remove_row_by_mac(mac):
self.status_lbl.setText(f"已删除 {mac} (共 {self.table.rowCount()} 个设备)")
else:
self.status_lbl.setText(f"删除命令已发送 ({mac})")
self._quiet.start(800)
def _del_all(self):
if not self._serial_ok():
@@ -1061,10 +1064,11 @@ class DeviceDialog(QDialog):
QMessageBox.Yes | QMessageBox.No)
if ret != QMessageBox.Yes:
return
# 网关cudel无应答, 直接清空表格
self._buf = ""
self._pending_del = "all"
self.status_lbl.setText("正在删除全部设备 ...")
self.main.send_command("cudel all")
self.table.setRowCount(0)
self.status_lbl.setText("已删除全部设备")
self._quiet.start(800)
def closeEvent(self, event):
self._quiet.stop()
+6 -32
View File
@@ -150,7 +150,7 @@ cover_info = [
["适用设备", "物联网网关"],
["通信接口", "串口(UART),波特率默认500000可修改"],
["运行环境", "Windows 7/10/11"],
["文档版本", "V1.1"],
["文档版本", "V1.0"],
]
cover_table = Table(cover_info, colWidths=[40 * mm, 90 * mm])
cover_table.setStyle(TableStyle([
@@ -187,7 +187,6 @@ toc_items = [
(" 3.3", "Lora信道配置"),
(" 3.4", "自定义指令"),
(" 3.5", "通讯日志"),
(" 3.6", "设备管理"),
("4", "指令参考"),
("5", "常见问题(FAQ)"),
("6", "注意事项"),
@@ -211,10 +210,9 @@ features = [
["功能模块", "说明"],
["串口通信", "通过USB转串口连接网关设备,波特率默认500000可自行修改,实时收发指令"],
["配置读取", "一键读取网关全部参数,包括软件/硬件版本、MAC地址、电池状态、注册状态等"],
["Lora信道配置", "选择并设置Lora通信信道频率(433.1MHz ~ 492.6MHz)"],
["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))
@@ -306,8 +304,8 @@ story.append(make_table(["显示项", "指令关键字", "说明"], para_rows, c
# 3.3
story.append(heading2("3.3 Lora信道配置"))
story.append(body(
"Lora信道配置用于设置网关的Lora无线通信频率。信道列表覆盖433.1MHz至492.6MHz范围,"
"频率间隔0.5MHz,共120个信道可供选择。"
"Lora信道配置用于设置网关的Lora无线通信频率。信道列表覆盖470.1MHz至492.6MHz范围,"
"频率间隔0.5MHz,共46个信道可供选择。"
))
story.append(Spacer(1, 2 * mm))
@@ -321,8 +319,8 @@ for i, s in enumerate(lora_steps, 1):
story.append(Spacer(1, 2 * mm))
lora_range = [
["起始频率", "433.1 MHz(信道0)"],
["终止频率", "492.6 MHz(信道119)"],
["起始频率", "470.1 MHz(信道0)"],
["终止频率", "492.6 MHz(信道45)"],
["频率间隔", "0.5 MHz(500 kHz)"],
["指令格式", "lora fc [频率值,单位Hz]"],
]
@@ -354,19 +352,6 @@ 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. 指令参考 ====================
@@ -378,9 +363,6 @@ story.append(Spacer(1, 2 * mm))
cmd_rows = [
["para", "读取网关全部配置参数", "查看配置(para)"],
["lora fc &lt;频率&gt;", "设置Lora信道频率(Hz)", "Lora信道配置"],
["culs", "查询已注册通讯单元设备列表", "设备管理-刷新查询"],
["cudel &lt;MAC&gt;", "删除指定MAC的通讯单元设备", "设备管理-删除"],
["cudel all", "删除全部已注册通讯单元设备", "设备管理-删除全部设备"],
]
story.append(make_table(
["指令格式", "功能说明", "对应操作"],
@@ -405,12 +387,6 @@ faqs = [
("Q3:Lora信道列表很长,如何快速选择?",
"Lora信道下拉框支持鼠标滚轮滚动选择,也可以点击下拉后直接滚动浏览。"
"信道编号和频率一一对应,选择后点击发送即可。"),
("Q4:设备升级失败或超时怎么办?",
f"1)确认升级过程中串口连接稳定,未出现断开或断电;2)确认{LQ}设备MAC{RQ}与目标网关一致;"
"3)确认固件文件为与设备匹配的.bin文件且未损坏;4)重新点击开始升级再试一次。"),
("Q5:设备管理查询不到设备或列表为空?",
"1)确认网关上已注册过通讯单元设备;2)点击刷新查询重试;"
"3)确认串口通讯正常(可通过查看配置验证);4)若刚删除设备,列表已实时更新属正常现象。"),
]
for q, a in faqs:
story.append(Paragraph(f"<b>{q}</b>", style_body))
@@ -429,8 +405,6 @@ warnings = [
f"<b>数据备份:</b>修改配置前建议先通过{LQ}查看配置{RQ}记录当前参数,以便需要时恢复。",
"<b>断电保护:</b>配置修改后请确认网关已保存参数,避免在参数写入过程中断电。",
"<b>驱动安装:</b>首次使用需安装USB转串口芯片驱动(如CH340、CP2102等),具体型号取决于使用的转接线。",
"<b>升级安全:</b>固件升级过程中严禁断开串口、关闭软件或给网关断电,否则可能导致网关固件损坏而无法启动。",
"<b>固件匹配:</b>请使用与网关硬件和项目匹配的固件文件(.bin),错误的固件可能导致设备功能异常。",
]
for w in warnings:
story.append(Paragraph(f"\u26a0 {w}", style_body))
Binary file not shown.