基于Bleak库的BLE心率测量值转换与多特征通知实现问题
问题解答
1. 心率原始字节转换方法
你拿到的字节完全符合Bluetooth SIG定义的标准心率测量特征格式,转换步骤如下:
- 第0个字节为标志位,你示例中的
0x11(二进制00010001)代表3个含义:心率值为16位无符号整数、无能量消耗字段、附带RR间隔字段 - 第1、2字节为心率值,采用小端序解析:
- 示例1
b'\x11G\x00...'→ 取G\x00即0x47 0x00,小端序换算为0x0047 = 71 BPM - 示例2
b'\x11F\x00...'→ 换算为0x0046 = 70 BPM - 示例3
b'\x11H\x00...'→ 换算为0x0048 = 72 BPM
- 示例1
- 第3字节开始的每2个字节为一组RR间隔值,同样按小端序解析,单位为1/1024秒,可按需转换。
你可以直接用这段Python代码实现转换:
def parse_hr_data(data: bytes) -> int: # 取1、2字节小端解析 return int.from_bytes(data[1:3], byteorder='little')
2. 多特征通知开启方案
Bleak完全支持同时开启多个特征的通知,蓝牙核心协议本身就允许同一连接下的多个通知特征并行工作,不需要依次开启。你可以直接为不同特征UUID分别调用start_notify,可以为不同特征指定独立的回调函数做数据解析,也可以在同一个回调中通过UUID区分数据来源。
参考实现代码如下:
# 心率数据回调 def hr_handler(sender, data): hr = int.from_bytes(data[1:3], byteorder='little') print(f"心率: {hr} BPM") # 温度数据回调 def temp_handler(sender, data): # 按温度特征规则解析即可 pass # 同时开启两个通知 await client.start_notify(HR_CHAR_UUID, hr_handler) await client.start_notify(TEMP_CHAR_UUID, temp_handler) # 持续监听15秒 await asyncio.sleep(15.0) # 分别关闭通知 await client.stop_notify(HR_CHAR_UUID) await client.stop_notify(TEMP_CHAR_UUID)
如果你的设备有特殊权限限制,极少数情况下会存在同一时间仅允许单个通知开启的情况,这种场景下再选择依次开启的方案即可,Bleak本身也支持该操作。
内容的提问来源于stack exchange,提问作者Marthkencombo
相关产品推荐
相关产品推荐

