Android:自动重新连接BLE设备

Bri*_*old 8 android bluetooth-lowenergy android-bluetooth

我的目标是让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()是如何工作的?

也许自动连接并不意味着重新连接,如上所述?

Bri*_*old 5

经过多次试验和磨难后,这就是我如何最好地让 Android 自动连接,唯一的用户操作是首先选择设备(如果使用设置菜单,然后首先配对)。

您必须在 BroadcastReceiver 中捕获配对事件,并执行 BluetoothDevice.connectGatt() 将自动连接设置为 true。然后,当设备断开连接时,调用 gatt.connect()。

更新:虽然上述方法通常有效,但有时会非常慢,可能是因为挂起的连接使用极其保守的扫描速率。另一个缺点是,对于要自动重新连接的每个设备,您必须保留一个执行挂起连接的 BluetoothGatt 对象。在嵌入式世界中,这是疯狂的。相反,人们所做的是通过检查其广告来连续扫描并连接到所需的设备。人们仅保存有关设备的最少量数据(服务、其配对状态和密钥等)。当广告被捕获时,您会看到它是否是您已知的设备之一,如果是,则连接到它。我在 Android 上尝试过类似的方法。始终扫描(低功率)并连接到感兴趣的广告,并维护代表已知设备的类。这种方法有一些烦人的细节(例如在连接时关闭扫描并在连接后重新启动),但它基本上可以在没有维护连接的开销的情况下工作。但有一个例外我不明白。扫描仪永远不会看到一台预配对设备的广告。但是,如果我调用此设备的挂起连接,我会重新连接。我完全不明白这一点。在我的嵌入式平台上,它可以正常工作。如果其他人尝试过这种自动重新连接的方法,请分享您的经验!

我发现了 Android 无法识别预配对设备的原因。Android 仅在设备响应扫描请求时报告扫描结果。配对后,该设备仅发出广告并忽略扫描请求,因此 Android 系统不会在 ScanCallback 中传递其广告。因此,为了使用扫描方法工作,我必须对这些特定设备使用挂起连接方法。看来你赢不了了!

============= 2020 年更新

许多年过去了,我对后台扫描方法有了更多的经验。如果保留支持的平台 5 及以上,则只能使用最新的扫描仪 API 并使用过滤器,从而无需自行解码原始广告。我还发现,如果您在连接时不关闭扫描,连接和重新连接会更快。我知道它违背了所有文档,但它有效,并且在某些平台上允许发生否则不会发生的连接。另外,到目前为止,我只发现一台(健康)设备需要挂起连接。免责声明:我所使用过的都是健康设备。

  • @brian 可以为此提供示例代码。这将对我们有很大的帮助。 (2认同)