RxAndroidBle:JustWorks 绑定和操作超时问题
RxAndroidBle: JustWorks bonding and operation timeout issue
我正在处理需要加密的特征,因此 Android 将自动创建一个键来执行 write/read 操作。
There is a possibility that a bond will be automatically created by
the OS. This usually happens when a read/write request is sent to a
characteristic that needs encryption. (reference here)
但是,第一个 read/write 操作会因超时而失败(库中的默认值为 30 秒),但是如果我在它起作用后立即重试该操作,因为绑定已创建。
我知道第一个 read/write 操作总是会因为绑定的事情而失败,所以我想尽快执行,而不是等待 30 秒才失败。为此,我所做的是像这样为整个连接建立 10 秒超时:
scaleDevice.establishConnection(false, new Timeout(10, TimeUnit.SECONDS))
但是,我希望能够在建立连接后更改操作超时,因此我可以执行以下操作:
- 使用默认的 30 秒操作超时建立连接。
- 在我第一次需要 read/write 加密特征之前,我想将超时设置为一个较小的值(可能是 5 秒)。
- 对加密特征的第一个 read/write 操作将在 5 秒后失败。
- 我将重试该操作,现在它会成功。
- 我想将操作超时设置回30秒
在RxAndroidBle library的当前版本中可以吗?
我检查了库的源代码,发现在当前版本的库中无法在建立连接后更改超时。
我开了一个issue suggesting to add this functionality in the future.
关于绑定和加密特性问题,我想出了一个更好的解决方法。我没有在第一次失败的操作后等待自动绑定,而是确保在建立连接之前绑定。 I achieved that by calling the bondWithDevice method available in this helper class 像这样:
BondingHelper.bondWithDevice(this, scaleDevice, 30, TimeUnit.SECONDS)
.andThen(scaleDevice.establishConnection(false))
.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::disposeConnection)
.subscribe(this::connectionEstablished, this::throwException);
我正在处理需要加密的特征,因此 Android 将自动创建一个键来执行 write/read 操作。
There is a possibility that a bond will be automatically created by the OS. This usually happens when a read/write request is sent to a characteristic that needs encryption. (reference here)
但是,第一个 read/write 操作会因超时而失败(库中的默认值为 30 秒),但是如果我在它起作用后立即重试该操作,因为绑定已创建。
我知道第一个 read/write 操作总是会因为绑定的事情而失败,所以我想尽快执行,而不是等待 30 秒才失败。为此,我所做的是像这样为整个连接建立 10 秒超时:
scaleDevice.establishConnection(false, new Timeout(10, TimeUnit.SECONDS))
但是,我希望能够在建立连接后更改操作超时,因此我可以执行以下操作:
- 使用默认的 30 秒操作超时建立连接。
- 在我第一次需要 read/write 加密特征之前,我想将超时设置为一个较小的值(可能是 5 秒)。
- 对加密特征的第一个 read/write 操作将在 5 秒后失败。
- 我将重试该操作,现在它会成功。
- 我想将操作超时设置回30秒
在RxAndroidBle library的当前版本中可以吗?
我检查了库的源代码,发现在当前版本的库中无法在建立连接后更改超时。
我开了一个issue suggesting to add this functionality in the future.
关于绑定和加密特性问题,我想出了一个更好的解决方法。我没有在第一次失败的操作后等待自动绑定,而是确保在建立连接之前绑定。 I achieved that by calling the bondWithDevice method available in this helper class 像这样:
BondingHelper.bondWithDevice(this, scaleDevice, 30, TimeUnit.SECONDS)
.andThen(scaleDevice.establishConnection(false))
.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::disposeConnection)
.subscribe(this::connectionEstablished, this::throwException);