首页 > 解决方案 > Android上的后台重新连接参数

问题描述

我试图弄清楚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_MS5秒,但是SCAN_MODE_BATCH_LOW_POWER_INTERVAL_MS是150秒!!这是一个很大的区别,并且会在尝试重新连接到设备时对应用程序产生相当大的影响。

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

我问的原因是我有时无法重新连接到设备,但设备一次只能唤醒 30 秒来做广告。如果 Android 的扫描间隔是 150 秒,那么它们很容易以这种方式相互丢失。感谢您提供任何帮助,以及重新连接可能不成功的其他原因(注意 - 这在 iOS 中 100% 有效)。

标签: androidbluetooth-lowenergyandroid-bluetooth

解决方案


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

控制后台连接的代码位于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 秒(除非控制器使用其他调度)。


推荐阅读