63 lines
4.1 KiB
Markdown
63 lines
4.1 KiB
Markdown
# 修改记录 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)待烧录固件后进行。
|