android - Android上的后台重新连接参数
问题描述
我试图弄清楚Android在BLE上的后台重新连接上到底做了什么。例如,如果我发出一个将 autoConnect 设置为 true 的 connectGatt(),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中。它引用了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 秒(除非控制器使用其他调度)。
推荐阅读
- cryptography - BCrypt 生成 + 硬编码 Salt:这样更安全吗?
- django - 覆盖 Django 默认身份验证表单
- jquery - 如何通过 Rails 和 jQuery 的选择选项下载文件?
- amazon-web-services - Azure 的本地云堆栈类似于 AWS 的 LocalStack?
- angular - 为什么在将数据存储在变量中后,我在打字稿中变得未定义?
- android - 在 Android 上使用 Picasso 加载 Google 静态地图
- jquery - jquery - 点击事件打破视差
- r - r- emojifont 包的 font-awesome 命令在 Windows 10 中不显示图标
- reactjs - 如何使用 Redux 实现 React-navigation?
- r - 使用 R data.table 计算所有变量组合和 df 的不同计数