如何用Python连接Whoop 4.0手环并获取实时数据
针对Whoop 4.0本地BLE连接与数据读取的解决方案
1. 是否有人成功将Whoop 4.0连接至电脑读取实时数据?
是的,不少开发者已经实现了通过蓝牙低功耗(BLE)将未绑定账号的Whoop 4.0连接到M1 Mac或Windows i5笔记本,读取心率、皮肤温度、运动传感器等实时数据。只要你的系统支持BLE(MacOS 10.12+、Windows 10及以上版本均满足),就可以完成连接。
2. 适用于Whoop 4.0的库/工具
Whoop官方未公开针对本地BLE数据读取的SDK,但社区有成熟的第三方工具:
- Bleak:跨平台Python BLE库,支持Mac、Windows、Linux,是实现连接的核心工具,能扫描、配对BLE设备并订阅特征数据。
- 社区非官方解析工具:有开发者基于Bleak封装了针对Whoop 4.0的特征解析逻辑,可直接提取心率、温度、加速度计/陀螺仪的结构化数据(无需依赖Whoop云端账号)。
3. 实现步骤与示例代码
前置准备
- 安装Python 3.7+版本
- 安装Bleak库:
pip install bleak
步骤1:扫描并定位Whoop设备
运行以下代码扫描周边BLE设备,找到名称以WHOOP-开头的设备(比如WHOOP-1234):
from bleak import BleakScanner async def scan_devices(): devices = await BleakScanner.discover() for d in devices: if d.name and d.name.startswith("WHOOP-"): print(f"找到Whoop设备: {d.name}, 地址: {d.address}") import asyncio asyncio.run(scan_devices())
提示:如果扫描不到,确保Whoop手环处于开机状态且未被其他设备占用,Mac上可通过
system_profiler SPBluetoothDataType命令辅助确认设备是否被系统识别。
步骤2:连接设备并读取实时数据
以下是读取心率、皮肤温度和运动传感器数据的示例代码(需替换为你的设备地址):
from bleak import BleakClient import asyncio # Whoop 4.0 关键特征UUID(社区总结) HEART_RATE_UUID = "00002a37-0000-1000-8000-00805f9b34fb" SKIN_TEMP_UUID = "fb005c82-02e7-f387-1cad-8acd2d8df0c8" ACCEL_GYRO_UUID = "fb005c81-02e7-f387-1cad-8acd2d8df0c8" def heart_rate_callback(sender, data): # 解析心率数据(BLE标准格式) hr = data[1] print(f"实时心率: {hr} BPM") def skin_temp_callback(sender, data): # 解析皮肤温度数据(Whoop自定义格式) temp = int.from_bytes(data, byteorder="little") / 100 print(f"皮肤温度: {temp} °C") def accel_gyro_callback(sender, data): # 解析加速度计/陀螺仪数据(每轴2字节,小端序) accel_x = int.from_bytes(data[0:2], byteorder="little", signed=True) / 16384 accel_y = int.from_bytes(data[2:4], byteorder="little", signed=True) / 16384 accel_z = int.from_bytes(data[4:6], byteorder="little", signed=True) / 16384 gyro_x = int.from_bytes(data[6:8], byteorder="little", signed=True) / 131 gyro_y = int.from_bytes(data[8:10], byteorder="little", signed=True) / 131 gyro_z = int.from_bytes(data[10:12], byteorder="little", signed=True) / 131 print(f"加速度: X={accel_x:.2f}, Y={accel_y:.2f}, Z={accel_z:.2f} | 陀螺仪: X={gyro_x:.2f}, Y={gyro_y:.2f}, Z={gyro_z:.2f}") async def run_client(device_address): async with BleakClient(device_address) as client: print(f"已连接到Whoop设备: {client.is_connected}") # 订阅各特征数据 await client.start_notify(HEART_RATE_UUID, heart_rate_callback) await client.start_notify(SKIN_TEMP_UUID, skin_temp_callback) await client.start_notify(ACCEL_GYRO_UUID, accel_gyro_callback) # 保持连接,持续接收数据 while client.is_connected: await asyncio.sleep(1) # 替换为你的Whoop设备地址 DEVICE_ADDRESS = "你的Whoop设备地址" asyncio.run(run_client(DEVICE_ADDRESS))
注意事项
- 首次连接时,系统可能会弹出配对请求,需手动确认(Mac在蓝牙设置中,Windows在系统蓝牙面板中)。
- Whoop的部分特征UUID可能因固件版本略有变化,如果解析数据异常,可通过BLE调试工具重新获取特征UUID。
内容的提问来源于stack exchange,提问作者roadRunner
相关产品推荐
相关产品推荐

