隔夜完成全部计划功能。以下是早上统一验收的清单与真机冒烟步骤。
| 功能 | 协议 | 状态 |
|---|---|---|
| BLE 扫描 / 连接 / ready 序列 | CRREPA 栈 fdda 服务 | ✅ 真机连上、100% 电量截图已确认 |
| 帧编解码 FD DA 10 len type feature payload | 无 CRC/加密 | ✅ 45 个单测 |
| 今日步数汇总(步数/距离/卡路里/活动分钟) | type=2 / feat=0x13 | ✅ 单测 + 解码器实证 |
| 步数明细 48×30min 柱状图 | type=2 / feat=0x18 | ✅ 单测(每对小端) |
| 实时心率(开始/停止 + 大数字 BPM) | type=1 / feat=0x09 | ✅ 流式订阅 + 单测 |
| 电量(标准 2A19 通知) | 180F | ✅ 连上即显示 |
| 设备信息(型号/固件/硬件/软件/序列号/厂商) | 180A 标准 | ✅ 连上即自动读 |
下列指标的请求命令已按反编译推断接好,点对应标签会发查询;响应布局未知,UI 先以原始字节(day + hex)展示。请在真机上用「调试」台对照反编译推断布局后,再升级为精确解码器(参考已验证的 StepsTotal)。
| 标签 | 命令 type/feature | 当前展示 |
|---|---|---|
| 心率(历史区) | type=2 / 0x09 | 原始字节 |
| 睡眠 | type=2 / 0x0E | 原始字节 |
| 血氧 | type=2 / 0x0B | 原始字节 |
| 压力 | type=2 / 0x0F | 原始字节 |
| HRV | type=2 / 0x10 | 原始字节 |
| 体温 | type=2 / 0x11 | 原始字节 |
| 目标步数(设置) | type=1 / 0x07 |
- 启动:
open /tmp/darings-dd/Build/Products/Debug/DaRings.app(或 Xcode Run)。首次会请求蓝牙权限,允许。 - 连接:左侧「设备」→「开始扫描」→ 点列表里的戒指(VRing 等)→ 顶部横幅显示「已连接」+ 电量。
- 今天:自动拉取今日步数;点「实时心率 → 开始测量」看 BPM 跳动,测完点「停止」。
- 活动:看 48 桶柱状图(今天步数分布)。
- 设置:自动读出型号/固件/序列号/厂商。
- 逆向未验证指标:左侧「调试」→ 快捷命令发「睡眠/血氧/…」→ 在「分组捕获」看戒指返回的 (type,feature) 与 hex → 推断布局后告诉我,我补精确解码器。
- 断开:「设置 → 断开连接」或「设备 → 断开连接」。
# 单测(RingProtocol 包,45 个,无需真机/app 宿主)
cd RingProtocol && swift test
# 构建 app
cd app && xcodegen generate && \
xcodebuild -project DaRings.xcodeproj -scheme DaRings \
-configuration Debug -destination 'platform=macOS' build \
-derivedDataPath /tmp/darings-dd当前:BUILD SUCCEEDED(0 warning);45/45 tests pass。
RingProtocol(Swift Package):协议层 + ConnectionService + VitalsService + 解码器。放包内是为swift test免 app 宿主。app/DaRings:BLETransport(@MainActor CoreBluetooth)+ DeviceCoordinator + SwiftUI 视图(今天/各指标/活动/设置/调试)。- 并发:BLETransport @MainActor +
CBCentralManager(queue:.main)主线程回调;ConnectionService/VitalsService @MainActor @Observable。