Я закончил выяснять это сам.Вот метод, который устанавливает индикацию или уведомление в характеристике, затем записывает некоторые байты в другую характеристику и возвращает Observable<String>
, который испускает byte[]
, проанализированный в шестнадцатеричный String
, которые были прочитаны в уведомлении / индикации.
Надеюсь, это поможет кому-то еще, ищущему это решение в RxJava2.
private Observable<String> writeAndReadOnNotification(UUID writeTo, UUID readOn,
String hexString,
boolean isIndication,
RxBleConnection rxBleConnection) {
Observable<Observable<byte[]>> notifObservable =
isIndication ?
rxBleConnection.setupIndication(readOn) :
rxBleConnection.setupNotification(readOn);
return notifObservable.flatMap(
(notificationObservable) -> Observable.combineLatest(
rxBleConnection.writeCharacteristic(writeTo, hexToBytes(hexString)).toObservable(),
notificationObservable.take(1),
(writtenBytes, responseBytes) -> bytesToHex(responseBytes)
)
).take(1)
.observeOn(AndroidSchedulers.mainThread())
.doOnError(this::throwException);
}