Polidea 发布了一个名为 RxAndroidBle 的新的方便库,当您使用 vanilla 蓝牙 API 时,它对于处理许多问题非常有用。
在解释更多之前,想法是拥有一个 POJO 模型,其中包含设备发送(或我查询)给我的所有最近值(在这种情况下由 Map 对象表示):
如果我想收到有关多个特征通知的通知,我可以这样做:
final UUID serviceUuid = // your service UUID
final Map<UUID, byte[]> genericModel = new HashMap<>();
final Observable<RxBleConnection> connectionObservable = // your connectionObservable
connectionObservable
.flatMap(connection ->
connection.discoverServices()
.flatMap(services -> services.getService(serviceUuid).map(BluetoothGattService::getCharacteristics)) // get characteristics you're interested in
.flatMap(Observable::from) // deal with every characteristic separately
.flatMap(characteristic -> connection
.setupNotification(characteristic) // setup notification for each
.flatMap(observable -> observable), // to get the raw bytes from notification
Pair::new) // merge characteristic with byte[] to keep track from which characteristic the bytes came
)
.subscribe(
pair -> genericModel.put(pair.first.getUuid(), pair.second),
throwable -> { /* handle errors */}
);
现在,当我连接到设备时,通知正在更新 POJO 对象(此特定示例中的 Map)。
如果我想读取值,我可以执行以下操作:
connectionObservable.flatMap(connection ->
connection.discoverServices()
.flatMap(services -> services.getService(SERVICE_ID).map(BluetoothGattService::getCharacteristics))
.flatMap(Observable::from)
.filter(characteristic -> BleUtils.hasReadProperty(characteristic.getProperties()))
.flatMap(connection::readCharacteristic, Pair::new)
)
.subscribe(
pair -> genericModel.put(pair.first.getUuid(), pair.second),
throwable -> { /* handle errors */}
);
我的主要问题是:
我想在第一次连接时:读取大量具有读取属性的特征,然后才订阅那些具有通知属性的通知。这是连接操作。我怎样才能做到这一点?
问题是当我进行阅读的第一部分时,observable 读取了这些特征属性,但不会发出 doOnComplete 方法,因为正在等待更多,所以我无法启动或编写下一个订阅和收听更改的操作.
我确定具有 read 属性的特征数量,但我想以通用方式进行(即,如果我有 7 个或 15 个要读取的特征并不重要,我只想阅读它们,写入 pojo 值,然后开始收听通知)。
也许选项是编写一个可观察的来计算成功读取,然后开始收听通知。
实现这一目标的最佳反应方法是什么?
为了让您处于这种情况,这是产生这个问题的原始线程。