在 Android 开发中,通过 ScanRecord.getBytes()
获得的字节数组值来源于蓝牙设备广播的原始数据包经过底层 SDK 处理后合并的结果,其结构由两部分组成:
-
普通广播包(30字节)
这部分数据对应蓝牙协议中固定的广播格式,包含基础设备信息。例如:- 前2字节:标志位(Flags),如
0x020106
表示蓝牙版本和功能支持 - 厂商自定义数据:如 iBeacon 的标识符
1AFF4C000215
(苹果公司 ID0x004C
开头)及后续的 UUID、Major、Minor 等字段
- 前2字节:标志位(Flags),如
-
应答包(最多32字节)
由厂商或设备自定义的扩展数据,常见内容包括:- 设备名称:如
4D696E69426561636F6E
对应 ASCII 码的 "MiniBeacon" - 服务数据(Service Data):如
F0FF
开头的 Service UUID 及其附属数据 - 发射功率(Tx Power):如
0x00
表示 0dBm
- 设备名称:如
Android SDK 会将上述两部分数据合并为固定长度62字节的数组(不足部分用0填充),并通过 getBytes()
直接暴露给开发者。例如:
- iBeacon 的核心数据(UUID、Major、Minor)通常位于前30字节的广播包中
- 动态或扩展信息(如设备名称、额外服务数据)则可能存在于应答包的32字节内
需要注意的是,蓝牙数据以低位到高位(Little-Endian) 传输,解析时需反转字节顺序。例如 MAC 地址 8b0300b001c2
实际应为 c2:01:b0:00:03:8b