react-native-bluetooth-classic连接树莓派蓝牙报IOException读取失败
报错核心原因
这个错误本质是蓝牙底层socket在连接握手阶段被异常关闭,常见触发场景:
- 调用
connect()时未指定树莓派串口服务对应的UUID,库默认使用的通用UUID和树莓派暴露的SPP服务UUID不匹配,握手失败后socket被系统回收,读操作直接返回-1。 - 安卓本地蓝牙缓存了旧的设备服务信息,之前配对过的树莓派修改过蓝牙配置后,手机侧仍读取失效缓存记录建连。
- 树莓派侧蓝牙串口服务未正常启动、通道被占用,手机发起连接后收不到合法响应,超时断开。
- 未做配对状态校验,未完成系统配对流程就直接建立数据socket,被系统层面拦截断开。
- 安卓12+版本未申请蓝牙相关运行时权限,底层socket创建被权限机制拦截。
- 原代码存在拼写错误:
setDevcieConnected拼写错误,就算连接成功也会触发JS层异常,容易和原生层报错混淆。
修复步骤
- 连接时显式指定标准SPP服务UUID,补全配对校验、超时配置,修正拼写错误,替换原有连接代码:
// 标准蓝牙串口服务通用UUID,树莓派默认rfcomm服务默认使用该值 const SPP_SERVICE_UUID = "00001101-0000-1000-8000-00805F9B34FB"; const handleDeviceConnect = async (item: BluetoothDevice) => { try { // 先校验配对状态,未配对先触发系统配对流程 const paired = await item.isPaired(); if (!paired) { await item.pair(); } // 传入连接配置,指定UUID、10秒超时、使用安全连接 const connectedDevice = await item.connect({ uuid: SPP_SERVICE_UUID, connectionTimeout: 10000, secure: true }); Alert.alert(`Connected to ${item.id}`); // 修正原代码的拼写错误(Devcie -> Device) setDeviceConnected(connectedDevice); } catch (err) { console.log('connect error:', err); } };
- 排查设备侧问题
- 如果修改代码后仍报错,先在手机系统蓝牙设置里忽略已配对的树莓派设备,关闭再重新打开手机蓝牙,重新搜索配对后再尝试连接,清除旧缓存影响。
- 登录树莓派执行
sudo systemctl status bluetooth确认蓝牙服务正常运行,执行rfcomm show 0确认SPP服务正常监听对应通道;如果服务异常直接执行sudo systemctl restart bluetooth重启即可。如果你的树莓派自定义了蓝牙服务UUID,把代码里的SPP_SERVICE_UUID替换成实际配置的UUID值。
- 权限校验
安卓12及以上版本,确认应用已经动态申请到BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,权限缺失会直接导致底层socket创建失败。
内容的提问来源于stack exchange,提问作者JanakBastakoti
相关产品推荐
相关产品推荐

