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

2024-05-16 06:54:30 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个项目,我目前正试图通过蓝牙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解码这些数据不起作用。 我怎样才能发现如何解码这个神秘的混乱?因为这是我第一次使用蓝牙Le,我真的被卡住了

我在Linux(Ubuntu)上使用Python3

致意


Tags: 数据项目le记录传感器解码utf特征值
2条回答

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

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

您可以阅读16-bit UUID Numbers Document中的值。另一个有用的文档是GATT Specification Supplement,它指定了值在官方特征中的表示方式

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

要浏览数据,使用通用的蓝牙低能扫描和浏览工具(如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数据通常采用little endian格式

>>> 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')

相关问题 更多 >