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

4.2 KiB
Raw Blame History

修改记录 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。