# 修改记录 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 `,按 "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。