73 lines
5.0 KiB
Markdown
73 lines
5.0 KiB
Markdown
# 修改记录 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 升级。
|