5.0 KiB
5.0 KiB
修改记录 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/McmChannelCLI 通道/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(函数签名不变);废弃未实现的 CLItemp/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 调试终端: 调用的McmCommandsAPI 签名不变,无需修改。
验证
- 用 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 升级。