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但该库已更改为允许用户覆盖/添加任意数量的他们自己开发的Acceptor
、Connector
或DeviceConnection
实现。
这里的限制因素是 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的主要内容,如果未能解决你的问题,请参考以下文章