尝试连接到配对的设备时,如何解决“ java.io.IOException:读取失败,套接字可能关闭或超时”的问题?

时间:2019-04-22 16:23:33

标签: java android bluetooth

我用当前已配对到手机的设备制作了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;
}

1 个答案:

答案 0 :(得分:1)

根据您在代码中提供的CONNECTION_UUID,假定您正在与Bluetooth串行板连接。我不确定这个问题,但是,我想写这个答案来提供可能解决您问题的解决方案。

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

documentation ...

  

通信通道将没有经过身份验证的链接密钥,即   它将受到中间人攻击。对于蓝牙2.1   设备,链接密钥将被加密,因为加密是强制性的。   对于旧设备(蓝牙2.1之前的设备),链接密钥为   不加密。如果出现以下情况,请使用createRfcommSocketToServiceRecord(UUID)   需要一个经过加密和身份验证的通信通道。

因此,您可以考虑在案件中使用createRfcommSocketToServiceRecord()

代替这个

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);

使用此...

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);

我希望能解决您的问题。

从下面的评论开始-在这里实际起作用的UUID是00001101-0000-1000-8000-00805f9b34fb