原生 macOS(SwiftUI)第三方客户端,连接 Moyoung「Da Rings」智能戒指,实现体征采集与设备交互。
本项目是针对 Moyoung「Da Rings」系列智能戒指(实测机型 R19 / MOY-R193-2.1.6)的非官方、独立开发的 macOS 客户端。协议层通过对合法持有设备的蓝牙通信抓包与互操作分析得出,并用 Swift 独立重写。
| 模块 | 说明 | 状态 |
|---|---|---|
| 今天 | 步数汇总(步数/距离/卡路里/活动时长)+ 实时心率 + 电量 | ✅ 已验证 |
| 心率 | 实时测量(type=1/feat=0x09)+ 历史心率采样 | ✅ 已验证 |
| 活动 | 当日每 30 分钟步数明细柱状图 | ✅ 已验证 |
| 血氧 | 历史血氧采样(type=2/feat=0x0B) | ✅ 已验证 |
| 压力 | 历史压力指数(type=2/feat=0x19) | ✅ 已验证 |
| HRV / 体温 | 日内 5 分钟时序(HRV 0x10 / 体温 0x16) | ✅ 已验证(单包) |
| 睡眠 | 分期记录查询(type=2/feat=0x0E) | ✅ 已解码(分期+跨日时长,5 单测);真实分段数据待真机补录 |
| 设备 | 扫描 / 自动发现 / 连接 / 设备信息 / 电量 | ✅ 已验证 |
| 设备控制 | 查找戒指、消息提醒测试 | |
| 摇一摇拍照 | enableShutter(0x21) + 手势帧 type=3/0x17(fdd3) | ✅ 已验证(R19 进快门模式后推送手势触发帧) |
| 调试控制台 | 任意原始命令收发 + 按 (type,feature) 分组捕获 | ✅ RE 利器 |
- 广播 Service Data 携带 CRREPA 特征 UUID(FDDA/FDD0),首用即可自动识别戒指;
- 持久化已知戒指 UUID,启动即
retrievePeripherals免扫描直连,掉线自动重连; - 30s 链路保活(setTime)消除 ~90s 无流量 idle 断连;
- 掉线瞬间显示「重连中…」而非「未连接」,避免弱信号下的视觉闪烁。
smartring/
├── RingProtocol/ # Swift Package:协议层(帧编解码 / 命令 / 会话 / GATT)
│ └── Tests/ # 单元测试(金样帧、解码器、命令编码)
├── app/
│ ├── DaRings/ # macOS app(SwiftUI)
│ │ ├── Bluetooth/ # CoreBLETransport(扫描/连接/GATT 读写)
│ │ ├── Services/ # DeviceCoordinator(生命周期/自动发现/保活)
│ │ └── Views/ # SwiftUI 视图
│ └── project.yml # xcodegen 工程描述
└── DaRings-BLE-Protocol.md # 逆向协议文档(帧格式、命令表、R19 能力矩阵)
RingProtocol 是纯 Swift、无 UI 依赖的协议包(可在 Linux 构建跑测试);DaRings 是消费该包的 macOS app。
前置要求:macOS 15.0+、Xcode 26+(Swift 6.0)、xcodegen。
# 1. 生成 Xcode 工程
cd app
xcodegen generate
# 2. 命令行构建
xcodebuild -project DaRings.xcodeproj -scheme DaRings \
-derivedDataPath build -destination 'platform=macOS' build
# 3. 运行(系统会弹蓝牙权限请求)
open build/Build/Products/Debug/DaRings.app或用 Xcode 打开 app/DaRings.xcodeproj 直接 Run。
跑协议层测试(无需真机):
cd RingProtocol && swift test真机体征/连接测试需在
app/内启用DaRingsDeviceTestsscheme 并连接实机。
完整逆向结论见 DaRings-BLE-Protocol.md。要点:
- GATT:服务
FDDA,特征FDD1(notify/in)、FDD2(write/out)、FDD3(notify)。无标准 180A。 - 帧格式:
FD DA 10 <len> <type> <feature> <payload…>,无 CRC、无加密。 - 能力矩阵(官方
assets/config.txt解密实证):R19features=[0,0,0,0,0,1,0,0,0],仅开放血氧(bit5)。闹钟/亮度/振动/显示/久坐等设备控制位官方一概未给 R19 开——固件静默丢弃属预期。
R19 是体征采集戒指。官方机型能力矩阵为它仅开放血氧;多数「设备控制」查询(闹钟/亮度/振动/显示/心率告警/自动锁屏/SOS/消息)真机无回包,app 侧 sendMessage/findDevice 等写命令虽可下发但无 ACK,效果只能在戒指上观察。这不是 bug,是固件能力限制。
此外,R19 发射功率弱(实测 RSSI -71~-95dBm),嘈杂 2.4GHz 环境下偶发 GATT supervision timeout 链路丢失——属物理现象,app 靠快速自动重连兜底。
- 本项目为第三方、非官方实现,与 Moyoung(膜样)及其关联方无任何关系,未获其授权或背书。
- 协议层基于对合法持有设备的蓝牙通信抓包与互操作分析,采用净室(clean-room)思路由作者以 Swift 独立重写。本仓库不含任何来自官方 Android 应用(
com.moyoung.ring)的专有源代码、二进制 APK、反编译产物或加密资源。 - 仅供学习、研究和个人使用。使用者需自行承担一切风险与法律后果。Moyoung 及「Da Rings」名称、产品归其各自所有者所有,本项目仅作技术互操作之引用。