christianmeurer/whoop-reader
GitHub: christianmeurer/whoop-reader
这是一个通过逆向Whoop 4.0的BLE协议,直接从设备读取并导出心率、血氧等原始生物识别数据的开源Python工具。
Stars: 2 | Forks: 0
# whoop-reader
用于 **Whoop 4.0** 健身手环的开源 BLE 数据读取器。
通过蓝牙低功耗(BLE)连接到 Whoop 4.0,并读取实时传感器数据——心率、R-R 间期、SpO2、皮肤温度和加速度计读数。专为研究人员、极客以及希望直接获取自身原始生物识别数据的任何人而构建。
## 工作原理
Whoop 4.0 公开了一个自定义 BLE GATT 服务(`61080000-8d6d-82b8-614a-1c8cb0f8dcc6`),其中包含用于命令、响应、事件、数据流传输和诊断的五个特征。该工具向设备发送命令帧,并解析返回的 96 字节实时数据包。
协议知识来源于社区的逆向工程:
- [jogolden/whoomp](https://github.com/jogolden/whoomp) -- Python CLI + Web Bluetooth,发现了 GATT 服务/特征 UUID
- [bWanShiTong/reverse-engineering-whoop](https://github.com/bWanShiTong/reverse-engineering-whoop) -- 记录了命令/响应代码
- [jacc/whoop-re](https://github.com/jacc/whoop-re) -- REST API 逆向工程
- [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge) 方法论:捕获 HCI snoop 日志、使用 Wireshark 分析,然后进行实现
## 它能读取哪些数据
| 字段 | 状态 | 字节 |
|-------|--------|-------|
| 心率 (BPM) | 已解码 | 1-2 |
| R-R 间期 (ms) | 已解码 | 3-4 |
| SpO2 (%) | 已解码 | 5 |
| 皮肤温度 (C) | 已解码 | 6 |
| 加速度计 X/Y/Z | 候选(未确认) | 7-12 |
| 运动强度 | 候选(未确认) | 13 |
| PPG 振幅 | 候选(未确认) | 14-15 |
| 环境光 | 候选(未确认) | 16-17 |
| PPG 信号质量 | 候选(未确认) | 18-19 |
| 电池电量 | 已解码 | (单独命令) |
| 设备信息 | 已解码 | (单独命令) |
96 字节实时数据包的第 20-91 字节尚未被解码。它们可能包含额外的传感器通道(陀螺仪、呼吸频率、PPG 波形样本)。代码库在每个字节位置都包含结构化的 TODO 注释,以便贡献者进行补充。
## 安装设置
需要 Python 3.10+ 和支持 BLE 的蓝牙适配器。
```
# Clone the repo
git clone https://github.com/whoop-reader/whoop-reader.git
cd whoop-reader
# Install in development mode
pip install -e ".[dev]"
```
### 平台说明
- **Linux**:可能需要 `bluez` 并以 root 身份运行(或将你的用户添加到 `bluetooth` 组)
- **macOS**:使用内置蓝牙栈即可开箱即用
- **Windows**:需要 Windows 10+ 和兼容的蓝牙适配器
## 使用方法
### 扫描设备
```
whoop-reader scan
whoop-reader scan --timeout 15
```
### 检查电池
```
whoop-reader battery --address AA:BB:CC:DD:EE:FF
```
如果省略 `--address`,工具将进行扫描并让你从发现的设备中选择。
### 设备信息
```
whoop-reader info --address AA:BB:CC:DD:EE:FF
```
### 流式传输实时数据
```
# Stream to console
whoop-reader stream --address AA:BB:CC:DD:EE:FF
# Stream to CSV file
whoop-reader stream --address AA:BB:CC:DD:EE:FF --output session.csv
# Stream to JSON lines file
whoop-reader stream --address AA:BB:CC:DD:EE:FF --output session.jsonl --format jsonl
# Stop after 100 packets
whoop-reader stream --address AA:BB:CC:DD:EE:FF --count 100
# Verbose logging (shows raw BLE traffic)
whoop-reader -v stream --address AA:BB:CC:DD:EE:FF
```
按 `Ctrl+C` 停止流式传输。数据在每个数据包后都会刷新到磁盘,因此中断时不会丢失任何数据。
### Python API
```
import asyncio
from whoop_reader.ble import scan_for_whoops, WhoopConnection
async def main():
devices = await scan_for_whoops()
async with WhoopConnection(devices[0]) as whoop:
print(f"Battery: {await whoop.get_battery()}%")
async for packet in await whoop.stream_realtime():
print(f"HR: {packet.heart_rate_bpm} BPM")
if packet.heart_rate_bpm and packet.heart_rate_bpm > 180:
break
await whoop.stop_realtime()
asyncio.run(main())
```
## 项目结构
```
whoop-reader/
whoop_reader/
__init__.py -- Package metadata
protocol.py -- BLE UUIDs, command codes, CRC-32 implementation
parser.py -- 96-byte packet parser, response parsers
ble.py -- Connection management (scan, connect, notify, stream)
export.py -- CSV and JSON/JSONL export (batch and streaming)
cli.py -- Click CLI (scan, connect, info, battery, stream)
pyproject.toml -- Package configuration (hatchling)
LICENSE -- MIT
README.md
```
## 协议详情
### CRC-32
Whoop 4.0 使用 CRC-32 变体,其参数为:
- 多项式:`0x04C11DB7`
- 初始值:`0xFFFFFFFF`
- 输入/输出反射:是
- 最终 XOR:`0xF43F44AC`
### 命令帧格式
```
[0xAA] [CMD] [LENGTH_LO] [LENGTH_HI] [PAYLOAD...] [CRC32_LE]
```
### 实时数据包
96 字节,通过 `61080004-8d6d-82b8-614a-1c8cb0f8dcc6` 作为 BLE 通知发送。最后 4 字节是前 92 字节的 CRC-32。
## 法律声明
本项目是根据《数字千年版权法》(DMCA)第 1201(f) 条关于逆向工程的豁免条款,为实现 Whoop 硬件与第三方软件之间的互操作性而进行的独立、社区驱动的互操作性努力。
本项目不提取、分发或修改专有固件、算法或受版权保护的内容。它仅观察并记录 BLE 通信协议。
## 免责声明
本项目与 Whoop, Inc. 无关,未获其认可,也不存在任何关联关系。所有商标均归其各自所有者所有。
本软件按“原样”提供,不提供任何担保。使用风险自负。作者不对您设备的运行、保修状态或 Whoop 订阅受到的任何影响负责。
此工具仅从您自己的设备读取数据。它不绕过任何订阅付费墙,不修改固件,也不访问 Whoop 的云服务。
## 许可证
MIT -- 参见 [LICENSE](LICENSE)。
标签:BLE, GATT, PPG, Python, SpO2, Whoop 4.0, 云资产清单, 代码示例, 传感器, 健康监测, 健身追踪, 加速度计, 可穿戴设备, 实时流, 开源, 心率, 数据分析, 数据读取, 无后门, 物联网, 生物数据, 皮肤温度, 研究工具, 蓝牙, 计算机取证, 逆向工具, 逆向工程