为何在Flutter项目中用flutter_reactive_ble指定UUID无法扫描iBeacon?
问题解决:flutter_reactive_ble指定UUID无法扫描iBeacon
核心原因
iBeacon的广播机制和普通BLE设备不同,它不会广播服务UUID,而是将标识信息封装在厂商自定义数据段(苹果厂商ID为0x004C)中。因此通过withServices参数指定UUID进行过滤,根本匹配不到iBeacon设备。
正确实现方式
保持withServices: []进行全量扫描,然后在onDeviceFound回调中手动解析设备的厂商数据,筛选出iBeacon设备:
_subscription = await FlutterReactiveBle().scanForDevices( withServices: [], scanMode: ScanMode.lowLatency, requireLocationServicesEnabled: true, ).listen((device) { // 解析厂商数据,判断是否为iBeacon final manufacturerData = device.manufacturerData; if (manufacturerData != null && manufacturerData.containsKey(0x004C)) { final data = manufacturerData[0x004C]!; // 验证iBeacon标准数据格式(至少23字节,前两位为0x02、0x15) if (data.length >= 23 && data[0] == 0x02 && data[1] == 0x15) { // 此处处理匹配到的iBeacon设备 print("发现iBeacon设备: ${device.name}"); onDeviceFound(device); } } }, onError: onError);
补充说明
- iBeacon标准数据结构:前2字节固定为
0x02(帧类型)和0x15(数据长度),后续依次是16字节UUID、2字节主值、2字节次值、1字节信号校准值。 - 若你的iBeacon使用了自定义厂商ID,需将代码中的
0x004C替换为对应厂商ID。
内容的提问来源于stack exchange,提问作者Anirudh Sharma
相关产品推荐
相关产品推荐

