如何获取Polar H10传感器心率数据请求所需的正确UUID
Polar H10心率(PPI)数据读取解决方案
核心混淆点澄清
你之前混淆了两个完全不同的概念:
- 蓝牙联盟规定的通用心率服务UUID
0000180D-0000-1000-8000-00805f9b34fb是合法可用的,不需要转换为字节数组作为请求参数 - 你参考的加速度/ECG示例走的是Polar私有PMD(Polar Measurement Data)通道,才需要往PMD_CONTROL特征写入特定格式的字节数组启动数据流,标准心率数据不需要走这个通道
推荐实现方案(新手友好,无需处理私有协议)
直接使用标准BLE心率服务即可同时获取心率值和PPI(RR间隔)数据,步骤如下:
- 定义相关UUID常量
# 标准心率服务UUID HR_SERVICE_UUID = "0000180d-0000-1000-8000-00805f9b34fb" # 心率测量特征UUID HR_MEASUREMENT_CHAR_UUID = "00002a37-0000-1000-8000-00805f9b34fb"
- 编写数据解析回调函数
def hr_data_callback(sender, data): # 解析心率值:第0字节第0位标记心率格式 0=8位 1=16位,单位均为bpm flag = data[0] bpm = data[1] if (flag & 0x01) == 0 else int.from_bytes(data[1:3], byteorder='little') # 解析RR间隔(即PPI,单位1/1024秒):第0字节第4位标记是否带RR间隔 rr_list = [] if (flag & 0x10) != 0: offset = 2 if (flag & 0x01) == 0 else 3 for i in range(offset, len(data), 2): rr_raw = int.from_bytes(data[i:i+2], byteorder='little') rr_list.append(round(rr_raw / 1024, 4)) print(f"当前心率:{bpm} BPM,PPI间隔:{rr_list} s")
- 替换原有启动流的代码
删除原有PMD控制写入、ECG流启动的代码,直接启动心率特征通知即可:
await client.start_notify(HR_MEASUREMENT_CHAR_UUID, hr_data_callback)
可选方案:走PMD通道获取心率
如果你需要同时采集心率和ECG、加速度等PMD数据做时间同步,可使用PMD通道的心率请求字节数组:
HR_PMD_REQUEST = bytearray([0x02, 0x01, 0x00, 0x01, 0x82, 0x00, 0x01, 0x01, 0x0E, 0x00])
将原有代码中的ECG_WRITE替换为上述字节数组,写入PMD_CONTROL特征后监听PMD_DATA特征通知,再按照你提供的PMD心率数据格式解析即可。
UUID使用补充说明
你找到的16位UUID官方文档是正确的,通用蓝牙服务/特征的16位UUID补全规则为 0000XXXX-0000-1000-8000-00805f9b34fb,将XXXX替换为文档中的16位十六进制值即可直接作为字符串使用,无需转换为字节数组。
内容的提问来源于stack exchange,提问作者Manolo Viso Romero
相关产品推荐
相关产品推荐

