В настоящее время я реализую протокол для устройства Bluetooth
и использую библиотеку RxAndroidBle
(версия 1.4.3).
Я должен запросить данные с устройства, написав в характеристику, а затем прослушав ответ через характерное уведомление.
Чтобы объединить две операции (запись и прослушивание), я использую код из: https://stackoverflow.com/a/41140523/734385
connectionObservable
.flatMap( // when the connection is available...
rxBleConnection -> rxBleConnection.setupNotification(AP_SCAN_DATA), // ... setup the notification...
(rxBleConnection, apScanDataNotificationObservable) -> Observable.combineLatest( // ... when the notification is setup...
rxBleConnection.writeCharacteristic(AP_SCAN_DATA, writeValue), // ... write the characteristic...
apScanDataNotificationObservable.first(), // ... and observe for the first notification on the AP_SCAN_DATA
(writtenBytes, responseBytes) -> responseBytes // ... when both will appear return just the response bytes...
)
)
.flatMap(observable -> observable)
Этот подход работает для меня, единственная проблема в том, что код дает мне только первые 20 байт (из-за apScanDataNotificationObservable.first()
).
К сожалению, я не знаю размер посылки, которую получаю. Я могу извлечь информацию только из заголовка первых 20 байтов. Похоже, что функция буфера RxJava
требует заранее знать размер.
Есть ли способ заставить это работать чисто с кодом выше как часть цепочки Rx?
Другими словами, могу ли я контролировать количество эмиссий на основе самой первой эмиссии цепочки Rx?
Или у меня совсем неправильный подход?