Android上的后台重新连接参数

时间:2019-05-16 16:13:36

标签: android bluetooth-lowenergy android-bluetooth

我正试图弄清楚Android在BLE上进行后台重新连接时正在做什么。例如,如果我将autoConnect设置为true发出了connectGatt(),Android会多久寻找一次?我的应用程序何时在前台怎么样?背景?有什么方法可以操纵此参数?

到目前为止,我发现的是这些

http://androidxref.com/9.0.0_r3/xref/packages/apps/Bluetooth/src/com/android/bluetooth/gatt/ScanManager.java#490

但是,它们被分为“ SCAN_MODE”和“ SCAN_MODE_BATCH”,但是我不知道何时使用它们。我也无法弄清楚正在使用哪种扫描模式进行后台重新连接。

我发现与实际信息最接近的是:

https://developer.android.com/reference/android/bluetooth/le/ScanSettings#SCAN_MODE_LOW_POWER

这表示在后台运行应用程序时所有扫描均以低功耗完成。但这包括重新连接扫描吗?那么哪个低功耗模式? SCAN_MODE_LOW_POWER_INTERVAL_MS仅5秒,而SCAN_MODE_BATCH_LOW_POWER_INTERVAL_MS仅150秒!这是一个很大的差异,并且在尝试重新连接到设备时会严重影响应用程序。

无论如何,我试图通读代码,但无法弄清楚到底发生了什么。任何有关其工作原理的见解都会有所帮助。

我问的原因是我有时无法重新连接到设备,但是该设备一次只能唤醒30秒以进行广告。如果Android的扫描间隔为150秒,那么它们很容易彼此丢失。感谢您提供任何帮助,以及其他可能导致重新连接失败的原因(请注意-在iOS中100%正常运行)。

1 个答案:

答案 0 :(得分:1)

扫描管理器代码不控制用于启动连接的扫描参数。

控制后台连接的代码在https://android.googlesource.com/platform/system/bt/+/refs/heads/master/stack/btm/btm_ble_bgconn.cc中。它引用了https://android.googlesource.com/platform/system/bt/+/refs/heads/master/stack/include/btm_ble_api_types.h,其中包含:

/* default scan paramter used in reduced power cycle (background scanning) */
#ifndef BTM_BLE_SCAN_SLOW_INT_1
#define BTM_BLE_SCAN_SLOW_INT_1 2048 /* 1.28 s   = 2048 *0.625 */
#endif
#ifndef BTM_BLE_SCAN_SLOW_WIN_1
#define BTM_BLE_SCAN_SLOW_WIN_1 48 /* 30 ms = 48 *0.625 */
#endif

因此,扫描窗口为30毫秒,间隔为1.28秒。如果您的广告间隔为20毫秒(在添加0到10毫秒的随机延迟之前),则连接的时间不应超过1.28秒(除非控制器使用其他调度)。