【问题标题】:Sending data over the air and after completion end the operation using RxAndroidBLE无线发送数据,完成后使用 RxAndroidBLE 结束操作
【发布时间】:2022-01-01 10:43:20
【问题描述】:

我正在尝试使用 RxAndroidBle 库将块的 128 字节发送到 BLE 控制器。从手机向BLE控制器发送数据的流程如下

  1. 与 BLE 控制器连接
  2. 启动OTA(发送1)
  3. 发送 CRC(数据块)
  4. 发送数据块
  5. 等待 2 秒
  6. 重复步骤 3
  7. 结束 OTA(发送 2)

这是代码的快照

.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())

问题出在发送END OTA 时,因为flatMapIterable 返回20 个项目,.flatMap(bytes -> mRxBleConnection.writeCharacteristic(OTA_CONTROL,OTA_DATA_END) 被调用了20 次。

所以,我不确定在处理完所有 20 个项目后如何发送OTA_DATA_END 命令。此外,欢迎任何改进现有代码的建议。

【问题讨论】:

    标签: android rx-java rx-java2 rx-android rxandroidble


    【解决方案1】:

    您可以将flatMapIterable()toList() 一起使用。尝试在OTA_DATA_END 命令之前添加toList() 运算符,例如:

    .toList() // wait for all commands to complete
    .flatMap(bytes -> mRxBleConnection.writeCharacteristic(OTA_CONTROL,OTA_DATA_END).toObservable())
    

    编辑

    最好将步骤分开

    .flatMap(rxBleConnection -> prepareWriting())
    .flatMap(otaMetaData -> Observable.fromIterable(otaMetaData)
            .zipWith(Observable.interval(2, TimeUnit.SECONDS), (metaData, interval) -> metaData)
            .flatMap(metaData -> {
                return mRxBleConnection.writeCharacteristic(OTA_CHECKSUM, metaData.getCrcBlock())
                        .toObservable();
            }, (metaData, bytes) -> metaData) /* result selector */
            .flatMap(metaData -> {
                return mRxBleConnection.writeCharacteristic(OTA_DATA, metaData.getDataBlock())
                        .toObservable();
            }, (metaData, bytes) -> metaData)
            .toList()
            .toObservable()
    )
    .flatMap(otaMetaData -> {
        return mRxBleConnection.writeCharacteristic(OTA_CONTROL, OTA_DATA_END)
                .toObservable();
    })
    

    【讨论】:

    • 两件事,在添加toList() 之后,我不得不使用map 而不是flatMap,因为toList 正在返回Single<List<Observale<byte[]>>>,其次在使用map 之后,控制就到了那里因此.map(observables -> mRxBleConnection.writeCharacteristic(OTADictionary.OTA_CONTROL, OTADictionary.OTA_DATA_END).toObservable()) 不会被解雇
    • 一个问题,如果mRxBleConnection.writeCharacteristic(...)方法返回Observable/Single,你如何使用.map(otaMetaData -> ).map(bytes -> )?我认为这里应该是flatMap/flatMapSingle 而不是map。是的,toList() 返回Single,如果你想要ObservabletoList() 之后使用toObservable() 转换回Observable。另请参阅编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多