特征的 flatMap writeValue 不返回 Observable

Posted

技术标签:

【中文标题】特征的 flatMap writeValue 不返回 Observable【英文标题】:flatMap writeValue for characteristic do not return Observable 【发布时间】:2017-06-05 14:48:37 【问题描述】:

更新:我刚刚检查了他们的示例项目,它是一样的。所以,这可能是一个错误,或者这是预期的行为。

我正在使用 RxBluetoothKit,但无法解决以下问题。我有这个包装函数来编写一个特性(我正在尝试用 concat 编写其中的许多特性,效果很好):

func writeCharacteristicData(for peripheral: Peripheral, characteristicIdentifier: CharacteristicIdentifier, value: Data?) -> Observable<Characteristic> 
guard let value = value else 
  return Observable.error(BTError.noDataProvided(description: "Missing value for: \(characteristicIdentifier)"))

return peripheral
  .connect()
  .flatMap  $0.writeValue(value,
    for: characteristicIdentifier,
    type: .withResponse) 

根据 RxBluetoothKit 文档.flatMap $0.writeValue 是写入特性的最简单方法之一。实际上它与readValue 一起工作得很好,即使使用这个writeValue,写入也是成功的,如果我之后用readValue 读回它,characteristic.valueoNext: 中是可以的。

我的问题是这个函数返回一个Observable&lt;Characteristic&gt;,我的假设是它会给我写回的值。但事实并非如此,或者至少它对我不起作用。它给了我以前的值或零,到目前为止我无法弄清楚发出的Observable&lt;Characteristic&gt; 的逻辑是什么。如果我能取回书面价值,那就太好了。我做错了什么?

我什至尝试了更长的方法,在 github 上提到了这个:

characteristic.writeValue(data, type: .withResponse)
.subscribe  event in
    //respond to errors / successful read

发出的特性(在onNext: 回调中)不是我写给设备的特性。这是以前的一个或零。有趣的是,如果我尝试读回它,然后再写,character.value 将是我用$0.readValue 读过的那个。但是如果我重新编译,写一个全新的,它仍然是我以前读过的一样。这就像 RxBluetoothKit 缓存了一个值,或者我根本不知道。

这可能是 ble 设备的问题吗? 也许这是一个线程问题或类似的东西?

非常感谢任何建议或提示。

谢谢,

丹尼尔

【问题讨论】:

【参考方案1】:

很抱歉没有回复,我刚刚注意到这一点。你的问题还出现吗?如果是这样 - 请在我们的 Github 上写一个问题。它与 Core Bluetooth 本身的工作方式有关,我们可能应该改进我们的文档,所以最好将它作为一个问题。您应该做的是再次读取该值 - 然后它将显示正确的值。

【讨论】:

以上是关于特征的 flatMap writeValue 不返回 Observable的主要内容,如果未能解决你的问题,请参考以下文章

杰克逊 writeValue 无法解决

HomeKit点滴

Swift BLE 外设 writeValue 不起作用

为啥在 Angular 中实现 ControlValueAccessor 时需要在 writeValue 中调用 onChange 和 onTouch?

如何在 iOS 应用程序中快速写入 BLE 特征

Android:rxjava简单实现原理(map/flatmap操作符)