如何使用 RxAndroidBle 调用多个 setupIndication

how to call multiple setupIndication using RxAndroidBle

我试图在触发 rxBleConnection.setupIndication(UUID) 后读取值 我有很多 characteristics UUIDs 我想使用 RxJava 以一种可以获得合并值的方式排列就像我们使用 Single.ZipObservable.zip

的方式

例如,使用 RxAndroidBle 我们可以读取多个特征,是否可以对 setupIndication 执行相同的操作?由于 setupIndication 正在返回 Observable<Observable<byte[]>> 我猜不可能压缩。

here is the library that I am using

我期待的

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.
                        }
                ); 

目前,我必须对所有 5 个字符执行 setupIndication

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

排列所有指示的最简单方法是将指示可观察值平面映射到单个指示中。请记住,当 all 指示可观察对象将发出时,订阅块的每次发射都会发生。

使用 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.
                        }
                );