BluetoothSocket.connect() выбрасывает исключение "не удалось прочитать"

У меня есть проект, который подключается к устройству через Bluetooth. Раньше он работал достаточно надежно, но теперь BluetoothSocket.connect() звони каждый раз. (Что ж, я установил соединение один раз за тысячи попыток в течение 4 часов.) Большая часть кода была взята из стандартного примера кода чата в API, за исключением обычной модификации при получении BluetoothSocket само устройство:

Method m = device.getClass().getMethod(
              "createRfcommSocket", new Class[] { int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));

Вот метод интереса, который запускается один раз BluetoothSocket получается:

public void run() {
  setName("ConnectThread" + mSocketType);

  // Always cancel discovery because it will slow down a connection
  mAdapter.cancelDiscovery();

  // Make a connection to the BluetoothSocket
  try {
    mmSocket.connect();
  } catch (Exception e) {
    Log.e(TAG, "Connection to " + mmDevice.getName() + " at "
                + mmDevice.getAddress() + " failed:" + e.getMessage());
    // Close the socket
    try {
        mmSocket.close();
    } catch (Exception e2) {
        Log.e(TAG, "unable to close() " + mSocketType
                + " socket during connection failure", e2);
    }
    connectionFailed(e.getMessage());
    return;
  }

  // Reset the ConnectThread because we're done
  synchronized (BluetoothChatService.this) {
    mConnectThread = null;
  }

      // Start the connected thread
  connected(mmSocket, mmDevice, mSocketType);
}

Соответствующая запись в журнале (выводится при обнаружении исключения во время вызова connect()) это:

11-30 10: 23: 51.685: E / BluetoothChatService (2870): Ошибка подключения к ZYNO-700091 в 00:06:66:42:8E:01: ошибка чтения, сокет может быть закрыт, чтение чтения: -1

Эта ошибка появлялась время от времени. У меня агрессивная система переподключения - она ​​в основном забивает соединение снова и снова до тех пор, пока оно не соединится, и, если оно когда-либо будет отключено, оно начнет стучать снова. Таким образом, это убивает поток соединения и начинается с нуля постоянно. Я считал, что там может быть проблема - может быть многопоточность, или, возможно, при обработке очистки / инициализации сокета. Однако, если бы это было так, я бы по-прежнему ожидал, что первая попытка подключения будет успешной, поскольку эта система не активируется до тех пор, пока не произойдет неудачная попытка подключения.

Я посмотрел в исходный код, бросив исключение. Проблема заключается в том, что основной InputStream не имеет данных Конечно, это не совсем ответ, просто шаг к нему. Почему поток не имеет данных?

Я стараюсь не задумываться о потенциальной проблеме. Я получаю BluetoothSocket должным образом? Тот факт, что когда-то это была проблема с перебоями, а теперь почти постоянная, заставляет меня подозревать многопоточность, но это относительно простая тема в Java по сравнению с C++, которую сложно обойти, если вы знаете, что делаете. Кроме того, большая часть этого кода (в частности, части, связанные с синхронизацией потоков) прямо из примера кода.

Устройство на другом конце является встроенным устройством Bluetooth, так что вряд ли можно решить проблему с этой стороны.

ОБНОВЛЕНИЕ ===========================

Мне пришло в голову, что это может быть связано с обновлением ОС (я работаю на телефонах Galaxy Nexus - у меня есть несколько для тестирования). Поэтому я распаковал новый телефон с 4.0.4, и он работал! Итак, я вернулся и проверил на двух оригинальных тестовых телефонах, работающих под 4.2, ожидая сбоя, который я видел все это время. Странно, но теперь это работает и на этих телефонах. Я хотел бы сказать, что снова сделал что-то, чтобы сделать эту работу, но я этого не сделал. Я все еще озадачен, и теперь также подозреваю, что эта штука сработает, когда она мне действительно понадобится.

Интересно, есть ли вероятность, что каким-либо образом соединение с использованием 4.0.4 могло бы правильно установить состояние серверного модуля, делая его восприимчивым к устройствам 4.2? Просто выстрел в темноте, я полагаю...

ОБНОВЛЕНИЕ 2 ===========================

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

4 ответа

Решение

У Jellybean совершенно другой стек Bluetooth, поэтому различия в версиях, безусловно, могут что-то вызывать, но это само по себе не объясняет, почему он продолжает работать или не работать после подключения со старым устройством. Может ли это быть связано с сопряжением? Если это произойдет снова, попробуйте отсоединиться от устройства и снова выполнить сопряжение.

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

В моем случае это произошло из-за плохого UUID в createRfcommSocketToServiceRecord()функция. Я хочу подключиться к последовательному профилю SPP в raspberry pi 3, и я использовал этот UUID:

private static final UUID MY_UUID_SECURE =
            UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

Я нашел где-то на странице документов Android для SPP.

У меня была такая же проблема при подключении к Arduino через модуль Bluetooth. Проблема возникла только при подключении с Arduino, так как он плавно подключался с другим телефоном Android с Bluetooth. Для меня работало изменение строки UUID.

Я думаю, что это может сработать: сначала вы должны быть подключены к Интернету и установить один apk для мобильного рынка и попытаться найти FXR WiFi Fix, а также спасти и установить их и выполнить. У меня была похожая проблема с гарнитурой SONY Bluetooth 52, к счастью, это работа хорошо в настоящее время.

Другие вопросы по тегам