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

基于Bleak库的BLE心率测量值转换与多特征通知实现问题

问题解答

1. 心率原始字节转换方法

你拿到的字节完全符合Bluetooth SIG定义的标准心率测量特征格式,转换步骤如下:

  • 第0个字节为标志位,你示例中的0x11(二进制00010001)代表3个含义:心率值为16位无符号整数、无能量消耗字段、附带RR间隔字段
  • 第1、2字节为心率值,采用小端序解析:
    • 示例1b'\x11G\x00...' → 取G\x00即0x47 0x00,小端序换算为0x0047 = 71 BPM
    • 示例2b'\x11F\x00...' → 换算为0x0046 = 70 BPM
    • 示例3b'\x11H\x00...' → 换算为0x0048 = 72 BPM
  • 第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:42:01