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

React Native BLE开发:如何获取已发现设备的ID与名称?

React Native BLE开发无法获取设备ID/名称问题排查

我正在使用React Native进行BLE开发,属于该领域新手。日志显示已发现设备,但无法获取设备ID、名称等信息,无法开始与BLE设备建立连接。以下是我的代码及日志内容:

const handleConnect = async () => {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {
          title: 'Location Permission',
          message:
            'This app needs access to your location for Bluetooth scanning',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        },
      );
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        console.log('You can use the location');
      } else {
        console.log('Location permission denied');
        return;
      }
    } catch (err) {
      console.warn(err);
    }

    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
        {
          title: 'Bluetooth scan',
          message: 'This app needs access to your bluetooth for scanning',
          buttonNeutral: 'Ask Me Later',
          buttonNegative: 'Cancel',
          buttonPositive: 'OK',
        },
      );
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        console.log('You can use bluetooth');
      } else {
        console.log('Bluetooth permission denied');
        return;
      }
    } catch (err) {
      console.warn(err);
    }

    BleManager.start({showAlert: false});

    BleManager.scan([], 5, true)
      .then(() => {
        console.log('Scanning...');
        setTimeout(() => {
          BleManager.getDiscoveredPeripherals([]).then(peripheralsArray => {
            // Success code
            console.log('Amount of Discovered peripherals: ', peripheralsArray.length);
            console.log('Discovered peripherals: ', peripheralsArray);
            console.log('Discovered peripheral 0 id: ', peripheralsArray[0].id);
            console.log('Discovered peripherals 0 name: ', peripheralsArray[0].name);
          });
        }, 5000);
      })
      .catch(error => {
        console.log('Scan error', error);
      });
  };

日志输出内容:

Amount of Discovered peripherals:  1
Discovered peripherals:  [{}]
Discovered peripheral 0 id:  undefined
Discovered peripherals 0 name:  undefined

问题原因

  1. 权限缺失:Android 12及以上系统,仅申请BLUETOOTH_SCAN和位置权限不足以获取BLE设备的详细信息(ID、名称),必须额外申请BLUETOOTH_CONNECT权限,否则系统会屏蔽设备的敏感字段。
  2. 冗余的定时器:BleManager.scan的第二个参数已经设置了扫描时长为5秒,额外加setTimeout延迟5秒获取设备属于重复等待,可能导致设备信息未及时同步。
  3. API调用错误:getDiscoveredPeripherals不需要传空数组参数,直接调用BleManager.getDiscoveredPeripherals()即可,错误参数可能影响结果返回。

修复后的代码

const handleConnect = async () => {
  // 申请位置权限(Android 11及以下版本必需)
  try {
    const locationGranted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
      {
        title: '位置权限申请',
        message: '应用需要位置权限才能进行蓝牙扫描',
        buttonNeutral: '稍后询问',
        buttonNegative: '取消',
        buttonPositive: '确定',
      },
    );
    if (locationGranted !== PermissionsAndroid.RESULTS.GRANTED) {
      console.log('位置权限被拒绝');
      return;
    }
  } catch (err) {
    console.warn(err);
  }

  // 申请蓝牙相关权限(Android 12+必需)
  try {
    const scanGranted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.BLUETOOTH_SCAN,
      {
        title: '蓝牙扫描权限申请',
        message: '应用需要蓝牙扫描权限才能发现设备',
        buttonNeutral: '稍后询问',
        buttonNegative: '取消',
        buttonPositive: '确定',
      },
    );
    if (scanGranted !== PermissionsAndroid.RESULTS.GRANTED) {
      console.log('蓝牙扫描权限被拒绝');
      return;
    }

    // 关键:必须申请蓝牙连接权限才能获取设备详情
    const connectGranted = await PermissionsAndroid.request(
      PermissionsAndroid.PERMISSIONS.BLUETOOTH_CONNECT,
      {
        title: '蓝牙连接权限申请',
        message: '应用需要蓝牙连接权限才能获取设备信息并建立连接',
        buttonNeutral: '稍后询问',
        buttonNegative: '取消',
        buttonPositive: '确定',
      },
    );
    if (connectGranted !== PermissionsAndroid.RESULTS.GRANTED) {
      console.log('蓝牙连接权限被拒绝');
      return;
    }
  } catch (err) {
    console.warn(err);
  }

  BleManager.start({showAlert: false});

  try {
    // 等待扫描完成后直接获取设备,无需额外定时器
    await BleManager.scan([], 5, true);
    console.log('扫描完成');
    const peripheralsArray = await BleManager.getDiscoveredPeripherals();
    
    console.log('已发现设备数量: ', peripheralsArray.length);
    console.log('已发现设备列表: ', peripheralsArray);
    if (peripheralsArray.length > 0) {
      console.log('第一个设备ID: ', peripheralsArray[0].id);
      console.log('第一个设备名称: ', peripheralsArray[0].name);
      // 此处可添加连接逻辑:BleManager.connect(peripheralsArray[0].id)
    }
  } catch (error) {
    console.log('扫描错误', error);
  }
};

额外注意事项

  • 确保react-native-ble-manager依赖为最新版本,旧版本对Android 12+权限兼容不佳。
  • 检查AndroidManifest.xml中是否声明了所需权限:
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
    
  • 部分BLE设备可能未广播名称,此时name字段会为null,但设备ID(MAC地址)应能正常获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:55:07