You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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. 实现步骤与示例代码

前置准备

  1. 安装Python 3.7+版本
  2. 安装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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:53:13