React Native中使用react-native-ble-manager无法接收BLE通知
解决方案与排查步骤
1. 调整监听器注册时机(关键)
你的代码在每次调用connectToDevice时都会新增监听器,既可能造成内存泄漏,还可能因组件生命周期冲突导致事件无法被捕获。建议将监听器注册逻辑放到组件的useEffect中,确保仅注册一次:
import { useEffect } from 'react'; import { BleManager, BleManagerEmitter } from 'react-native-ble-manager'; // 组件内部 useEffect(() => { const valueUpdateListener = BleManagerEmitter.addListener( 'BleManagerDidUpdateValueForCharacteristic', ({ value, peripheral, characteristic, service }) => { // 先确认是否收到原始数据,再做格式转换 console.log(`收到设备原始数据:`, value); // 字节数组转字符串示例(需根据设备实际编码调整,如UTF-8) const receivedText = String.fromCharCode(...value); console.log(`转换后文本:${receivedText}`); } ); // 组件卸载时移除监听器,避免内存泄漏 return () => { valueUpdateListener.remove(); }; }, []);
2. 验证设备端与特征属性
- 用BLE调试工具(如nRF Connect)连接目标设备,找到服务
6E400001-B5A3-F393-E0A9-E50E24DCCA9E下的特征6E400003-B5A3-F393-E0A9-E50E24DCCA9E,手动开启通知,确认是否能收到数据。如果工具能收到,问题出在APP代码;如果工具也收不到,排查设备固件的发送逻辑。 - 通过
retrieveServices返回的peripheralInfo,检查目标特征的properties字段是否包含Notify属性,确认该特征支持通知功能。
3. 手动写入CCCD描述符(备选方案)
部分特殊设备需要手动写入客户端特征配置描述符(CCCD)才能开启通知,可尝试在startNotification之后补充该操作:
const cccdUUID = '00002902-0000-1000-8000-00805f9b34fb'; // 写入0x0100(小端模式)开启通知 BleManager.write( deviceId, serviceUUID, cccdUUID, [0x01, 0x00] ) .then(() => console.log('CCCD配置成功')) .catch(err => console.error('CCCD配置失败:', err));
4. 统一UUID大小写格式
部分BLE设备对UUID的大小写敏感,尝试将服务和特征UUID统一转为小写或大写后再调用接口:
const serviceUUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E".toLowerCase(); const characteristicUUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E".toLowerCase();
5. 校验特征存在性
在启动通知前,先从peripheralInfo中确认目标特征是否存在,避免因服务/特征未正确获取导致的异常:
// 从设备服务中查找目标特征 const targetCharacteristic = peripheralInfo.services ?.find(svc => svc.uuid === serviceUUID) ?.characteristics?.find(char => char.uuid === characteristicUUID); if (!targetCharacteristic) { console.error('未找到目标特征,请检查UUID是否正确'); return; }
内容的提问来源于stack exchange,提问作者govardhan ob
相关产品推荐
相关产品推荐

