android - RxAndroidBle:JustWorks 绑定和操作超时问题
问题描述
我正在处理需要加密的特性,因此 Android 将自动创建一个绑定来执行写/读操作。
操作系统可能会自动创建绑定。这通常发生在向需要加密的特征发送读/写请求时。(参考这里)
但是,第一个读/写操作将因超时而失败(库中的默认值为 30 秒),但如果我在它工作后立即重试该操作,因为已创建绑定。
我知道第一次读/写操作总是会因为绑定的事情而失败,所以我想尽快执行它,而不是等待 30 秒失败。为了做到这一点,我所做的是为整个连接建立一个 10 秒的超时,如下所示:
scaleDevice.establishConnection(false, new Timeout(10, TimeUnit.SECONDS))
但是,我希望能够在建立连接后更改操作超时,因此可以执行以下操作:
- 使用默认的 30 秒操作超时建立连接。
- 在我需要第一次读取/写入加密特征之前,我想将超时设置为一个较小的值(可能是 5 秒)。
- 对加密特征的第一次读/写操作将在 5 秒后失败。
- 我将重试该操作,现在它将成功。
- 我想将操作超时设置回 30 秒。
在当前版本的RxAndroidBle 库中这可能吗?
解决方案
我检查了库的源代码,我意识到在当前版本的库中无法在建立连接后更改超时。
我打开了一个问题,建议将来添加此功能。
关于绑定和加密特性问题,我想出了一个更好的解决方法。在第一次失败操作后等待自动绑定,我确保在建立连接之前进行绑定。我通过调用这个助手类中可用的 bondWithDevice 方法来实现这一点,如下所示:
BondingHelper.bondWithDevice(this, scaleDevice, 30, TimeUnit.SECONDS)
.andThen(scaleDevice.establishConnection(false))
.observeOn(AndroidSchedulers.mainThread())
.doFinally(this::disposeConnection)
.subscribe(this::connectionEstablished, this::throwException);
推荐阅读
- c# - FTP - 不允许使用文件名。(远程服务器错误 533)C#
- ios - 如何在 Swift 中从 LPLinkMetadata 获取图像 URL
- c++ - 在 C++ 中将节点从一个队列移动到另一个队列
- r - Quanteda:当一个短语之间可以有任意数量的单词时,如何查找短语中两个或多个单词的模式?
- dynamic - 字符值切片器的动态选择
- excel - VBA动态变量值
- amazon-web-services - 从命令行重新部署 AWS CodeDeploy
- python - python参数验证-pyspark数据框过滤字符串
- pine-script - 获取配置的策略“订单大小”
- python - 将行转换为列