首页 > 解决方案 > RxAndroidBle:JustWorks 绑定和操作超时问题

问题描述

我正在处理需要加密的特性,因此 Android 将自动创建一个绑定来执行写/读操作。

操作系统可能会自动创建绑定。这通常发生在向需要加密的特征发送读/写请求时。(参考这里)

但是,第一个读/写操作将因超时而失败(库中的默认值为 30 秒),但如果我在它工作后立即重试该操作,因为已创建绑定。

我知道第一次读/写操作总是会因为绑定的事情而失败,所以我想尽快执行它,而不是等待 30 秒失败。为了做到这一点,我所做的是为整个连接建立一个 10 秒的超时,如下所示:

scaleDevice.establishConnection(false, new Timeout(10, TimeUnit.SECONDS))

但是,我希望能够在建立连接后更改操作超时,因此可以执行以下操作:

  1. 使用默认的 30 秒操作超时建立连接。
  2. 在我需要第一次读取/写入加密特征之前,我想将超时设置为一个较小的值(可能是 5 秒)。
  3. 对加密特征的第一次读/写操作将在 5 秒后失败。
  4. 我将重试该操作,现在它将成功。
  5. 我想将操作超时设置回 30 秒。

在当前版本的RxAndroidBle 库中这可能吗?

标签: androidbluetooth-lowenergyrx-androidrxandroidble

解决方案


我检查了库的源代码,我意识到在当前版本的库中无法在建立连接后更改超时。

我打开了一个问题,建议将来添加此功能。

关于绑定和加密特性问题,我想出了一个更好的解决方法。在第一次失败操作后等待自动绑定,我确保在建立连接之前进行绑定。我通过调用这个助手类中可用的 bondWithDevice 方法来实现这一点,如下所示:

BondingHelper.bondWithDevice(this, scaleDevice, 30, TimeUnit.SECONDS)
                    .andThen(scaleDevice.establishConnection(false))
                    .observeOn(AndroidSchedulers.mainThread())
                    .doFinally(this::disposeConnection)
                    .subscribe(this::connectionEstablished, this::throwException);

推荐阅读