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
问题原因
- 权限缺失:Android 12及以上系统,仅申请
BLUETOOTH_SCAN和位置权限不足以获取BLE设备的详细信息(ID、名称),必须额外申请BLUETOOTH_CONNECT权限,否则系统会屏蔽设备的敏感字段。 - 冗余的定时器:
BleManager.scan的第二个参数已经设置了扫描时长为5秒,额外加setTimeout延迟5秒获取设备属于重复等待,可能导致设备信息未及时同步。 - 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
相关产品推荐
相关产品推荐

