React Native使用react-native-ble-plx扫描Beacon时UUID、名称为空如何解决
问题根因
Beacon的UUID、标识符等信息不会直接暴露在react-native-ble-plx返回的设备顶层字段中,这类自定义广播数据全部封装在manufacturerData字段内,你返回结果中的base64编码值就是存储Beacon信息的载体。如果你的模拟Beacon没有在广播包中配置携带设备名称字段,返回的name和localName为null属于正常现象。
解决步骤
1. 手动解析manufacturerData获取Beacon信息
iBeacon类广播帧有固定结构,你可以把base64格式的厂商数据转成字节数组后按结构提取信息:
首先安装buffer库做编码转换:npm install buffer
然后修改你的扫描回调逻辑:
import { Buffer } from 'buffer'; const scanAndConnect = () => { bluetoothInstance.startDeviceScan(null, { allowDuplicates: true }, (error, device) => { console.log('device', device); console.log('error', error); if (error) { return; } // 新增解析Beacon数据逻辑 if (device.manufacturerData) { const data = Buffer.from(device.manufacturerData, 'base64'); // 校验是否为标准iBeacon帧 if (data.length >= 25 && data[0] === 0x4c && data[1] === 0x00 && data[2] === 0x02 && data[3] === 0x15) { // 提取16位UUID const uuidBytes = data.slice(4, 20); const uuid = uuidBytes.toString('hex').match(/(.{8})(.{4})(.{4})(.{4})(.{12})/).slice(1).join('-'); // 提取Major、Minor const major = data.readUInt16BE(20); const minor = data.readUInt16BE(22); // 提取校准功率 const txPower = data.readInt8(24); console.log('解析到Beacon信息:', { uuid, major, minor, txPower, rssi: device.rssi, mac: device.id }); } } if (device?.name === 'MyProjectName') { bluetoothInstance.stopDeviceScan(); } }); };
如果需要通过名称识别设备,你可以在电脑端的Beacon模拟工具中,配置广播包携带Complete Local Name字段,扫描时就能拿到非空的name值。
2. 检查权限配置
字段为空大概率和权限不足有关:
- Android 12及以上需要申请
BLUETOOTH_SCAN、BLUETOOTH_CONNECT、ACCESS_FINE_LOCATION权限,低版本Android需要申请定位权限和蓝牙权限,没有权限时系统会自动把扫描到的设备敏感字段置空。 - iOS需要在Info.plist中添加
NSBluetoothAlwaysUsageDescription、NSLocationWhenInUseUsageDescription权限声明,否则扫描结果会出现字段缺失。
替代开发库推荐
如果你只需要做Beacon扫描,不需要复杂的BLE连接操作,可以选择专门的Beacon处理库,不需要手动解析广播包:
- 专门的Beacon管理库:直接封装了iBeacon、Eddystone等协议的解析逻辑,扫描后直接返回解析好的UUID、Major、Minor等字段,使用更简单。
- 通用BLE管理库:对广播数据的封装更友好,内置了基础的Beacon数据解析能力,比react-native-ble-plx上手门槛更低。
内容的提问来源于stack exchange,提问作者CraZyDroiD
相关产品推荐
相关产品推荐

