You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native使用react-native-ble-plx无法检测模拟iBeacon问题求助

问题原因

  • Beacon设备的核心标识(UUID、Major、Minor等)不会填充在BLE通用广播字段(serviceUUIDs、name、localName)里,而是全部存放在manufacturerData字段中,你当前没有对该字段做专门解析,所以看起来所有标识字段都是空值。你日志中返回的base64格式manufacturerData已经包含了完整的beacon信息,只是未解析。
  • 蓝牙耳机等标准BLE外设会主动在通用广播字段中填充名称、服务UUID等信息,所以可以直接读取到值,和beacon的广播逻辑不同。
  • 安卓11系统要求扫描BLE广播必须开启位置权限和设备位置开关,若权限未完全授予,也可能导致广播字段读取不完整。

解决步骤

1. 解析manufacturerData获取beacon信息

主流iBeacon格式的厂商数据遵循固定结构,你可以通过以下代码解析:
首先安装buffer依赖用于base64转码:

npm install buffer

然后新增解析逻辑:

import { Buffer } from 'buffer';

// 解析iBeacon厂商数据
const parseIBeacon = (manufacturerDataBase64) => {
  if (!manufacturerDataBase64) return null;
  const data = Buffer.from(manufacturerDataBase64, 'base64');
  // 校验iBeacon固定标识:厂商ID 0x004C(苹果) + beacon类型 0x0215
  if (data.length >= 25 && data.readUInt16BE(0) === 0x004C && data.readUInt16BE(2) === 0x0215) {
    const uuid = data.slice(4, 20).toString('hex')
      .match(/(.{8})(.{4})(.{4})(.{4})(.{12})/)
      .slice(1)
      .join('-');
    const major = data.readUInt16BE(20);
    const minor = data.readUInt16BE(22);
    const txPower = data.readInt8(24);
    return { uuid, major, minor, txPower };
  }
  // 若使用AltBeacon等其他类型beacon,可在此处新增对应解析逻辑
  return null;
}

在扫描回调中调用解析方法:

manager.startDeviceScan(null, null, (error, scannedDevice) => {
  if (error) {
    console.warn(error);
    return;
  }
  if (scannedDevice) {
    const beaconInfo = parseIBeacon(scannedDevice.manufacturerData);
    if (beaconInfo) {
      // 此处拿到的就是beacon的UUID等信息
      console.log('识别到beacon:', beaconInfo);
      dispatch({ type: 'ADD_DEVICE', payload: { ...scannedDevice, beaconInfo } });
    }
  }
});

2. 补全安卓权限和配置

检查android/app/src/main/AndroidManifest.xml是否添加了以下权限:

<!-- 蓝牙基础权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 安卓11及以下扫描BLE必需的位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />

确保应用运行时已经向用户申请了ACCESS_FINE_LOCATION运行时权限,且设备的位置开关处于开启状态。

3. 优化扫描参数(可选)

可以调整扫描模式提升beacon识别率:

manager.startDeviceScan(null, {
  scanMode: 2, // 低延迟高功耗模式,适合前台扫描beacon
  allowDuplicates: false // 相同设备是否重复上报
}, (error, scannedDevice) => {
  // 扫描逻辑
})

注意:你当前代码中设置的停止扫描超时时间为55000毫秒(55秒),和注释标注的5秒不符,若需要5秒自动停止可修改为5000。

内容的提问来源于stack exchange,提问作者CraZyDroiD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:09:03