- 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
84 lines
4.2 KiB
Markdown
84 lines
4.2 KiB
Markdown
# 修改记录 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。
|