feat: DBNMQTTool 日志增强 — 收发打印 topic + payload 详情

新增 _log_send() / _log_recv() 两个统一日志方法:
- 发送: 标签 + → topic + PASTE:{精简payload}
- 接收: ← topic + summary + RECV:{精简payload}
- payload >200/300 字符自动截断

覆盖所有收发路径:
- [模拟]/[协议]/[自定义]/[命令] 发送
- 响应/loop_data/event_report/heartbeat/Initialize 接收
- mqtt_client.py 自动订阅事件日志
This commit is contained in:
wangfq
2026-07-07 17:47:58 +08:00
parent 5e4e1b1ec7
commit b932dd7c6f
2 changed files with 37 additions and 8 deletions
+36 -8
View File
@@ -450,7 +450,7 @@ class MainWindow(QMainWindow):
try:
payload = json.loads(text)
self._mqtt.publish(topic, payload, qos=1)
self._log(f"[模拟]{topic}")
self._log_send("[模拟]", topic, payload)
except json.JSONDecodeError as e:
QMessageBox.warning(self, "JSON 错误", str(e))
except Exception as e:
@@ -585,7 +585,7 @@ class MainWindow(QMainWindow):
else:
payload = build_request(CMD_DEV_INFO_QUERY)
self._mqtt.publish(topic, payload)
self._log(f"[协议]{topic}")
self._log_send("[协议]", topic, payload)
except json.JSONDecodeError as e:
QMessageBox.warning(self, "JSON 错误", str(e))
except Exception as e:
@@ -687,7 +687,7 @@ class MainWindow(QMainWindow):
payload = json.loads(raw) if raw else {}
qos = int(self._custom_qos.currentText())
self._mqtt.publish(topic, payload, qos=qos)
self._log(f"[自定义]{topic}")
self._log_send("[自定义]", topic, payload)
except json.JSONDecodeError as e:
QMessageBox.warning(self, "JSON 错误", str(e))
except Exception as e:
@@ -775,7 +775,7 @@ class MainWindow(QMainWindow):
code = payload.get("code", -1)
pmsg = payload.get("msg", "")
data = payload.get("data", {})
self._log(f"[{ts}] {dev_serial}{cmd} code={code} {pmsg}")
self._log_recv(topic, payload, f"{cmd} code={code} {pmsg}")
if code == 0:
if cmd == CMD_DEV_INFO_QUERY:
self._devmgr.update_from_dev_info(dev_serial, data)
@@ -789,20 +789,27 @@ class MainWindow(QMainWindow):
data = payload.get("data", {})
self._devmgr.update_loop_data(dev_serial, data)
chs = len(data.get("channels", []))
self._log(f"[{ts}] {dev_serial}loop_data ({chs} 通道)")
self._log_recv(topic, payload, f"loop_data ({chs}ch)")
self._append_text(self._loop_text, json.dumps(payload, indent=2, ensure_ascii=False))
elif cmd == CMD_EVENT_REPORT:
data = payload.get("data", {})
self._devmgr.update_event(dev_serial, data)
evt_count = len(data.get("events", []))
self._log(f"[{ts}] {dev_serial} ← event_report ({evt_count} 事件)")
self._log_recv(topic, payload, f"event ({evt_count} events)")
self._append_text(self._event_text, json.dumps(payload, indent=2, ensure_ascii=False))
elif cmd == CMD_HEARTBEAT:
data = payload.get("data", {})
self._devmgr.update_heartbeat(dev_serial, data)
self._log(f"[{ts}] {dev_serial}heartbeat (uptime={data.get('uptime', 0)}s)")
self._log_recv(topic, payload, f"heartbeat uptime={data.get('uptime', 0)}s")
# 旧协议 / 无 cmd 字段 的消息(如 Initialize
elif "Method" in payload:
self._log_recv(topic, payload, f"Method={payload.get('Method', '?')}")
else:
self._log_recv(topic, payload)
# 自定义订阅消息 → 显示到自定义 Topic 接收区
for sub_topic in self._custom_subs:
@@ -840,7 +847,10 @@ class MainWindow(QMainWindow):
return
try:
mid = self._mqtt.send_command(sn, cmd, data)
self._log(f"{sn} {cmd} (msg_id={mid})")
from dbn_mqtt_tool.protocol import build_request, get_topic_for_cmd
msg = build_request(cmd, data)
topic = get_topic_for_cmd(cmd, sn)
self._log_send(f"[命令] {sn}", topic, msg)
except Exception as e:
QMessageBox.critical(self, "发送失败", str(e))
@@ -979,6 +989,24 @@ class MainWindow(QMainWindow):
self._log_text.append(f"[{ts}] {msg}")
self._log_text.moveCursor(QTextCursor.End)
# ---- 详细收发日志 ----
def _log_send(self, label: str, topic: str, payload: dict):
"""记录发送消息: 标签 + topic + 精简 payload"""
payload_str = json.dumps(payload, ensure_ascii=False)
if len(payload_str) > 200:
payload_str = payload_str[:200] + "..."
self._log(f"{label}{topic}")
self._log(f" PASTE: {payload_str}")
def _log_recv(self, topic: str, payload: dict, summary: str = ""):
"""记录接收消息: topic + summary + 精简 payload"""
payload_str = json.dumps(payload, ensure_ascii=False)
if len(payload_str) > 300:
payload_str = payload_str[:300] + "..."
self._log(f"{topic}{' ' + summary if summary else ''}")
self._log(f" RECV: {payload_str}")
def main():
app = QApplication(sys.argv)