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

无法通过蓝牙读取心率服务 Python读取Polar传感器心率求助

Python读取Polar传感器蓝牙心率数据最简实现

核心问题说明

之前读取失败基本是两个共性原因:

  1. 直接对心率服务UUID0x180D做读取操作,服务本身不存储数据,实际实时心率存在心率服务下属的心率测量特征值中,对应蓝牙联盟标准UUID为00002a37-0000-1000-8000-00805f9b34fb
  2. 心率数据是设备主动推送的,不是主动调用read方法就能拿到,必须先开启特征值的通知(notify)权限,设备才会持续回传实时数据。

实现步骤

  • 安装跨平台BLE依赖库bleak(Win/Mac/Linux通用,不需要额外安装系统级蓝牙服务):
    pip install bleak
  • 运行以下脚本,把脚本里的DEVICE_MAC替换成你自己获取的Polar设备MAC地址即可
import asyncio
from bleak import BleakClient

# 替换为你的Polar设备MAC地址
DEVICE_MAC = "XX:XX:XX:XX:XX:XX"
# 心率测量特征值标准UUID
HR_MEASURE_CHAR_UUID = "00002a37-0000-1000-8000-00805f9b34fb"

def hr_notify_callback(sender, data):
    # 按蓝牙心率标准协议解析二进制数据
    flag = data[0] & 0x01
    if flag == 0:
        hr_value = data[1]
    else:
        hr_value = int.from_bytes(data[1:3], byteorder="little")
    print(f"当前心率: {hr_value} bpm")

async def main():
    async with BleakClient(DEVICE_MAC) as client:
        print(f"已成功连接Polar设备: {DEVICE_MAC}")
        # 开启心率通知,传入回调函数处理回传数据
        await client.start_notify(HR_MEASURE_CHAR_UUID, hr_notify_callback)
        # 持续采集30秒,需要调整采集时长直接修改此处数值即可
        await asyncio.sleep(30)
        await client.stop_notify(HR_MEASURE_CHAR_UUID)
        print("采集结束,断开连接")

if __name__ == "__main__":
    asyncio.run(main())

常见踩坑排查

  • 运行脚本前先把手机上连过该Polar设备的蓝牙扫描App、运动App彻底关掉,Polar心率设备同一时间只允许一个终端建立连接,被其他设备占连接时脚本会出现连不上、收不到数据的问题
  • 不要用已经停止维护的pybluez库做BLE开发,该库对低功耗蓝牙的特征通知支持极差,能扫描到设备但读不到数据是常态
  • Linux下运行如果报权限错误,执行sudo setcap 'cap_net_raw,cap_net_admin+eip' $(readlink -f $(which python3))给Python解释器加蓝牙操作权限即可,不需要用root权限运行脚本
  • Windows下如果连接失败,先确认系统蓝牙设置中开启了“允许蓝牙设备查找这台电脑”,同时关闭电脑上其他可能占用蓝牙连接的运动类软件

内容的提问来源于stack exchange,提问作者glen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:24:12