# 修改记录 2026-09-03:BLE 协议 V1.1 适配 设备协议升级到 `D:\caic-workspace\mothercup\docs\ble_protocol.md`(CAIIC BLE 通信协议 V1.1), APP 侧同步适配。差异与改动如下。 ## 协议差异(V1.0 → V1.1) - GATT 更换为 SDK rdtss 自定义 128-bit UUID:Service `00002760-08C2-11E1-9073-0E8AC72E1001`, 下行写特征(Write Without Response),上行 notify;广播名 `CAIIC-MCM-20260902`。 MTU=247 由设备连接后主动发起,手机端也可自行 requestMtu。 **注意**:协议文档表格中下行/上行 UUID 写作 `...C72EE001` / `...C72EE002`, 与固件 `app_rdtss.h` 实际值 `...C72E0001` / `...C72E0002` 不符,APP 以固件为准 (协议文档此处需修正)。 - 新增设备信息查询帧:`INFO_QUERY(0x20)` / `INFO_RSP(0x21)`,payload 为 TLV 序列 `{id u8, len u8, value…}×n`(数值小端)。信息项:0x01 FW_VERSION(u32)、 0x02 CHIP_TEMP(i16, 0.1℃, 0x7FFF=读取失败)、0x03 FAN_RPM(u16, 0xFFFF=无硬件)、 0x04 VDD_MV(u16, 0=失败)、0x05 UPTIME_S(u32)、0x06 FREE_HEAP(u32)。 空 payload 或单个 0xFF = 查询全部;设备不认识的 id 不出现在应答中。 - 帧格式(SOF 0xCA / CRC16-CCITT)、CLI 透传(0x01/0x02/0x03)、OTA(0x10/0x11/0x12/0x1F) 与 V1.0 一致,既有 `FrameCodec`/`McmChannel` CLI 通道/`OtaManager` 无需改动。 ## 修改文件 - `src/mcm/FrameCodec.uts` — 新增 `TYPE_INFO_QUERY=0x20` / `TYPE_INFO_RSP=0x21` 常量, 新增 `readU16LE` / `readI16LE`(i16 处理符号位)解包工具。 - `src/mcm/McmChannel.uts` — 新增 INFO_QUERY 请求-响应通道:`queryInfo(items, timeoutMs)` 串行执行(infoChain),单 pending infoJob,超时/发送失败/断连 resolve null; `dispatchFrame` 分发 INFO_RSP;`resetChannel` 清理挂起的信息查询。 **修复 notify 数据解析**:插件 `onNotityReadBleData` 数据回调(type=0)的 `res.data` 是 `NotityData` 结构(`{data: number[], mac, serviceId, characteristicsId}`), 此前按裸 `number[]` 解析导致设备应答字节永远进不了帧重组器,表现为 "写入成功但 help 无应答(status=-1)"。 CLI 命令**不追加** `\r\n`:固件 `app_ble_proto.c` 把 CLI_REQ payload 直接交给 `cli_exec_line`(只按空格/Tab 分词),尾随 `\r\n` 会被当作命令名一部分导致 unknown command(曾按"行编辑器需要结束符"的假设加过,查固件源码后撤销)。 - `src/BluetoothManager.uts` — 新增 `MCM_SERVICE_UUID` / `MCM_WRITE_UUID` / `MCM_NOTIFY_UUID` 常量(取固件 `app_rdtss.h` 实际值,小写); `sendDataBytes` 与 `onNotityReadBleData` 改用显式 UUID,不再依赖插件的 service/notify/write 自动识别(下行特征只有 Write Without Response 属性, 自动识别的写特征可能为空,表现为"发送 help 无应答")。 notify 订阅从旧接口 `onNotityReadBleData` 换成插件推荐的 `onNotityBleData` (旧接口已标记弃用,数据统一走 `NotityData` 结构)。 - `App.uvue` — `setBleNotity()` 改用 `Ble.MCM_SERVICE_UUID` / `Ble.MCM_NOTIFY_UUID` 显式订阅 notify;`ConnectBle()` 移除 `selectService(...)` 调用(已不再需要)。 - 调试日志:BLE 收发全链路加了 `[MCM]` 前缀的 console 打印——`McmChannel` 的 TX 帧(完整 hex)、写入失败、RX notify 原始字节、RX 重组帧; `App.uvue` 的 connect/scanServices/notify 订阅结果。真机调试时在 HBuilderX 控制台可直接观察报文流。 - `src/mcm/McmInfo.uts`(新增)— 信息项 id 常量、`parseTlv`(未知 id 按 len 跳过、 长度不符项忽略、0x7FFF/0xFFFF/0 等无效值归一为 null)、`DeviceInfo` 类型、 `queryDeviceInfo(items)`(空数组=查全部)、`formatVersion`(u32 → "V1.00.01")。 - `src/mcm/McmCommands.uts` — `getTemperature`/`getFanSpeed`/`getVersion` 改走 INFO_QUERY(函数签名不变);废弃未实现的 CLI `temp`/`fan`/`version` 命令常量; `getSysInfo`/`getBankInfo`/`execCli` 保持 CLI 透传不变。 - `pages/tabbar/home.uvue` — 扫描过滤前缀更新为 `CAIIC-MCM-20260902`; 参数轮询合并为一次 `queryDeviceInfo([CHIP_TEMP, FAN_RPM])`(温度显示 1 位小数, 风扇无硬件显示 `N/A`)。 ## 未改动 - `src/mcm/OtaManager.uts`:OTA 流程与 V1.1 第 6 节一致(BEGIN→DATA 扇区级 ack 流控→END 整镜像 CRC32 校验,status=2 按应答 offset 重同步)。 - `pages/tabbar/sysStatus.uvue` / `pages/tabbar/ota.uvue` / CLI 调试终端: 调用的 `McmCommands` API 签名不变,无需修改。 ## 验证 - 用 Node 脚本按协议 8.2 节参考实现复算 8.3 节全部字节级示例(CLI_REQ "help"、 INFO_QUERY 查全部/温度+风扇、OTA_BEGIN/OTA_DATA/OTA_END),与 `encodeFrame`/CRC16 输出逐字节一致;INFO_RSP 样例(26.6℃ + 无风扇)经 `parseTlv` 解析结果正确。 - 真机回归(HBuilderX 编译):扫描连接 `CAIIC-MCM-20260902`、主页温度/风扇显示、 系统状态页、CLI 终端、本地 bin OTA 升级。