Проблемы с Android 4.0 и 4.1 Bluetooth. Обнаружение сломанной связи и падающего спаривания

Привет всем ,

Я понимаю, что стек bluetooth Android (bluez) был заменен на 4.2. Несмотря на то, что они, возможно, исправили многие предыдущие проблемы, из-за необходимости поддерживать более старые версии, мне все еще нужно сражаться с ними.

Я был бы очень признателен, если бы кто-то раньше рассматривал эти проблемы и мог пролить свет.

Проблема №1 – Невозможно обнаружить неисправные комм (4.0 и 4.1 Android, Bluez bluetooth stack)

Приложение bluetooth подключается к нашему собственному устройству SPP (мы используем стандартный UUID ). Он использует службу bluetooth, которая работает на собственном процессе. Требуется, чтобы это приложение работало в течение нескольких часов, работая с Bluetooth.

Во время блокировки энергосбережения / экрана приложение остается в живых, когда данные поступают через радио Bluetooth , а также периодически проверяю с помощью установленных аварийных сигналов, где я запрашиваю время процессора для повторного подключения и продолжения работы (при необходимости)

Теперь; Система работает нормально большую часть времени, но в некоторых редких ситуациях, когда экран заблокирован и в режиме энергосбережения, по причинам, которые я не понимаю, при записи в выходной поток (bluetooth socket) все кажется Чтобы пройти через обнаруженное поврежденное соединение. Устройство spp все еще утверждает, что соединение и сопряжение действительны, но ничего не получают.

На стороне Android журналы показывают собственный вызов BluetoothSocket.cpp :: writeNative (предполагая, что он напрямую связан с стеклом bluetooth bluez ), который, похоже, правильно записывает байты на радио Bluetooth, не сообщая о какой-либо ошибке.

Фрагмент кода, который записывается в выходной поток:

public void write(byte[] bytes) { try { Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes to write : "+bytes); mmOutStream.write(bytes); mmOutStream.flush(); Log.d(LOGGER.TAG_BLUETOOTH," bluetooth bytes written : "+bytes); } catch (IOException e) { e.printStackTrace(); } } 

Logcat:

D / com.our.app.bluetooth (8711): передача байтов: [B @ 41e0bcf8

D / com.our.app.bluetooth (8711): байты Bluetooth для записи: [B @ 41e0bcf8

V / BluetoothSocket.cpp (8711): writeNative

D / com.our.app.bluetooth (8711): байты Bluetooth написаны: [B @ 41e0bcf8

Вопросы. Правильно ли предположить, что, помимо проверки уровня приложения и сердечных сокращений, прерывистые комм должны быть обнаружены при работе сокета ввода-вывода, как в этом случае? Или может ли Bluetooth-радио просто спуститься во время энергосбережения?

Проблема №2 – Внезапное падение из списка спаривания.

В Android 4.0 и 4.1 устройства в некоторых случаях извлекаются из списка спаривания без объяснений. Даже это редко и несколько только в некоторых конкретных устройствах … это случай, когда телефон не может быть снова подключен и подключен.

Я замечаю, что устройство SPP правильно партируется, но иногда на устройствах Android выводится сообщение «Невозможно выполнить сопряжение с устройством X, неправильным PIN-кодом или паролем».

Примечание. Для версий Android версии 4.2 мы используем небезопасные сообщения ( createInsecureRfcommSocket , из-за других проблем подключения к Android для этих версий).

Вопросы. Как часто этот PIN / Пароль обновляется во время сеанса?

Это может быть ошибкой в ​​нашем SPP-устройстве, но на случай, если нет, каких-либо идей?

Спасибо, миллион .

Solutions Collecting From Web of "Проблемы с Android 4.0 и 4.1 Bluetooth. Обнаружение сломанной связи и падающего спаривания"

Это рабочий андроид 4.4.2 на nexus 7

 private boolean refreshDeviceCache(BluetoothGatt gatt){ try { BluetoothGatt localBluetoothGatt = gatt; Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]); if (localMethod != null) { boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue(); return bool; } } catch (Exception localException) { Log.e(TAG, "An exception occured while refreshing device"); } return false;} public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) { Log.w(TAG,"BluetoothAdapter not initialized or unspecified address."); return false; } // Previously connected device. Try to reconnect. if (mBluetoothGatt != null) { Log.d(TAG,"Trying to use an existing mBluetoothGatt for connection."); if (mBluetoothGatt.connect()) { return true; } else { return false; } } final BluetoothDevice device = mBluetoothAdapter .getRemoteDevice(address); if (device == null) { Log.w(TAG, "Device not found. Unable to connect."); return false; } // We want to directly connect to the device, so we are setting the // autoConnect // parameter to false. mBluetoothGatt = device.connectGatt(MyApp.getContext(), false, mGattCallback)); refreshDeviceCache(mBluetoothGatt); Log.d(TAG, "Trying to create a new connection."); return true;