netseye/smartring-mac
GitHub: netseye/smartring-mac
该项目是基于净室逆向 BLE 协议独立开发的 Moyoung Da Rings 智能戒指非官方 macOS SwiftUI 客户端,支持体征数据采集与设备管理。
Stars: 0 | Forks: 0
# Da Rings · macOS 客户端
[](#)
[](#)
[](./LICENSE)
本项目是针对 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) | ⚠️ 原始字节,分期解码待补 |
| 设备 | 扫描 / 自动发现 / 连接 / 设备信息 / 电量 | ✅ 已验证 |
| 设备控制 | 查找戒指、消息提醒测试 | ⚠️ 下发无 ACK,效果需在戒指上观察 |
| 调试控制台 | 任意原始命令收发 + 按 (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](https://github.com/yonaskolb/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
## 📡 协议速览
完整逆向结论见 [DaRings-BLE-Protocol.md](./DaRings-BLE-Protocol.md)。要点:
- **GATT**:服务 `FDDA`,特征 `FDD1`(notify/in)、`FDD2`(write/out)、`FDD3`(notify)。无标准 180A。
- **帧格式**:`FD DA 10 `,**无 CRC、无加密**。
- **能力矩阵**(官方 `assets/config.txt` 解密实证):R19 `features=[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」名称、产品归其各自所有者所有,本项目仅作技术互操作之引用。
## 📄 许可证
[MIT License](./LICENSE)
标签:macOS 客户端, SwiftUI, 云资产清单, 健康数据, 智能穿戴, 物联网, 蓝牙通信, 逆向工程