繁体   English   中英

如何解码特征的字节值(python)

[英]How to decode byte value of characteristic (python)

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

'''\\r\\xb1\\x1aQ\\xb4x\\xa3C\\x83\\xdcv\\xd3Q\\x12\\xbdJ\\x7f\\x82\\xbf\\x06\\x91s\\x07\\xb7,\\xb4\\xd5\\xa59\\xf1\\xf \\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。

此致

对于特征中的 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

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

b'\xe5\xfd\x8dC\x10f\x8ca\xe6'.decode('cp1250')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM