2

对于一个项目,我目前正在尝试通过蓝牙 le 从传感器 (Polar OH1) 获取一些与心脏相关的数据 (ppg)。传感器制造商使用的服务没有很好地记录。现在,在读取服务的特征值时,我得到了大量的字节数据:

'''\r\xb1\x1aQ\xb4x\xa3C\x83\xdcv\xd3Q\x12\xbdJ\x7f\x82\xbf\x06\x91s\x07\xb7,\xb4\xd5\xa59\xf1\xf8\x8e \xabeF@2\xe0\x10\xcb{\xe5\xfd\x8dC\x10f\x8ca\xe6\x98\xb2\xf9I\xaa\xb7\xff\xe3\xab\x13'\x03J\xd4\xb5*/ ...'''

不幸的是,使用 utf-8、utf-16 (le,be) 或 utf-32 解码此数据不起作用。我怎样才能知道如何解码这个神秘的混乱?由于这是我第一次使用蓝牙乐,我真的被困住了。

我在 Linux(Ubuntu)上使用 Python3。

此致

4

2 回答 2

1

对于一个特征中的 BLE 数据,一个特征中通常有多个字段。例如,官方心率测量特性可以是 8 个八位字节长,并且在一个特性中包含标志、HRM 值、能量消耗和 RR 间隔的字段。

如果它使用蓝牙标准进行心率测量,则特征 UUID 将为 0000 2A37 -0000-1000-8000-00805F9B34FB。官方 UUID 通常被缩短为 16 位值,因此它是 0x2A37。

您可以阅读16-bit UUID Numbers Document中的值。另一个有用的文档是GATT 规范补充,它指定了值如何在官方特性中表示。

如果制造商使用了自定义特性,这些文档几乎/没有帮助。自定义特征由不在 0000xxxx-0000-1000-8000-00805F9B34FB 范围内的 UUID 值表示

要探索数据,使用通用的低功耗蓝牙扫描和探索工具(例如nRF Connect)通常很有帮助

如果将二进制值拆分为每个项目代表一个八位字节的列表,则在 Python 中通常更容易理解二进制值。例如:

>>> data = b'\r\xb1\x1aQ\xb4x\xa3C\x83\xdcv\xd3Q\x12\xbdJ\x7f\x82\xbf\x06\x91s\x07\xb7'
>>> list(data)
[13, 177, 26, 81, 180, 120, 163, 67, 131, 220, 118, 211, 81, 18, 189, 74, 127, 130, 191, 6, 145, 115, 7, 183]
>>> [f'{i:02x}' for i in data]
['0d', 'b1', '1a', '51', 'b4', '78', 'a3', '43', '83', 'dc', '76', 'd3', '51', '12', 'bd', '4a', '7f', '82', 'bf', '06', '91', '73', '07', 'b7']

要注意的另一件事是,在八位字节和整数之间进行转换时,int类型具有方法from_bytesto_bytes. 例如,如果我们知道一个值的类型为sint16,则它是有符号的并占用 2 个八位字节。需要注意的另一件事是 BLE 数据通常采用小端格式。

>>> int.from_bytes([0x82, 0xbf], byteorder='little', signed=True)
-16510
>>> int(-16510).to_bytes(2, byteorder='little', signed=True)
b'\x82\xbf'
>>> int.from_bytes(b'\x82\xbf', byteorder='little', signed=True)
-16510
于 2020-11-05T21:20:25.570 回答
-2

尝试使用 cp1250 编码。我认为你的字节数据不兼容,你应该先整理一下

b'\xe5\xfd\x8dC\x10f\x8ca\xe6'.decode('cp1250')
于 2020-11-05T18:48:53.670 回答