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

4.1 KiB
Raw Permalink Blame History

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