SmartAssiter-Discard/docs/修改记录_2026-09-02_母乳杯蓝牙改造.md

6.5 KiB
Raw Permalink Blame History

修改记录 2026-09-02:母乳杯(CAIIC-MCM)蓝牙改造

将原充电桩 App 改造为母乳杯设备 App:通过蓝牙显示设备参数(温度、风扇转速)、 查询设备系统运行状态、本地固件文件经 BLE OTA 升级设备。 设备协议依据 D:\caic-workspace\mothercup\mcm-ddc-04\docs\ble_protocol.md(CAIIC BLE 通信协议 V1.0)。

协议要点(设备侧已实现)

  • GATT:Service 0000CA10-CA11-4B11-8000-CA11CA11CA11,下行写特征 ...CA11... (仅 Write Without Response),上行 notify ...CA12...;广播名 CAIIC-MCM;建议 MTU=247。
  • 二进制帧(小端):[0xCA, TYPE, SEQ, LEN(u16), PAYLOAD, CRC16-CCITT(0x1021/初值0xFFFF)], 开销 7 字节,payload ≤480;一帧可跨多次 BLE 写入,设备按字节流重组。
  • 帧类型:0x01 CLI_REQ / 0x02 CLI_RSP / 0x03 CLI_RSP_END;0x10 OTA_BEGIN / 0x11 OTA_DATA / 0x12 OTA_END / 0x1F OTA_RSP。
  • OTA:双 bank 直写,设备 4KB 扇区缓冲,满扇区回 OTA_RSP(0x11) 作流控;status=2 按应答 offset 重发重同步;OTA_END 整镜像 CRC32(zlib/IEEE)校验通过后设备 200ms 自动复位切 bank。

