mothercup/SmartAssiter/docs/修改记录_2026-09-04_App适配固件V1.00.23协议_CLI参数与OTA恢复.md
evan.liu 3e87d333cb App: adapt to firmware V1.00.23 BLE protocol + field debugging fixes
- BluetoothManager: per-characteristic isolated channels (per-UUID read
  queue/timeout/dispatch, no cross-char write blocking), 10007 delayed
  retry for read/write, 300ms link settle after discovery, full tx/rx
  hex logging
- McmCli/McmInfo/McmOta: command/response, TLV parse and OTA frame logs
- home.vue: Auto refresh switch (polling off by default, no GATT
  interference with OTA), MTU-then-load sequencing
- ota.vue: SAF file picker via plus.android (ACTION_GET_CONTENT) with
  Scanner whole-stream read + magic self-check + per-byte fallback;
  default path moved to _doc (Android 10+ scoped storage)
- docs: change logs for 2026-09-04 protocol adaptation and 2026-09-05
  field debugging; AGENTS.md updated
2026-09-05 06:45:04 +08:00

84 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 修改记录 2026-09-04:App 适配固件 V1.00.23 协议(CLI/devinfo/参数/OTA 恢复)
## 背景
固件 V1.00.19~V1.00.23 期间 BLE 协议定型(docs/ble_protocol.md V1.1,§6.5/§6.6):
- CLI 读写特征 `...e0003`:写命令行 → 分包读回(0 长度包=结束)——App 已有
- 只读参数特征 `...e0004`:TLV 全项,**V1.00.16 起新增 0x07 CUR_BANK**(当前运行 bank)
- OTA 特征 `...e0005`(V1.00.19 起):写 0xCA 传输帧 → 读回 OTA_RSP(轮询至非空),
逐帧锁步 + 丢帧重发 + BAD_STATE 再同步;END 后设备延迟复位保证应答送达
- 升级包:`mothercup_ble_ota.bin` 单文件(52B 头 + bank1/bank2 双载荷,头带版本/CRC)
本次 App 改造按此协议补齐 CLI/devinfo/sysinfo/参数读写/OTA。
## 改动清单
### src/BluetoothManager.ts
- 新增 `MCM_OTA_UUID`(...e0005);`scanServices` 特征校验加入 OTA 特征
(缺任一特征报 10005)
- 写接口重构为通用 `writeChar(charId, data, cb)`,`writeCliChar`/`writeOtaChar`
均为其封装(write-with-response)
- 新增 MTU 跟踪:`setMtu` 成功记录实际值,`getMtu()` 供 OTA 计算帧长
(`min(mtu-3-11, 222)`);断连/新连接重置为 23。**注意:部分机型
setBLEMTU 成功回调不带 mtu 字段**(实测日志 "mtu undefined"),此时按
请求值记录;McmOta 侧另有 NaN 防线(异常时按 222 分块)
- 头注释更新为当前 GATT 接口实况
### src/mcm/McmInfo.ts
- 新增信息项 `INFO_CUR_BANK = 0x07`(u8,1=APP1 2=APP2),`DeviceInfo` 加
`curBank` 字段
### src/mcm/McmOta.ts(新建)
- `crc32`(IEEE,同 zlib)/ `crc16`(CCITT 0x1021/0xFFFF,同固件)
- `parseCombo()`:解析校验 mothercup_ble_ota.bin(magic/hdr_len/count/
hdr_crc/total_size/payload_crc/逐 bank crc)
- `checkBlobBank()`:传输前预检载荷向量表 Reset PC 落在目标 bank(防选错包)
- `runOta()`:BEGIN→DATA*→END 锁步;每帧写 e0005 后 20ms 轮询读 RSP(2s 超时);
超时重发 ≤3 次;BAD_STATE 再同步(重复 BEGIN=会话已建、重复 DATA offset 等于
本帧结束位置=ack 丢失视为成功);`abortOta()` 中止(发 OTA_ABORT);
END 的传输级失败(超时/断连)不当失败——设备可能已复位,由回连复核定论
- `formatVersion()`:0x00010017 → "V1.00.23"
### src/mcm/McmCommands.ts
- 删除 `getBankInfo()`(固件并无 `bankinfo` 命令,历史遗留 bug,一直返回
"unknown command");bank 改由 `getCurBank()`(TLV 0x07)提供
- 新增 `getDevInfo()`(TLV 全项)、`getDevInfoText()`(devinfo 原文)
- 新增 APP_DATA 参数读写:`getAppParams()`(`appget json` 解析)、
`setAppParam(key, val)`(`appset <led|pwm> <val>`,按 "saved" 判成功)
### pages/tabbar/ota.vue(重做,恢复升级功能)
- 默认路径 `/sdcard/Download/mothercup_ble_ota.bin`,plus.io 读本地文件
(沿用旧版方式)
- Load Package:解析+校验包,按 CUR_BANK 自动选对侧载荷,向量表预检,
显示包版本/双 bank 大小/目标 bank
- Start Upgrade:进度条 + 字节数 + 每帧 rtt + 重传计数;Abort 按钮;
全程日志卡
- END 后:等设备复位断连(≤10s,未断则主动断开)→ 回连(失败重试 5 次)→
复核 curBank==目标 && fwVersion==包版本 → PASS/FAIL 日志+toast
### pages/tabbar/home.vue
- 参数轮询扩展为 devinfo 全项:温度/电压/风扇 + bank/uptime/堆剩余
- bank 改从 TLV CUR_BANK 读取(不再调不存在的 bankinfo 命令)
- 新增 Params 卡:LED 闪烁半周期(ms) 与 PWM 占空比(%) 的读取与设置
(appget json / appset),显示记录 valid 状态
- Scan 按钮补齐静默失败反馈:蓝牙未开/无权限时 toast 提示(原代码
openBluetooth 失败回调为空,点了毫无反应)
## 验证
- TS 模块(BluetoothManager/McmCli/McmInfo/McmCommands/McmOta)经 tsc
--noEmit 语法校验通过
- 实机验证需在 HBuilderX 运行到手机:连接设备 → home 页参数/devinfo/参数
读写 → ota 页选包升级 → 复核 PASS
## 依赖
固件 ≥ V1.00.19(e0005 OTA 特征);当前基线 V1.00.23。