mothercup/SmartAssiter/docs/修改记录_2026-09-04_App去notify重设计.md

63 lines
4.1 KiB
Markdown
Raw 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-04:App 去 notify 重设计(读写特征方式)
背景:固件 mcm-ddc-ble V1.00.08 起 notify 上行链路不通(帧协议 CLI/INFO_QUERY/OTA
应答收不到,下行写入正常),固件已新增两条绕开 notify 的 GATT 接口。本次 App
(SmartAssiter)整体切换到新接口,**彻底删除旧的 notify/帧协议代码**。
## 固件当前可用接口(不再使用 ...c72e0001 下行帧 / ...c72e0002 notify)
- CLI 读写特征 `00002760-08c2-11e1-9073-0e8ac72e0003`(RD + WRITE_REQ):
写原始命令行(≤63B,write-with-response,固件在写回调里同步执行)→
读同一特征取回输出文本(≤512B,单读实际上限 mtu-1,连接后协商 MTU 247)。
无输出的成功命令回 `ok\r\n`;未知命令/超长行回 `unknown command\r\n`。
- 只读参数特征 `00002760-08c2-11e1-9073-0e8ac72e0004`(RD):
读出全部信息项 TLV,同 INFO_RSP(all)。信息项 id 不变
(0x01 FW_VERSION / 0x02 CHIP_TEMP / 0x03 FAN_RPM / 0x04 VDD_MV /
0x05 UPTIME_S / 0x06 FREE_HEAP)。
## 通信层改动
- `src/BluetoothManager.ts` 重写:
- 删除 notify 订阅(`onNotityReadBleData`)、帧协议写(`sendDataBytes`)、
`MCM_WRITE_UUID`/`MCM_NOTIFY_UUID`/`NotityData`,以及空实现兼容残留
(`connectTimeout`/`setBtAutoConnectTime`/`cancelAutoConnectBt`/`OpenStateListener`)。
- 新增 `writeCliChar(data, cb)`(CLI 特征 write-with-response)与通用
`readChar(charId, cb)`:读结果经 `onBLECharacteristicValueChange` 回传,
内部读队列串行执行、3s 超时、断连时全部置失败;`readInfoChar` 保留为
`readChar(MCM_INFO_UUID)` 的便捷封装。
- `scanServices` 增加 CLI/INFO 特征存在性校验(缺失报 10005)。
- `bleState` 事件语义不变(0=连接就绪 10000=失败 10001=断开),
**0 现在即"连接可用"信号**(原为 notify 订阅成功的 bleData type=1000)。
- `src/mcm/` 重构:
- **删除** `FrameCodec.ts`(帧编解码)、`McmChannel.ts`(notify 帧通道)、
`OtaManager.ts`(OTA 状态机)、`Crc.ts`(CRC16/32)。
- 新增 `McmCli.ts`:`execCli(cmd, timeoutMs)` 写命令→读应答,Promise 链串行;
`CliResult{ text, status }`(0=ok 1=未知命令/超长 -1=超时 -2=本地超长 -3=写失败 -4=未连接)。
- `McmCommands.ts` 重写:getVersion 改走 `readDeviceInfo` 的 FW_VERSION 项;
getSysInfo/getBankInfo/execCli 走 `McmCli`;删除无调用方的
getTemperature/getFanSpeed。
- `McmInfo.ts`:删除 `queryDeviceInfo`(INFO_QUERY 帧路径),
LE 读取 helper 内聚到本文件,保留 `parseTlv`/`readDeviceInfo`/`formatVersion`。
- `App.vue`:删除 `setBleNotity` 与 `bleData` 事件转发、`McmChannel.attach()`;
`ConnectBle` = connect → scanServices(含特征校验)→ `$emit("bleState", 0)`。
## 页面适配
- `home.vue`(Device):连接就绪信号从 bleData type=1000 改为 bleState 0
(onConnectedReady:setMtu 247 → 加载版本/bank/sysinfo → 启动 2s 参数轮询)。
轮询仍走 `readDeviceInfo`(读参数特征),逻辑不变。
- `bleTest/bluetoothOperation.vue`(CLI tab):同上切换就绪信号;
发命令走 `McmCmd.execCli`(写 CLI 特征 + 读应答),输入输出路径不变。
- `ota.vue`:**OTA 暂停用**——当前固件 OTA 应答依赖 notify(链路不通),
页面改为显示当前固件/bank 信息 + 中英文停用说明,待固件修复后恢复。
## 遗留与注意
- CLI 应答单次读上限 = mtu-1:MTU 247 协商失败时(iOS/部分机型)长输出
(如 help/sysinfo 全文)会被截断到 19B,属已知限制。
- 命令行 >20B 时同样依赖 MTU 247 协商成功(ATT 写不可分割)。
- 旧帧协议/notify 代码已彻底删除;固件修好 notify 后如需恢复 OTA,
参考 git 历史中的 OtaManager/McmChannel。
- 验证:esbuild 语法检查全部通过(src/mcm 4 文件 + 4 个 .vue script 块);
真机回归(连接、温度/风扇轮询、CLI 终端 help/sysinfo/led)待烧录固件后进行。