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:
@@ -68,6 +68,7 @@ class MqttClient:
|
|||||||
self._notify_status(True, "已连接到 Broker")
|
self._notify_status(True, "已连接到 Broker")
|
||||||
|
|
||||||
from .protocol import TOPIC_ALL_DEVICE_UP
|
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)
|
client.subscribe(TOPIC_ALL_DEVICE_UP, qos=1)
|
||||||
else:
|
else:
|
||||||
self._connected = False
|
self._connected = False
|
||||||
|
|||||||
+36
-8
@@ -450,7 +450,7 @@ class MainWindow(QMainWindow):
|
|||||||
try:
|
try:
|
||||||
payload = json.loads(text)
|
payload = json.loads(text)
|
||||||
self._mqtt.publish(topic, payload, qos=1)
|
self._mqtt.publish(topic, payload, qos=1)
|
||||||
self._log(f"[模拟] → {topic}")
|
self._log_send("[模拟]", topic, payload)
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
QMessageBox.warning(self, "JSON 错误", str(e))
|
QMessageBox.warning(self, "JSON 错误", str(e))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -585,7 +585,7 @@ class MainWindow(QMainWindow):
|
|||||||
else:
|
else:
|
||||||
payload = build_request(CMD_DEV_INFO_QUERY)
|
payload = build_request(CMD_DEV_INFO_QUERY)
|
||||||
self._mqtt.publish(topic, payload)
|
self._mqtt.publish(topic, payload)
|
||||||
self._log(f"[协议] → {topic}")
|
self._log_send("[协议]", topic, payload)
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
QMessageBox.warning(self, "JSON 错误", str(e))
|
QMessageBox.warning(self, "JSON 错误", str(e))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -687,7 +687,7 @@ class MainWindow(QMainWindow):
|
|||||||
payload = json.loads(raw) if raw else {}
|
payload = json.loads(raw) if raw else {}
|
||||||
qos = int(self._custom_qos.currentText())
|
qos = int(self._custom_qos.currentText())
|
||||||
self._mqtt.publish(topic, payload, qos=qos)
|
self._mqtt.publish(topic, payload, qos=qos)
|
||||||
self._log(f"[自定义] → {topic}")
|
self._log_send("[自定义]", topic, payload)
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
QMessageBox.warning(self, "JSON 错误", str(e))
|
QMessageBox.warning(self, "JSON 错误", str(e))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -775,7 +775,7 @@ class MainWindow(QMainWindow):
|
|||||||
code = payload.get("code", -1)
|
code = payload.get("code", -1)
|
||||||
pmsg = payload.get("msg", "")
|
pmsg = payload.get("msg", "")
|
||||||
data = payload.get("data", {})
|
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 code == 0:
|
||||||
if cmd == CMD_DEV_INFO_QUERY:
|
if cmd == CMD_DEV_INFO_QUERY:
|
||||||
self._devmgr.update_from_dev_info(dev_serial, data)
|
self._devmgr.update_from_dev_info(dev_serial, data)
|
||||||
@@ -789,20 +789,27 @@ class MainWindow(QMainWindow):
|
|||||||
data = payload.get("data", {})
|
data = payload.get("data", {})
|
||||||
self._devmgr.update_loop_data(dev_serial, data)
|
self._devmgr.update_loop_data(dev_serial, data)
|
||||||
chs = len(data.get("channels", []))
|
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))
|
self._append_text(self._loop_text, json.dumps(payload, indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
elif cmd == CMD_EVENT_REPORT:
|
elif cmd == CMD_EVENT_REPORT:
|
||||||
data = payload.get("data", {})
|
data = payload.get("data", {})
|
||||||
self._devmgr.update_event(dev_serial, data)
|
self._devmgr.update_event(dev_serial, data)
|
||||||
evt_count = len(data.get("events", []))
|
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))
|
self._append_text(self._event_text, json.dumps(payload, indent=2, ensure_ascii=False))
|
||||||
|
|
||||||
elif cmd == CMD_HEARTBEAT:
|
elif cmd == CMD_HEARTBEAT:
|
||||||
data = payload.get("data", {})
|
data = payload.get("data", {})
|
||||||
self._devmgr.update_heartbeat(dev_serial, 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 接收区
|
# 自定义订阅消息 → 显示到自定义 Topic 接收区
|
||||||
for sub_topic in self._custom_subs:
|
for sub_topic in self._custom_subs:
|
||||||
@@ -840,7 +847,10 @@ class MainWindow(QMainWindow):
|
|||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
mid = self._mqtt.send_command(sn, cmd, data)
|
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:
|
except Exception as e:
|
||||||
QMessageBox.critical(self, "发送失败", str(e))
|
QMessageBox.critical(self, "发送失败", str(e))
|
||||||
|
|
||||||
@@ -979,6 +989,24 @@ class MainWindow(QMainWindow):
|
|||||||
self._log_text.append(f"[{ts}] {msg}")
|
self._log_text.append(f"[{ts}] {msg}")
|
||||||
self._log_text.moveCursor(QTextCursor.End)
|
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():
|
def main():
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|||||||
Reference in New Issue
Block a user