# 修改记录 2026-09-02:母乳杯(CAIIC-MCM)蓝牙改造 将原充电桩 App 改造为母乳杯设备 App:通过蓝牙显示设备参数(温度、风扇转速)、 查询设备系统运行状态、本地固件文件经 BLE OTA 升级设备。 设备协议依据 `D:\caic-workspace\mothercup\mcm-ddc-04\docs\ble_protocol.md`(CAIIC BLE 通信协议 V1.0)。 ## 协议要点(设备侧已实现) - GATT:Service `0000CA10-CA11-4B11-8000-CA11CA11CA11`,下行写特征 `...CA11...` (**仅 Write Without Response**),上行 notify `...CA12...`;广播名 `CAIIC-MCM`;建议 MTU=247。 - 二进制帧(小端):`[0xCA, TYPE, SEQ, LEN(u16), PAYLOAD, CRC16-CCITT(0x1021/初值0xFFFF)]`, 开销 7 字节,payload ≤480;一帧可跨多次 BLE 写入,设备按字节流重组。 - 帧类型:0x01 CLI_REQ / 0x02 CLI_RSP / 0x03 CLI_RSP_END;0x10 OTA_BEGIN / 0x11 OTA_DATA / 0x12 OTA_END / 0x1F OTA_RSP。 - OTA:双 bank 直写,设备 4KB 扇区缓冲,满扇区回 OTA_RSP(0x11) 作流控;status=2 按应答 offset 重发重同步;OTA_END 整镜像 CRC32(zlib/IEEE)校验通过后设备 200ms 自动复位切 bank。 ## 新增文件 - `src/mcm/Crc.uts` — CRC16-CCITT 与 CRC32-IEEE(zlib)实现。注意 uts number 位运算按 32 位有符号处理,CRC32 中间值保持在 Int 范围、无符号右移用 `(x>>1)&0x7FFFFFFF`, 多项式用补码字面量 `-306674912`(0xEDB88320)。 - `src/mcm/FrameCodec.uts` — 帧常量、`encodeFrame` 组帧、`FrameDecoder` 字节流重组 (找 SOF → 头 → payload+CRC,错帧静默丢弃重找)、`pushU32LE/readU32LE`(纯算术实现, 避免大数值位运算符号问题)。 - `src/mcm/McmChannel.uts` — 连接级单例通道:`attach()` 挂全局 `bleData/bleState` 事件; `sendFrame` 写队列串行化、整帧按 (att_mtu-3) 切片、写类型 WRITE_NO_RESPONSE; `sendCli` CLI 命令透传串行执行(聚合 CLI_RSP 至 CLI_RSP_END,超时/断开兜底); OTA_RSP 转发给 OtaManager。所有 Promise 只 resolve 不 reject。 - `src/mcm/McmCommands.uts` — 业务命令:version/sysinfo/bankinfo/temp/fan, 命令名集中在顶部常量。**温度/风扇命令(默认 temp/fan)固件尚未实现,解析失败页面显示 `--`**。 - `src/mcm/OtaManager.uts` — OTA 状态机:BEGIN→按 4KB 扇区发 DATA 等 ack(流控/重同步)→END; 断连或 `abort()` 协作式中止;进度/状态回调。 - `pages/tabbar/sysStatus.uvue` — 系统状态页:version/bankinfo 概要 + sysinfo 原文控制台 (运行时间/任务数/heap/任务表),下拉刷新。 - `pages/tabbar/ota.uvue` — 固件升级页:手动输入本地 bin 路径(默认 `/sdcard/Download/embeddedSrc.bin`),UTS 直调 Android `java.io.File/FileInputStream` 读文件(`#ifdef APP-ANDROID`);显示大小与 CRC32;输入目标版本号(如 1.00.02→0x010002); 进度条 + 日志;升级期间禁止断连/退出,离开页面自动中止。 ## 修改文件 - `src/BluetoothManager.uts` — 新增 `sendDataBytes(data, writeType, cb)`(显式写类型, 设备下行特征必须 writeType=1)与 `selectService(uuidPrefix)`(按服务 UUID 前缀 `0000CA10` 选择 service+notify+write 组合,规避自动识别选错)。 - `App.uvue` — `ConnectBle()` 在 scanServices 后先 `selectService("0000CA10")` 再订阅 notify; `onLaunch` 调 `McmChannel.attach()`。 - `pages/tabbar/home.uvue` — 重写为设备主页:扫描(过滤 CAIIC-MCM)/连接/断开; 连接后温度、风扇转速每 2s 轮询显示,固件版本与运行 Bank 展示;notify 订阅成功 (bleData type=1000)后协商 MTU=247。 - `pages/tabbar/my.uvue` — 删除充电/离线行为入口(原已注释),启用"CLI 调试终端"入口。 - `pages/bleTest/bluetoothOperation.uvue` — 重写为 CLI 调试终端:inline 命令输入 + 应答文本流展示,复用全局 ConnectBle 连接流程。 - `pages.json` — tabbar 改为 设备/状态/升级/my 四 tab(图标复用 static/tabbar 现有资源); 移除 charge/order 及全部充电页面注册。 - `manifest.json` — 应用名改为"母乳杯助手";iOS 蓝牙用途文案改为母乳杯描述。 - `api/requestApi.uts` — 仅保留用户类接口(登录/注册/pinCode/修改资料),删除全部 OCPP 充电与蓝牙绑定分享接口。 - `api/responseData.uts` — 仅保留用户类响应类型。 ## 删除 - 目录:`pages/startCharge/`、`pages/stopCharge/`、`pages/orderDetails/`、 `pages/offlineBehavior/`、`pages/tabbar/charge.uvue`、`pages/tabbar/order.uvue`、 `src/espBlufi/`(充电桩 JSON 分片协议,与 CAIIC 二进制帧协议不兼容)。 ## 遗留事项 - **固件需新增温度/风扇 CLI 命令**(设备仓库 `D:\caic-workspace\mothercup`, 在 `cli_core.c` 命令表注册;当前 APP 侧默认命令名 `temp`/`fan`,定名不同改 `McmCommands.uts` 顶部常量即可)。 - **云端固件接口未接入**:本期为本地 bin 文件升级;`api/httpInstance.uts`($http/token/ 服务器切换)保留,后续按约定接口(查询最新版本 + 下载 URL)接入 ota 页。 - uni-app x 无 CLI 构建手段,需在 HBuilderX 编译并真机(Android)验证: version/sysinfo/bankinfo 显示、temp/fan(待固件)、本地 bin OTA 后 bankinfo 确认切 bank。 - OTA 大数据量发送走 Write Without Response + 扇区级 ack 流控,若实测丢包导致 status=2 重同步频繁,可在 OtaManager 扇区内加小窗口节流。