react-native蓝牙连接失败:java.io.IOException读取失败,套接字可能关闭或超时,读取ret:-1

Posted

技术标签:

【中文标题】react-native蓝牙连接失败:java.io.IOException读取失败,套接字可能关闭或超时,读取ret:-1【英文标题】:react-native bluetooth Connection failed: java.io.IOException read failed, socket might closed or timeout, read ret: -1 【发布时间】:2021-06-09 12:33:54 【问题描述】:

我已在我的应用程序 (https://github.com/kenjdavidson/react-native-bluetooth-classic-apps/tree/main/BluetoothClassicExample) 中使用此库来连接蓝牙设备。

我在连接到设备时遇到了这个问题 - Connection failed: java.io.IOException read failed, socket might closed or timeout, read ret: -1

这是我用于 connect() 函数的代码。 (此代码来自https://kenjdavidson.com/react-native-bluetooth-classic/react-native/rn-bluetooth-device/)

async connect() 
    try 
      let connection = await this.props.device.isConnected();
      console.log("connection is......", connection);
      if (!connection) 

        console.log(this.state.connectionOptions);
        connection = await this.props.device.connect(
           CONNECTOR_TYPE: "rfcomm",
           DELIMITER: "\n",
           DEVICE_CHARSET: Platform.OS === "ios" ? 1536 : "utf-8",
        );

       else 
        console.log("Connected to ", this.props.device.name)
      

      this.setState( connection );
      this.initializeRead();
     catch (error) 
      console.log(error.message)
    
  

谁能给我建议

【问题讨论】:

【参考方案1】:

正如在 Github 问题上所讨论的,为了连接到另一台设备,您需要确保该设备是:

已配对 已打开 BluetoothServerSocket

使用此库时,您需要:

设备 1

将库/设备设置为接受模式:

let device = await RNBluetoothClassic.accept();

设备 2

连接到您正确操作的设备 1:

    connection = await this.props.device.connect(
           CONNECTOR_TYPE: "rfcomm",
           DELIMITER: "\n",
           DEVICE_CHARSET: Platform.OS === "ios" ? 1536 : "utf-8",
        );

但正如我们所讨论的,该库并不真正支持耳机和其他利用 BluetoothProfile 的外围设备。

2021 年 6 月 11 日编辑

正如我们还讨论过的,库本身仅提供非常基本的通信选项 (RFCOMM),这些选项由以下机构提供:

RfcommDeviceAcceptorImpl RfcommDeviceConnectorImpl DelimitedStringDeviceConnectionImpl

但该库已更改为允许用户覆盖/添加任意数量的他们自己开发的AcceptorConnectorDeviceConnection 实现。

这里的限制因素是 React Native 不允许您来回发送字节数组,发送数据的最佳方法是使用字符串,在这种情况下,字符串是 Base64 编码的(大部分情况下)。

因此,在非常高的层次上,您需要编写自己的版本:

LcappDeviceAcceptorImpl LcappDeviceConnectorImpl

并获取在包/模块中配置的那些。然后,您必须编写自己的 ObexDeviceConnectionImpl 并在模块中进行配置。不过看看 Obex 的规范,看起来你肯定也会遇到将字符串作为字符串传输到 React Native 端的问题。

看起来 Obex(我对它的经验为零)只是一种用于传输数据的消息格式。这意味着这可以使用任何类型的通信通道来实现,只是碰巧说 Lcapp 是主要的,但是查看 WIKI 确实说 RFCOMM 可以用于“遗留应用程序”。

这看起来是一个有趣的项目,可能需要大量定制工作。但是对于如此专业的东西(如果它是私有的),您可能希望考虑编写自己的内部模块或仅使用本机 java。

【讨论】:

非常感谢您的回答。我的目标不是耳机。我只是将它作为目标设备之一进行测试。如果目标设备中的连接类型是“rfcomm”,我正在测试的目标蓝牙设备现在正在连接。我们的主要目标是将数据从设备 2 传输到设备 1。这只能通过 "obex" 实现。但在这种情况下,它已配对但未连接。 这是一个实现ByteArrayDeviceConnectionImpl 的示例,这可能是一个很好的起点。 kenjdavidson.com/react-native-bluetooth-classic/guides/…

以上是关于react-native蓝牙连接失败:java.io.IOException读取失败,套接字可能关闭或超时,读取ret:-1的主要内容,如果未能解决你的问题,请参考以下文章

react-native 中蓝牙连接、下发数据、监听数据

Android7蓝牙连接失败,蓝牙设备连接失败,只有首次运行能连接成功??

蓝牙连接失败,使用 bluetoothctl 命令

解决 安卓小程序蓝牙 重连失败的问题

连接蓝牙设备失败

489次成功连接后android蓝牙连接失败