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