gpt4 book ai didi

java - 尝试连接配对设备时如何修复 "java.io.IOException: read failed, socket might closed or timeout"?

转载 作者:搜寻专家 更新时间:2023-11-01 09:20:48 29 4
gpt4 key购买 nike

我制作了一个 ListView,其中包含当前与我的手机配对的设备,以便我可以选择其中一个并连接到它。为了确定选择了哪个设备,我将它们的 MAC 地址存储在一个数组中,以便我可以通过地址获取设备。当我选择一个设备时,应用程序会卡住一段时间然后恢复,但连接没有成功。我无法在任何地方找到解决方案,我被困住了。我还是个初学者,了解不多。发生如下异常:

java.io.IOException: read failed, socket might be closed or timeout, read ret: -1

这是我的代码。

// If the UUID is incorrect then this one does not work as well
// 00001101-0000-1000-8000-00805f9b34fb

private static final UUID CONNECTION_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");

public static boolean connectDevice(final int a) {

try {
BluetoothDevice mBluetoothDevice = btAdapter.getRemoteDevice(deviceAddress[a]);
BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);
btAdapter.cancelDiscovery();

mBluetoothSocket.connect();

mmOutputStream = new DataOutputStream(mBluetoothSocket.getOutputStream());
mmInputStream = new DataInputStream(mBluetoothSocket.getInputStream());

mBluetoothSocket.close();

} catch (NullPointerException e) {
e.printStackTrace();
return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}

return true;
}

最佳答案

根据您在代码中提供的 CONNECTION_UUID,我假设您正在连接蓝牙串口板。我还不确定这个问题,但是,我想写这个答案来提供一个可能解决你的问题的可能的解决方案。

我认为在配对设备的情况下,您需要使用安全通道启动连接。目前,您使用的是不安全的 channel 。

来自documentation ...

The communication channel will not have an authenticated link key i.e it will be subject to man-in-the-middle attacks. For Bluetooth 2.1 devices, the link key will be encrypted, as encryption is mandatory. For legacy devices (pre Bluetooth 2.1 devices) the link key will be not be encrypted. Use createRfcommSocketToServiceRecord(UUID) if an encrypted and authenticated communication channel is desired.

因此您可以考虑使用 createRfcommSocketToServiceRecord() 来处理您的情况。

代替这个

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);

使用这个...

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);

希望能解决您的问题。

来自下面的评论 - 实际在这里工作的 UUID 是 00001101-0000-1000-8000-00805f9b34fb

关于java - 尝试连接配对设备时如何修复 "java.io.IOException: read failed, socket might closed or timeout"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797579/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com