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

Привет всем,

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

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

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

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

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

Теперь; система работает нормально большую часть времени, но в некоторых редких ситуациях, когда экран заблокирован и в режиме энергосбережения, для причины, которые я не понимаю, после записи в выходной поток (bluetooth-сокет) все, кажется, проходит без обнаружения поврежденного соединения. Устройство 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 и lt; 4.2 мы используем небезопасные сообщения ( createInsecureRfcommSocket, из-за других проблем подключения к Android для этих версий).

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

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

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

Ответ 1

Это рабочий android 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;