mothercup/SmartAssiter/docs/修改记录_2026-09-03_BLE协议V1.1适配.md
2026-09-04 08:56:15 +08:00

73 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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