byte[] specificData=ScanRecord.parseFromBytes(device.getScanRecord()).getManufacturerSpecificData(5544);
这段代码的作用是从蓝牙设备的扫描记录(ScanRecord)中提取特定制造商(Manufacturer ID为5544)的专属数据。
1. 代码逻辑解析
device.getScanRecord()
:获取设备广播的原始字节数据,这是BLE设备广播时携带的未解析原始数据。getManufacturerSpecificData(5544)
:从解析后的扫描记录中,提取制造商ID为5544的专属数据。这里的5544是蓝牙技术联盟(SIG)分配给某制造商的唯一标识符,不同厂商的ID不同。
2. 制造商ID的作用
- 唯一性:每个厂商需向蓝牙SIG申请唯一ID(16位整数),例如苹果的ID是76(十六进制0x004C)
- 数据格式:厂商可自定义数据内容,例如iBeacon设备会在此字段中嵌入UUID、Major、Minor等信息
- 代码中的5544:需转换为十六进制0x15A8(5544的十六进制)
3. 其他常见制造商ID
- 苹果(Apple):ID为76(0x004C),用于iBeacon设备
- 三星(Samsung):ID为117(0x0075)。
- Nordic Semiconductor:ID为89(0x0059)。
- Google:ID为224(0x00E0),用于Eddystone信标。
- 完整列表可参考蓝牙SIG官网:Assigned Numbers - Company Identifiers。
4. 实际开发注意事项
- 动态权限:在Android 6.0+需动态申请
ACCESS_FINE_LOCATION
权限,否则无法获取扫描数据 - 广播包解析:广播包格式需符合蓝牙规范(如长度-类型-值的TLV结构),解析时需注意字节顺序和字段对齐
- 厂商兼容性:不同厂商的数据格式可能不同,需参考其协议文档(例如iBeacon的Proximity UUID为16字节,Major/Minor各2字节)
5. 扩展应用场景
- 设备过滤:通过制造商ID筛选特定品牌设备(如只连接iBeacon设备)
- 私有协议通信:厂商可通过专属数据字段传输加密信息或设备状态
- 信号强度计算:结合RSSI和发射功率(Tx Power)计算设备距离
若需验证具体厂商ID或数据格式,建议查阅蓝牙SIG官方文档或厂商协议。在代码中替换不同ID即可提取其他厂商的数据,例如:
byte[] appleData = ScanRecord.parseFromBytes(scanRecord).getManufacturerSpecificData(76); // 苹果数据