Невозможно сканировать BLE через некоторое время - PullRequest
0 голосов
/ 29 мая 2019

Мое приложение для Android (реагирует на собственное приложение с именем «myApp») сканирует BLE в течение 10 секунд в цикле (запуск - ожидание 10 секунд - остановка). Я заметил, что через некоторое время (около 7 часов) мое приложениене удается найти какое-либо устройство (хотя устройства вокруг него).

Когда я сохранил и проверил logcat, я увидел, что после каждой попытки сканирования «myApp» пытается запустить registerClient() и после сканированияunregisterClient() из GATT

Прямо перед началом проблемы я вижу следующее:

BtGatt.GattService: registerClient() - UUID=c4de3a02-66c8-41ac-bf9d-f42d8f9d160f, pid=2097, name=com.myApp

E bt_att  : GATT_Register: can't Register GATT client, MAX client reached!

E bt_btif : Register with GATT stack failed.

bt_att  : GATT_Register: can't Register GATT client, MAX client reached!

После еще большей копки в logcat я увидел, что есть еще один клиент, который пытается registerClient() to GATT:

BtGatt.GattService: registerClient() - UUID=9aa64bcd-402a-4474-ab5d-250e14bd77a1, pid=1311, name=com.google.android.gms.persistent

После поиска "com.google.android.gms.persistent" я обнаружил, что это сервис Google Play.

Этот сервис пытается зарегистрироваться в GATT, нотакже получает ту же проблему (клиент MAX достиг), пока он не попытается зарегистрироваться, когда «myApp» незарегистрирован в GATT - поэтому у него есть доступное место, и затем «myApp» больше не может регистрироваться как «com.google.android.gms.постоянный "не будет нерегулярнымster.

Единственное, что его решает, - это переключение Bluetooth, и затем «myApp» может зарегистрироваться снова.

Кто-то сталкивался с этой проблемой и нашел какое-либо решение?Может быть, как очистить всех клиентов, которые зарегистрированы в службе GATT?

РЕДАКТИРОВАТЬ:

Я использую пакет "LegacyScanManager" и "реагировать на родной менеджер ble".Это функция сканирования (которая вызывает функцию «сканирования» LegacyScanManager):

@ReactMethod
public void scan(ReadableArray serviceUUIDs, final int scanSeconds, boolean allowDuplicates, ReadableMap options, Callback callback) {
    Log.d(LOG_TAG, "scan");
    if (getBluetoothAdapter() == null) {
        Log.d(LOG_TAG, "No bluetooth support");
        callback.invoke("No bluetooth support");
        return;
    }
    if (!getBluetoothAdapter().isEnabled()) {
        return;
    }

    synchronized (peripherals) {
        Iterator<Map.Entry<String, Peripheral>> iterator = peripherals.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Peripheral> entry = iterator.next();
            if (!entry.getValue().isConnected()) {
                iterator.remove();
            }
        }
    }

    if (scanManager != null) scanManager.scan(serviceUUIDs, scanSeconds, options, callback);
}

Параметры, которые я передаю:

serviceUUIDs = none (пустой список),

scanSeconds = 10,

allowDuplicates = false,

options = "numberOfMatches = 3, matchMode = 1, scanMode = 0",

callback = мой обратный вызовфункция от JS

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...