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