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

react-native-bluetooth-classic连接树莓派蓝牙报IOException读取失败

报错核心原因

这个错误本质是蓝牙底层socket在连接握手阶段被异常关闭,常见触发场景:

  • 调用connect()时未指定树莓派串口服务对应的UUID,库默认使用的通用UUID和树莓派暴露的SPP服务UUID不匹配,握手失败后socket被系统回收,读操作直接返回-1。
  • 安卓本地蓝牙缓存了旧的设备服务信息,之前配对过的树莓派修改过蓝牙配置后,手机侧仍读取失效缓存记录建连。
  • 树莓派侧蓝牙串口服务未正常启动、通道被占用,手机发起连接后收不到合法响应,超时断开。
  • 未做配对状态校验,未完成系统配对流程就直接建立数据socket,被系统层面拦截断开。
  • 安卓12+版本未申请蓝牙相关运行时权限,底层socket创建被权限机制拦截。
  • 原代码存在拼写错误:setDevcieConnected拼写错误,就算连接成功也会触发JS层异常,容易和原生层报错混淆。
修复步骤
  1. 连接时显式指定标准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);
  }
};
  1. 排查设备侧问题
  • 如果修改代码后仍报错,先在手机系统蓝牙设置里忽略已配对的树莓派设备,关闭再重新打开手机蓝牙,重新搜索配对后再尝试连接,清除旧缓存影响。
  • 登录树莓派执行sudo systemctl status bluetooth确认蓝牙服务正常运行,执行rfcomm show 0确认SPP服务正常监听对应通道;如果服务异常直接执行sudo systemctl restart bluetooth重启即可。如果你的树莓派自定义了蓝牙服务UUID,把代码里的SPP_SERVICE_UUID替换成实际配置的UUID值。
  1. 权限校验
    安卓12及以上版本,确认应用已经动态申请到BLUETOOTH_SCAN、BLUETOOTH_CONNECT权限,权限缺失会直接导致底层socket创建失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:12:30