Как исправить «java.io.IOException: чтение не удалось, сокет может быть закрыт или тайм-аут» при попытке подключения к сопряженному устройству? - PullRequest
1 голос
/ 22 апреля 2019

Я сделал 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 Ответ

1 голос
/ 22 апреля 2019

Из CONNECTION_UUID, который вы указали в своем коде, я предполагаю, что вы подключаетесь через последовательную плату Bluetooth. Я еще не уверен в проблеме, однако я подумал написать этот ответ, чтобы найти вероятное решение, которое может решить вашу проблему.

Я думаю, что в случае сопряженных устройств вам нужно инициировать соединение по безопасному каналу. В настоящее время вы используете небезопасный канал.

Из документации ...

Канал связи не будет иметь аутентифицированного ключа связи, т.е. он будет подвергаться атакам «человек посередине». Для Bluetooth 2.1 устройства, ключ связи будет зашифрован, так как шифрование обязательно. Для устаревших устройств (до Bluetooth 2.1 устройств) ключ ссылки будет не быть зашифрованным. Используйте createRfcommSocketToServiceRecord (UUID), если желателен зашифрованный и аутентифицированный канал связи.

Следовательно, вы можете рассмотреть возможность использования createRfcommSocketToServiceRecord() для вашего дела.

Вместо этого

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);

Используйте это ...

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);

Надеюсь, это решит вашу проблему.

Из комментария ниже - UUID, который на самом деле работал здесь: 00001101-0000-1000-8000-00805f9b34fb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...