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

1

Я сделал 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;
}
Теги:
bluetooth

1 ответ

0

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

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

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

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

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

Вместо этого

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createInsecureRfcommSocketToServiceRecord(CONNECTION_UUID);

Использовать этот...

BluetoothSocket mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);

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

  • 0
    Спасибо большое. Это решило проблему. Я не уверен насчет фактического соединения, как вы можете сказать в коде, но теперь это мое дело. Я избавился от любого исключения, которое было моей целью.
  • 1
    Тем не менее, единственный UUID, который работает: 00001101-0000-1000-8000-00805f9b34fb
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню