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

5.0 KiB
Raw Blame History

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