From b932dd7c6fdb4b3e5d038a5886cbf76cc20eba00 Mon Sep 17 00:00:00 2001 From: wangfq Date: Tue, 7 Jul 2026 17:47:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20DBNMQTTool=20=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=20=E2=80=94=20=E6=94=B6=E5=8F=91=E6=89=93?= =?UTF-8?q?=E5=8D=B0=20topic=20+=20payload=20=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增 _log_send() / _log_recv() 两个统一日志方法: - 发送: 标签 + → topic + PASTE:{精简payload} - 接收: ← topic + summary + RECV:{精简payload} - payload >200/300 字符自动截断 覆盖所有收发路径: - [模拟]/[协议]/[自定义]/[命令] 发送 - 响应/loop_data/event_report/heartbeat/Initialize 接收 - mqtt_client.py 自动订阅事件日志 --- DBNMQTTool/dbn_mqtt_tool/mqtt_client.py | 1 + DBNMQTTool/main.py | 44 ++++++++++++++++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py b/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py index bc6ef70..be43e36 100644 --- a/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py +++ b/DBNMQTTool/dbn_mqtt_tool/mqtt_client.py @@ -68,6 +68,7 @@ class MqttClient: self._notify_status(True, "已连接到 Broker") from .protocol import TOPIC_ALL_DEVICE_UP + print(f"[MqttClient] auto-subscribe: {TOPIC_ALL_DEVICE_UP}", flush=True) client.subscribe(TOPIC_ALL_DEVICE_UP, qos=1) else: self._connected = False diff --git a/DBNMQTTool/main.py b/DBNMQTTool/main.py index 0e786e5..3824d9c 100644 --- a/DBNMQTTool/main.py +++ b/DBNMQTTool/main.py @@ -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)