如何同时连接多个特征?

How do I connect multiple characteristics at the same time?

我正在尝试读取和写入 BLE 设备特定服务的 in/from 特性。

我在这里引用 RxAndroidBle 中的演示代码。

在此演示中,当您按下特定特征时,一旦发现服务,它就会进入下一个屏幕并建立连接,然后进行 read/write 操作。

我的问题:在发现服务后,有什么方法可以 read/write 任何特征吗?为什么在 read/write 操作之前需要与任何特征建立联系?

以下代码用于连接单个特征,但我想同时连接 3-4 个特征。我试过 .flatmap() 但给我错误。

  final Disposable connectionDisposable = connectionObservable
                            .flatMapSingle(RxBleConnection::discoverServices)
                            .flatMapSingle(rxBleDeviceServices -> rxBleDeviceServices.getCharacteristic(Consts.ALERT_LEVEL_UUID))
                            .observeOn(AndroidSchedulers.mainThread())
                            .doOnSubscribe(disposable -> text_connection.setText("Status: Connecting"))
                            .subscribe(
                                    characteristic -> {
                                        updateUI(characteristic);
                                        Log.i(getClass().getSimpleName(), "Hey, connection has been established!");
                                    },
                                    this::onConnectionFailure,
                                    this::onConnectionReceived
                            );

如下图所示,只要您按 R 或 W 获取任何特征,它就会给您结果。

如果我理解你的问题,你可能想研究使用 Jake Wharton 的 ReplayingShare 共享 BLE 连接。

以下是一些可能有帮助的讨论:https://github.com/Polidea/RxAndroidBle/issues/406

反应纯粹主义者似乎相信你应该能够用一个 subscribe() 语句做任何你想做的事情,但我不够聪明,无法弄清楚这一点。

我有解决办法。

连接

 Disposable disposable = connectionObservable
                            .flatMap(connection -> connection.discoverServices()
                                            .map(RxBleDeviceServices::getBluetoothGattServices)
                                            .flatMapObservable(Observable::fromIterable) // map to individual services
                                            .map(BluetoothGattService::getCharacteristics) // for each service take all characteristics)
                                            .flatMap(Observable::fromIterable) // map to individual characteristic)
                                    //.filter(characteristic -> (BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_WRITE | BluetoothGattCharacteristic.PROPERTY_WRITE_NO_RESPONSE) != 0) // consider only characteristics that have indicate or notify property

                            )
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(
                                    characteristic -> {
                                        onConnectionReceived();
                               },
                                    this::onConnectionFailure,
                                    this::onConnectionReceived
                            );

                    compositeDisposable.add(disposable);

如果连接成功,那么您可以在此单个连接中读取、写入和通知任何特征

对于读取、写入和通知,您可以查看 RxAndroidBle