我的目标是让 Android 设备重新连接到之前连接过的 BLE 设备无需用户干预与经典 BT 配对设备的操作方式相同(甚至可以通过电源循环工作)。
BTLE 设备的想法之一是节省服务、绑定和启用状态,以便重新连接非常快并且在外设上消耗很少的功率。
我所做的似乎有效,但效果很差。
第一步是连接或配对并连接到新设备,将“autoconnect”参数设置为“true”。
当设备断开连接时,不要打电话gatt.close()。我到处都看到应该调用 gatt.close()。但如果我确实调用 gatt.close(),Android 中央应用程序将永远不会重新连接。我已经测试过很多次了。
如果我没有调用 gatt.close() 并且没有重新启动 Android,通常会发生自动连接。有时可能需要很长时间,尤其是在 5.0 版本之后。然而,它是不可靠的,并且由于非常低负载的扫描周期以及设备在扫描周期实际检测到广告之前退出广告而可能是不可靠的。我不确定,因为没有办法像有广告那样检测到扫描操作!扫描也可能在一段时间后停止,但没有相关文档。
所以我认为我需要做的是,当设置自动连接时,以某种方式将 Android 使用的后台扫描速率设置为更高的占空比(仅可能在 5.0 及更高版本中),但我不知道如何执行此操作。我不想开始自己的扫描,但以某种方式设置 Android 用于重新连接的后台扫描速率。有谁知道如何做到这一点?有谁真正知道 autoconnect 和 gatt.close() 是如何工作的?
也许自动连接并不意味着像我上面指出的那样重新连接?
经过多次试验和磨难之后,这就是我如何最好地让 Android 自动连接,唯一的用户操作是首先选择设备(如果使用设置菜单,然后首先配对)。
您必须在 BroadcastReceiver 中捕获配对事件,并执行 BluetoothDevice.connectGatt() 将自动连接设置为 true。然后,当设备断开连接时,调用 gatt.connect()。
更新:虽然上述方法通常有效,但有时会非常慢,可能是因为挂起的连接使用极其保守的扫描速率。另一个缺点是,对于要自动重新连接的每个设备,您必须保留一个执行挂起连接的 BluetoothGatt 对象。在嵌入式世界中,这是疯狂的。相反,人们所做的是通过检查其广告来连续扫描并连接到所需的设备。人们仅保存有关设备的最少量数据(服务、其配对状态和密钥等)。当广告被捕获时,您会看到它是否是您已知的设备之一,如果是,则连接到它。
我在 Android 上尝试过类似的方法。始终扫描(低功率)并连接到感兴趣的广告,并维护代表已知设备的类。这种方法有一些烦人的细节(例如在连接时关闭扫描并在连接后重新启动),但它基本上可以在没有维护连接的开销的情况下工作。但有一个例外我不明白。扫描仪永远不会看到一台预配对设备的广告。但是,如果我调用此设备的挂起连接,我会重新连接。我完全不明白这一点。在我的嵌入式平台上,它可以正常工作。
如果其他人尝试过这种自动重新连接的方法,请分享您的经验!
我发现了 Android 无法识别预配对设备的原因。 Android 仅在设备响应扫描请求时报告扫描结果。配对后,该设备仅发出广告并忽略扫描请求,因此 Android 系统不会在 ScanCallback 中传递其广告。因此,为了使用扫描方法工作,我必须对这些特定设备使用挂起连接方法。看来你赢不了了!
============= 2020 年更新
许多年过去了,我对后台扫描方法有了更多的经验。如果保留支持的平台 5 及以上,则只能使用最新的扫描仪 API 并使用过滤器,从而无需自行解码原始广告。我还发现,如果您在连接时不关闭扫描,连接和重新连接会更快。我知道它违背了所有文档,但它有效,并且在某些平台上允许发生否则不会发生的连接。另外,到目前为止,我只发现一台(健康)设备需要挂起连接。免责声明:我所使用过的都是健康设备。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)