Продолжайте сканирование других устройств BLE при подключении к одному из них.

Я хочу, чтобы мое приложение непрерывно сканировало до 3 различных периферийных устройств BLE (идентифицируемых по MAC-адресу). Когда одно устройство найдено, я прекращаю его поиск и подключаюсь к нему. Код:

static Observable<ScanResult> bleSharedScanner = MyApplication
        .getRxBleClient()
        .scanBleDevices(new ScanSettings.Builder()
                .setScanMode(SCAN_MODE)
                .build())
        .share();

static Observable<ScanResult> device1Scanner = bleSharedScanner
        .filter(scanResult -> scanResult.getBleDevice().getMacAddress().equalsIgnoreCase( device1MacAddress ) 
        );

Код для Device2 и Device3 одинаков. Изначально я подписываюсь на все 3 этих сканера устройств; когда я нахожу одно из устройств, я unsubscribe подписываюсь на него, а поиск двух других продолжается.

Пока это работает на моем тестовом телефоне Android. Но я заметил ваш ответ на предыдущий вопрос: "… остановите scanSubscription, прежде чем пытаться подключиться— Android иногда плохо справляется со сканированием и подключением одновременно».

Это общая проблема? Есть ли хороший обходной путь? Мне нужно продолжить поиск других устройств, взаимодействуя с найденным.


person Robert Lewis    schedule 11.12.2017    source источник


Ответы (2)


Мой опыт показывает, что по крайней мере у некоторых устройств Huawei возникают проблемы при подключении к периферийному устройству во время сканирования (я подтвердил это на P8 Lite и P9) с двумя разными периферийными устройствами.

Когда шло сканирование, я получал COMMAND_DISALLOWED для команды LE_CREATE_CONNECTION. Связь между хостом и BLE-чипом была извлечена из HCI Snoop Log. Единственным обходным решением, которое сработало для меня, была остановка сканирования на период установления соединения.

У нас нет никакой статистики, чтобы доказать это - к сожалению.

person pawel.urban    schedule 15.12.2017

«Правильный» способ — просто подключиться к каждому устройству и установить для флага autoConnect значение true. Тогда у вас может быть несколько ожидающих подключений, и время попытки подключения никогда не истекает по сравнению с тем, когда вы сканируете.

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

В любом случае, 99% широко используемых устройств Android имеют чипы Bluetooth, которые могут сканировать и инициировать одновременно. Huawei P8 lite и дешевый планшет Asus — единственные найденные мной исключения, которые не могут этого сделать.

person Emil    schedule 16.12.2017