新增文件

  • src/mcm/Crc.uts — CRC16-CCITT 与 CRC32-IEEE(zlib)实现。注意 uts number 位运算按 32 位有符号处理,CRC32 中间值保持在 Int 范围、无符号右移用 (x>>1)&0x7FFFFFFF, 多项式用补码字面量 -306674912(0xEDB88320)。
  • src/mcm/FrameCodec.uts — 帧常量、encodeFrame 组帧、FrameDecoder 字节流重组 (找 SOF → 头 → payload+CRC,错帧静默丢弃重找)、pushU32LE/readU32LE(纯算术实现, 避免大数值位运算符号问题)。
  • src/mcm/McmChannel.uts — 连接级单例通道:attach() 挂全局 bleData/bleState 事件; sendFrame 写队列串行化、整帧按 (att_mtu-3) 切片、写类型 WRITE_NO_RESPONSE; sendCli CLI 命令透传串行执行(聚合 CLI_RSP 至 CLI_RSP_END,超时/断开兜底); OTA_RSP 转发给 OtaManager。所有 Promise 只 resolve 不 reject。
  • src/mcm/McmCommands.uts — 业务命令:version/sysinfo/bankinfo/temp/fan, 命令名集中在顶部常量。温度/风扇命令(默认 temp/fan)固件尚未实现,解析失败页面显示 --。
  • src/mcm/OtaManager.uts — OTA 状态机:BEGIN→按 4KB 扇区发 DATA 等 ack(流控/重同步)→END; 断连或 abort() 协作式中止;进度/状态回调。
  • pages/tabbar/sysStatus.uvue — 系统状态页:version/bankinfo 概要 + sysinfo 原文控制台 (运行时间/任务数/heap/任务表),下拉刷新。
  • pages/tabbar/ota.uvue — 固件升级页:手动输入本地 bin 路径(默认 /sdcard/Download/embeddedSrc.bin),UTS 直调 Android java.io.File/FileInputStream 读文件(#ifdef APP-ANDROID);显示大小与 CRC32;输入目标版本号(如 1.00.02→0x010002); 进度条 + 日志;升级期间禁止断连/退出,离开页面自动中止。

修改文件

  • src/BluetoothManager.uts — 新增 sendDataBytes(data, writeType, cb)(显式写类型, 设备下行特征必须 writeType=1)与 selectService(uuidPrefix)(按服务 UUID 前缀 0000CA10 选择 service+notify+write 组合,规避自动识别选错)。
  • App.uvue — ConnectBle() 在 scanServices 后先 selectService("0000CA10") 再订阅 notify; onLaunch 调 McmChannel.attach()。
  • pages/tabbar/home.uvue — 重写为设备主页:扫描(过滤 CAIIC-MCM)/连接/断开; 连接后温度、风扇转速每 2s 轮询显示,固件版本与运行 Bank 展示;notify 订阅成功 (bleData type=1000)后协商 MTU=247。
  • pages/tabbar/my.uvue — 删除充电/离线行为入口(原已注释),启用"CLI 调试终端"入口。
  • pages/bleTest/bluetoothOperation.uvue — 重写为 CLI 调试终端:inline 命令输入 + 应答文本流展示,复用全局 ConnectBle 连接流程。
  • pages.json — tabbar 改为 设备/状态/升级/my 四 tab(图标复用 static/tabbar 现有资源); 移除 charge/order 及全部充电页面注册。
  • manifest.json — 应用名改为"母乳杯助手";iOS 蓝牙用途文案改为母乳杯描述。
  • api/requestApi.uts — 仅保留用户类接口(登录/注册/pinCode/修改资料),删除全部 OCPP 充电与蓝牙绑定分享接口。
  • api/responseData.uts — 仅保留用户类响应类型。

删除

  • 目录:pages/startCharge/、pages/stopCharge/、pages/orderDetails/、 pages/offlineBehavior/、pages/tabbar/charge.uvue、pages/tabbar/order.uvue、 src/espBlufi/(充电桩 JSON 分片协议,与 CAIIC 二进制帧协议不兼容)。

遗留事项

  • 固件需新增温度/风扇 CLI 命令(设备仓库 D:\caic-workspace\mothercup, 在 cli_core.c 命令表注册;当前 APP 侧默认命令名 temp/fan,定名不同改 McmCommands.uts 顶部常量即可)。
  • 云端固件接口未接入:本期为本地 bin 文件升级;api/httpInstance.uts($http/token/ 服务器切换)保留,后续按约定接口(查询最新版本 + 下载 URL)接入 ota 页。
  • uni-app x 无 CLI 构建手段,需在 HBuilderX 编译并真机(Android)验证: version/sysinfo/bankinfo 显示、temp/fan(待固件)、本地 bin OTA 后 bankinfo 确认切 bank。
  • OTA 大数据量发送走 Write Without Response + 扇区级 ack 流控,若实测丢包导致 status=2 重同步频繁,可在 OtaManager 扇区内加小窗口节流。

后续调整(同日)

  • uts 编译修复:match() 结果元素可空需先判空;uts 函数不能直接当 lambda 传递 (改为箭头函数包装);uvue 页面内函数需"定义在前、使用在后";setTimeout 不接受 async 回调(改 then 链);java.io 交互处需显式 Int 类型。
  • UI 全面英文化:pages.json 导航/ tab(Device/Status/OTA/my/CLI Terminal)、 home/sysStatus/ota/my/CLI 终端全部文案与 toast、OtaManager 升级日志消息、 manifest 应用名 smartAssister、iOS 蓝牙用途英文描述。
  • 扫描不过滤:设备页去掉 CAIIC-MCM 名称前缀过滤,扫到的设备全部列出; BluetoothManager.startScan 的 showEmptyName 改为 1(无广播名设备也返回, 列表中匿名设备显示 N/A)。
  • APP 图标:新增 static/appIcon.png(1024×1024,蓝色渐变底 + 白色母乳杯 + 蓝牙徽标,脚本生成),manifest 的 Android 四档与 iOS appstore 图标均指向它; 图标与应用名需重打自定义基座并重装后生效。