как вызвать несколько setupIndication с помощью RxAndroidBle

Я пытаюсь прочитать значение после запуска rxBleConnection.setupIndication(UUID) У меня много characteristics UUIDs, и я хочу выстроиться с использованием RxJava таким образом, чтобы я мог получать консолидированные значения точно так же, как мы получаем, используя Single.Zip или Observable.zip

Например, используя RxAndroidBle, мы можем прочитать несколько характеристик, возможно ли сделать то же самое для setupIndication. Поскольку setupIndication возвращает Observable<Observable<byte[]>>, я думаю, невозможно заархивировать.

вот библиотека, которую я использую

Что я ожидаю

Disposable disposable = device.establishConnection(false)
                .flatMap(rxBleConnection -> Observable.zip(
                        rxBleConnection.setupIndication(UUID1),
                        rxBleConnection.setupIndication(UUID2),
                        rxBleConnection.setupIndication(UUID3),
                        rxBleConnection.setupIndication(UUID4),
                        BLEReading::new
                ))
                .subscribe(
                        model -> {
                            // Process your model.

                            Log.e(TAG , "FINAL DATA ");
                        },
                        throwable -> {
                            // Handle an error here.
                        }
                ); 

В настоящее время я должен выполнить setupIndication для всех 5 символов.

connectDisposible = device.establishConnection(false)
                .flatMap(rxBleConnection->rxBleConnection.setupIndication(UUID1))
                .flatMap(notificationObservable -> notificationObservable)
                .subscribe(
                        bytes -> {
                            Log.e(TAG,"Notification bytes"+Arrays.toString(BLEUtils.toHex(bytes)));

                        },
                        throwable -> {
                            Log.e(TAG,"Notification Error "+throwable.getMessage());

                        }
                );

Изменить

connectDisposible = device.establishConnection(false)
                .flatMap(rxBleConnection -> Observable.zip(
                        rxBleConnection.setupIndication(UUID1).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID2).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID3).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID4).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID5).flatMap(it -> it),

                        BLEReading::new
                ))
                .subscribe(
                        model -> {
                            //control never reaches here

                            Log.e(TAG , "FINAL DATA "+model);
                        },
                        throwable -> {
                            // Handle an error here.
                            Log.e(TAG , "error"+throwable.getMessage());

                        }
                );

однако в logcat я могу успешно установить показания.

 setCharacteristicNotification() - uuid: 705f68f7-83c9-6562-b2c5 enable: true
 setCharacteristicNotification() - uuid: 314fae3a-d0cf-51c4-4a67 enable: true
 setCharacteristicNotification() - uuid: 8599c5ba-f827-2d16-ce14 enable: true
 setCharacteristicNotification() - uuid: 6fbba050-e87b-6ea8-6e5d enable: true

person Hunt    schedule 29.12.2020    source источник
comment
Ожидаете ли вы, что индикация будет отключена после первой индикации каждой характеристики? Или они должны быть как 1-е указание от характеристики A, B, C, D, E, 2-е указание от A, B, C, D, E, 3-е... и так далее?   -  person Dariusz Seweryn    schedule 29.12.2020
comment
это смесь того и другого. например, для характеристик A, B, C будет только одна индикация, а для D и E будет несколько индикаций, чтобы каждый раз получать новые данные.   -  person Hunt    schedule 29.12.2020
comment
Single.zip и Observable.zip генерируют события, когда будут генерироваться все источники. Таким образом, имея эквивалент в вашем случае, вы получите только одно излучение — поскольку A, B, C излучают только один раз.   -  person Dariusz Seweryn    schedule 29.12.2020
comment
Хорошо, но в настоящее время rxBleConnection.setupIndication(UUID1) просто испускает Observable<Observable<byte[]>>, а не Single<byte[]>, так как мы можем справиться с этим в Zip   -  person Hunt    schedule 29.12.2020


Ответы (1)


Самый простой способ упорядочить все индикаторы — это разбить наблюдаемые индикаторы на отдельные индикаторы. Просто имейте в виду, что каждый выброс в блок подписки будет происходить, когда будут испущены все наблюдаемые индикаторы.

Использование NotificationSetupMode.QUICK_SETUP, чтобы не пропустить выбросы, которые происходят в ответ на установку дескриптора конфигурации характеристик клиента (CCC).

Disposable disposable = device.establishConnection(false)
                .flatMap(rxBleConnection -> Observable.zip(
                        rxBleConnection.setupIndication(UUID1, NotificationSetupMode.QUICK_SETUP).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID2, NotificationSetupMode.QUICK_SETUP).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID3, NotificationSetupMode.QUICK_SETUP).flatMap(it -> it),
                        rxBleConnection.setupIndication(UUID4, NotificationSetupMode.QUICK_SETUP).flatMap(it -> it),
                        BLEReading::new
                ))
                .subscribe(
                        model -> {
                            // Process your model.

                            Log.e(TAG , "FINAL DATA ");
                        },
                        throwable -> {
                            // Handle an error here.
                        }
                ); 
person Dariusz Seweryn    schedule 29.12.2020
comment
Я попробовал ваш код, и он устанавливает индикацию, но не возвращает значение, и управление не переходит к FINAL DATA или throwable. Смотрите мое редактирование, пожалуйста - person Hunt; 30.12.2020
comment
Это должно работать, как и ожидалось, учитывая, что каждая характеристика испускается после того, как она настроена на отправку уведомления. Добавьте .doOnNext(bytes -> Log.i("emission", "UUIDX")) после каждого .flatMap(it -> it), и вы получите индивидуальное поведение каждого уведомления. - person Dariusz Seweryn; 30.12.2020
comment
Даже я думал то же самое, что это должно работать, но это не печатает UUIDX в консоли, и последнее, что я вижу, это uuid: 72cd0e39-cd22-415d-5eae-0a71b4861f3e enable: true - person Hunt; 30.12.2020
comment
Ах, NotificationSetupMode.QUICK_SETUP сработало, и теперь я вижу консолидированные данные. я попробовал несколько режимов, и этот хорошо подходит, хотя не уверен, что он делает, так как библиотека слишком большая, и я не мог догнать несколько вещей - person Hunt; 30.12.2020