feat(vd960DBN): BLE 读取脱机日志 — OFFLOG_STAT/QUERY/CLEAR (0x25/0x26/0x27)
蓝牙通道补齐脱机日志读取 (此前仅 MQTT V1.06 / TCP JSON V1.02 有 log_* 命令): - 3 条 BLE 命令, 语义对齐 MQTT log_stat/log_query/log_clear - QUERY 直接传 32B OfflogEvt 原始结构 (二进制协议, 无需 JSON), 复用 idx = start_seq - seq_first 定位, 不新增 offlog API - 缓冲扩容: MAX_BLE_TMP_BUF_LEN 100→132, 新增 MAX_BLE_DAT_BUF_LEN=132 (QUERY 响应 1+4x32B=129B), clear_buf_dbn_ble_all memset 同步 - 新协议文档 docs/DLD960_BLE协议.md V1.00 (帧格式+分包+命令+记录结构) - 隔离测试 test_ble_offlog.c 嵌入源文件 3 case 真实文本, 7 例全过; offlog 回归 8 例 ALL PASS - devlog V4.0; README 协议矩阵补 BLE 行
This commit is contained in:
@@ -6,6 +6,54 @@
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-10 — BLE 读取脱机日志接口 (OFFLOG_STAT/QUERY/CLEAR)
|
||||
|
||||
### 背景
|
||||
|
||||
offlog 日志已落地 MQTT V1.06 / TCP JSON V1.02 分发(2026-08-05),但 BLE 侧(小程序/APP 现场离线取证)无读取通道。现场常见场景:设备无网/断网,需蓝牙直连拉日志判断"重复上线"是平台问题还是设备复位。
|
||||
|
||||
### 方案:3 条 BLE 命令,复用 offlog 底层 API
|
||||
|
||||
| 命令码 | 名称 | 语义(对齐 MQTT log_*) |
|
||||
|--------|------|--------------------------|
|
||||
| `0x25` | `CMD_DBN_OFFLOG_STAT` | 日志统计:status + boot_seq(2) + count(4) + capacity(4) + seq_first(4) + seq_last(4),全 LE,19B |
|
||||
| `0x26` | `CMD_DBN_OFFLOG_QUERY` | 分页拉取:请求 `start_seq(LE32) + count(1)`;响应 `status(1) + count(1) + N×32B OfflogEvt 原始结构`,N≤4(对齐 OFFLOG_MAX_QUERY_RECORDS) |
|
||||
| `0x27` | `CMD_DBN_OFFLOG_CLEAR` | 清空(审计留痕),阻塞 ~2.8s,主循环上下文可接受 |
|
||||
|
||||
- QUERY 定位复用 MQTT 同款公式 `idx = start_seq - seq_first` → `offlog_read_idx()`,不新增 offlog API
|
||||
- 记录直接传 32B 二进制 OfflogEvt(BLE 是二进制协议,无需 JSON 化;文档给出结构偏移 + 事件类型表)
|
||||
- 响应超 96B 自动分包(`set_response_buf` 既有机制):QUERY 最大 130B → 2 包
|
||||
|
||||
### 缓冲扩容(RAM +64B)
|
||||
|
||||
| 宏 | 旧值 | 新值 | 原因 |
|
||||
|----|------|------|------|
|
||||
| `MAX_BLE_TMP_BUF_LEN` | `BLE_BUFF_MAX_LEN`(100) | **132** | QUERY 组包 1+4×32=129B |
|
||||
| `Buf_DBN_BLE.dat` | `MAX_BLE_BUF_LEN`(100) | **`MAX_BLE_DAT_BUF_LEN`(132)** | set_response_buf 拷贝 129B |
|
||||
|
||||
新增 `MAX_BLE_DAT_BUF_LEN=132`;`clear_buf_dbn_ble_all` 的 memset 同步改用新宏。`tmp_ble_buf`/`Buf_DBN_BLE` 仅 dbn_ble_srv.c/h 内使用,影响面局部。
|
||||
|
||||
### 关键决策与坑
|
||||
|
||||
1. **GBK+CRLF 文件二进制编辑**:dbn_ble_srv.c/h 是 GBK 编码(file 报 ISO-8859),`patch` 工具会静默转码成 UTF-8 致中文注释乱码。全部用 Python rb/wb 精确替换,每处 count==1 校验;改后 file 复核仍 ISO-8859。新增注释用 ASCII 规避编码问题。
|
||||
2. **case 内变量名冲突**:`manage_dbn_ble_default` 顶部已有 `uint8_t i = 0, k = 0`,case 内再声明 `i` 会 redefinition。全部改用 `_i`/`_j`。
|
||||
3. **QUERY 短帧防御**:`len < 11`(magic+header+len+cmd+5data+2ckb)返回 status=0x02,防 pkg[4..8] 越界读。
|
||||
4. **LOG_CLEAR 阻塞告警**:BLE 连接期间 2.8s 擦除阻塞,若 MQTT 在线会导致 WCHNET 短时失服务(60s keepalive 可吸收),文档已标注。
|
||||
5. **编码验证**:check_c_balance.py 自身 docstring 有转义 bug(`\\x` 在普通字符串触发 unicodeescape),已改 raw string 修复。
|
||||
|
||||
### 验证
|
||||
|
||||
- 新增 `tests/test_ble_offlog.c`:**隔离测试框架嵌入 dbn_ble_srv.c 提取的 3 case 真实文本**(`extract_offlog_cases.py` 提取,生成物 gitignore),mock offlog_* + set_response_buf,7 例全过:
|
||||
- STAT 正常(19B 字段逐字节验证)/ disabled
|
||||
- QUERY 正常(4×32B 记录 + seq/type/payload 偏移验证)/ 越界空 / 短帧 / disabled
|
||||
- CLEAR 正常
|
||||
- offlog 回归 8 例 ALL PASS(既有 7 例 + export_json 未破坏)
|
||||
- 新增 `docs/DLD960_BLE协议.md` V1.00(帧格式 + 分包 + 3 命令 + OfflogEvt 32B 结构 + 事件类型表)
|
||||
- README 协议文档表新增 BLE 协议行
|
||||
- 本地无 RISC-V 工具链,MRS 真编译待板上联调(语法级 check_c_balance 通过)
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-05 — offlog 协议导出命令分发落地 (MQTT V1.06 + TCP JSON V1.02)
|
||||
|
||||
### 背景
|
||||
@@ -756,6 +804,7 @@ TCP 超时要等 ~2 分钟才触发 `SINT_STAT_TIM_OUT`,
|
||||
|
||||
| 版本 | 时间 | 说明 |
|
||||
|------|------|------|
|
||||
| V4.0 | 2026-08-10 | BLE 脱机日志接口: OFFLOG_STAT/QUERY/CLEAR (0x25/0x26/0x27), 32B OfflogEvt 二进制直传, 缓冲扩容 132B, 隔离测试 7 例 + 协议文档 V1.00 |
|
||||
| V3.9 | 2026-08-05 | offlog 协议导出命令分发: log_stat/log_query/log_clear 落地 MQTT V1.06 + TCP JSON V1.02 (seq_first/seq_last 计算、idx 映射、OFFLOG_MAX_QUERY_RECORDS=4、log_clear 阻塞~2.8s) |
|
||||
| V3.8 | 2026-08-04 | offlog: TIME_ANCHOR 严格用平台下发 unix_ts (offlog_evt_ts), 单测 7 例 |
|
||||
| V3.7 | 2026-08-04 | tcp_json_srv 缓冲宏化: data_json[2048]→TCP_JSON_DATA_BUF_LEN(1024), 省栈1KB×3 |
|
||||
|
||||
Reference in New Issue
Block a user