I am trying to send the 128
bytes of the block to BLE Controller using the RxAndroidBle
library. the flow to send data from mobile to BLE controller is as follows
- Connect with BLE Controller
- Start OTA (sending 1)
- Send CRC (of the data block)
- Send data block
- wait for 2 seconds
- repeat step 3
- END OTA (sending 2)
Here is snapshot of a code
.flatMap(rxBleConnection -> prepareWriting())
.flatMapIterable(otaMetaData -> otaMetaData)
.zipWith(Observable.interval(2, TimeUnit.SECONDS), (item, interval) -> item)
.doOnNext(metaData -> {
otaMetaData = metaData;
})
.map(otaMetaData -> {
return mRxBleConnection.writeCharacteristic(OTA_CHECKSUM, otaMetaData.getCrcBlock()).toObservable();
})
.doOnNext(otaMetaData -> {
Log.e(TAG, "Writing CRC " + Arrays.toString(BLEUtils.toHex(otaMetaData.getCrcBlock())));
})
.map(bytes -> {
return mRxBleConnection.writeCharacteristic(OTA_DATA, otaMetaData.getDataBlock()).toObservable();
})
.doOnNext(otaMetaData -> {
Log.e(TAG, "Writing Data " + Arrays.toString(BLEUtils.toHex(otaMetaData.getDataBlock())));
})
.flatMap(bytes -> mRxBleConnection.writeCharacteristic(OTA_CONTROL,OTA_DATA_END).toObservable())
The problem is while sending the END OTA
because as the flatMapIterable
returns 20 items, .flatMap(bytes -> mRxBleConnection.writeCharacteristic(OTA_CONTROL,OTA_DATA_END)
is getting called 20 times.
So, I am not sure how I can send the OTA_DATA_END
command when all the 20 items get processed. Moreover, any suggestion to improve the existing code is welcome.
>>` and secondly after using `map` control is got going there hence `.map(observables -> mRxBleConnection.writeCharacteristic(OTADictionary.OTA_CONTROL, OTADictionary.OTA_DATA_END).toObservable())` not getting fired
– Hunt Jan 02 '22 at 06:21