无法通过蓝牙读取心率服务 Python读取Polar传感器心率求助
Python读取Polar传感器蓝牙心率数据最简实现
核心问题说明
之前读取失败基本是两个共性原因:
- 直接对心率服务UUID
0x180D做读取操作,服务本身不存储数据,实际实时心率存在心率服务下属的心率测量特征值中,对应蓝牙联盟标准UUID为00002a37-0000-1000-8000-00805f9b34fb - 心率数据是设备主动推送的,不是主动调用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
相关产品推荐
相关产品推荐

