Android 上的后台重新连接参数
Background reconnect parameters on Android
我想弄清楚 Android 在后台重新连接 BLE 时到底在做什么。例如,如果我发出 connectGatt() 并将 autoConnect 设置为 true,Android 多久查找一次?当我的应用程序在前台时怎么样?背景?有什么办法可以操纵这个参数吗?
目前我发现的是这些:
然而,它们被分成"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% 有效)。
扫描管理器代码不控制启动连接的扫描参数。
控制后台连接的代码在https://android.googlesource.com/platform/system/bt/+/refs/heads/master/stack/btm/btm_ble_bgconn.cc. It references 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
所以扫描window为30毫秒,间隔为1.28秒。如果您的广告间隔是 20 毫秒(在添加 0 到 10 毫秒的随机延迟之前),这意味着连接时间不应超过 1.28 秒(除非控制器使用其他调度)。
我想弄清楚 Android 在后台重新连接 BLE 时到底在做什么。例如,如果我发出 connectGatt() 并将 autoConnect 设置为 true,Android 多久查找一次?当我的应用程序在前台时怎么样?背景?有什么办法可以操纵这个参数吗?
目前我发现的是这些:
然而,它们被分成"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% 有效)。
扫描管理器代码不控制启动连接的扫描参数。
控制后台连接的代码在https://android.googlesource.com/platform/system/bt/+/refs/heads/master/stack/btm/btm_ble_bgconn.cc. It references 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
所以扫描window为30毫秒,间隔为1.28秒。如果您的广告间隔是 20 毫秒(在添加 0 到 10 毫秒的随机延迟之前),这意味着连接时间不应超过 1.28 秒(除非控制器使用其他调度)。