From a5ac54a2bff3d61c00b7fd809c11097ee561e544 Mon Sep 17 00:00:00 2001 From: wangfq Date: Thu, 23 Jul 2026 18:36:40 +0800 Subject: [PATCH] =?UTF-8?q?docs(vd960DBN):=20=E5=BC=80=E5=8F=91=E6=97=A5?= =?UTF-8?q?=E5=BF=97=20V3.5=20=E2=80=94=20=E4=BF=9D=E6=B4=BB=E7=B2=BE?= =?UTF-8?q?=E7=AE=80=20+=20SocketSend=20=E6=95=85=E9=9A=9C=E6=81=A2?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vd960DBN/docs/devlog.md | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/vd960DBN/docs/devlog.md b/vd960DBN/docs/devlog.md index 5bb796e..e092256 100644 --- a/vd960DBN/docs/devlog.md +++ b/vd960DBN/docs/devlog.md @@ -578,6 +578,53 @@ initialize → iot_mqtt_publish() → buf[1024] 所有发布点用 `g_iot_msg_id + 1` 预读, `iot_mqtt_publish` 内部 `++g_iot_msg_id` (MQTT pktid for QoS>0, 对QoS=0 也递增以保持一致)。 +--- + +## 2026-07-23 — 保活精简 + SocketSend 故障恢复 + +### 保活机制梳理 + +heartbeat JSON (60s 单向设备上报) 与 MQTT PINGREQ/PINGRESP 功能重叠: +- heartbeat 是设备→平台单向, 平台不回复, 不能做存活检测 +- MQTT PINGREQ/PINGRESP 才是双向保活, broker 不回 → TCP 超时 + +**决策**: 删除 heartbeat JSON, MQTT PINGREQ 独立保活; +loop_data 按 `g_report_cfg.interval` 上报即可。 + +### 三层保活链路 + +| 层级 | 机制 | 超时 | 触发 | +|------|------|------|------| +| MQTT | PINGREQ/PINGRESP (60s) | broker无响应→TCP超时 | `SINT_STAT_TIM_OUT` | +| TCP | KeepAlive | WCHNET 检测 | `SINT_STAT_DISCONNECT` | +| 硬件 | IWDG (4s, LSI) | 主循环卡死 | 硬件复位 | + +### SocketSend 故障快速恢复 + +**问题**: WCHNET_SocketSend 突然返回 `ret=0x11 sent=0`, +TCP 超时要等 ~2 分钟才触发 `SINT_STAT_TIM_OUT`, +期间所有 loop_data/event_report 全丢。 + +**修复 v1** — 连续失败检测 (7c0de6c): +- `_iot_send_fail_cnt` 追踪连续失败次数 +- 3 次连续失败 → 主动 `WCHNET_SocketClose` + `DISCONNECTED` → 重连 +- 任一次成功清零, 新连接也清零 + +**修复 v2** — 重连时重建 socket (98d9b99): +- `iot_connect_broker()` 原只设 `g_iot_socket = SocketId_TCP` + 但 close 后 socket 已销毁 → TCP connect 一直超时 +- 改为调 `WCHNET_CreateTcpMqttSocket()` 真正 create + connect +- 断连后加 3s 延迟再重连, 给 WCHNET 清理时间 + +### BSS 变动 + +| 变量 | 改动 | ΔBSS | +|------|------|------| +| `data_json[1024]` | 删除 (v1) | -1024B | +| `iot_send_heartbeat::payload[512]` | 删除 (函数移除) | -512B | +| `_iot_send_fail_cnt` | 新增 | +4B | +| **净省** | | **-1532B** | + ---| | 消灭 `data_json[1024]` | 直接在 `payload[1400]` 构建完整 JSON, 省 1024B BSS | | 消除 `%s` 拷贝 | 不再从中间缓冲格式化到 payload, 杜绝尾部二进制残留路径 | @@ -590,6 +637,7 @@ initialize → iot_mqtt_publish() → buf[1024] ## 修订记录 | 版本 | 时间 | 说明 | +| V3.5 | 2026-07-23 | 保活精简(去heartbeat+IWDG) + SocketSend故障恢复(3次失败重连+重建socket) | | V3.4 | 2026-07-23 | MQTT 栈重构: 发送缓冲隔离/命令处理/msg_id统一/看门狗, 共10项修复 | | V3.3 | 2026-07-23 | loop_data: 消灭 data_json[1024] BSS 缓冲 + coil_count 硬限, 防 mqttBuf 重叠致 _raw 异常 | |------|------|------|