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, к счастью, это работа хорошо в настоящее время.