对于一个特征中的 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_bytes
和to_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