如何同时连接多个特征?
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
我正在尝试读取和写入 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