使用flutter_reactive_ble扫描BLE信标时,如何获取UUID及唯一识别设备?
解析iBeacon UUID及替代识别方案
你看到的manufacturerData是iBeacon的标准广播帧数据,前两个字节76, 0对应苹果厂商ID(0x004C),说明这是标准iBeacon格式,完全可以从中解析出UUID、majorID和minorID。
一、解析UUID的具体方法
iBeacon的厂商数据结构是固定的:
- 前2字节:厂商ID(苹果为0x004C,对应数组中的
[76,0]) - 第3字节:Beacon类型(固定为0x02)
- 第4字节:后续数据长度(固定为0x15,对应数组中的
21) - 第5-20字节:16字节的UUID原始数据
- 第21-22字节:majorID(大端字节序)
- 第23-24字节:minorID(大端字节序)
- 第25字节:发射功率值
针对你提供的manufacturerData,可以用以下Dart代码解析出目标格式的UUID:
// 从DiscoveredDevice的manufacturerData中提取iBeacon信息 void parseIBeaconData(List<int> manufacturerData) { // 先验证是否为标准iBeacon帧 if (manufacturerData.length >= 25 && manufacturerData[0] == 76 && manufacturerData[1] == 0 && manufacturerData[2] == 2 && manufacturerData[3] == 21) { // 提取UUID对应的16字节数据 final uuidBytes = manufacturerData.sublist(4, 20); // 转成十六进制字符串并添加分隔符 final uuidHex = uuidBytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join(); final formattedUuid = '${uuidHex.substring(0,8)}-${uuidHex.substring(8,12)}-${uuidHex.substring(12,16)}-${uuidHex.substring(16,20)}-${uuidHex.substring(20,32)}'; // 顺便解析major和minor(可选) final major = (manufacturerData[20] << 8) | manufacturerData[21]; final minor = (manufacturerData[22] << 8) | manufacturerData[23]; print('格式化UUID: $formattedUuid'); print('MajorID: $major'); print('MinorID: $minor'); } else { print('当前数据不是标准iBeacon帧'); } }
运行这段代码后,就能得到你需要的类似0546b93b-f113-438d-8bab-b9e766d01177的UUID格式,和你在Beacon Simulator中设置的值一致。
二、更可靠的设备识别方案
蓝牙地址(id字段)在Android 10及以上系统会随机轮换,不能作为稳定的唯一标识。最可靠的方式是使用iBeacon的UUID+majorID+minorID组合:
- UUID:区分不同的信标分组
- majorID:区分组内的不同区域或设备类型
- minorID:区分同一类型下的单个设备
这三个值都是你在Beacon Simulator中手动设置的固定值,不会随蓝牙地址变化,完全可以作为设备的唯一识别标识。
内容的提问来源于stack exchange,提问作者Anirudh Sharma
相关产品推荐
相关产品推荐

