了解Android BLE ScanSettings参数

时间:2018-05-03 21:39:11

标签: android bluetooth-lowenergy

围绕ScanSettings的文档非常简洁,我很难想出最佳配置。

我的要求规定我应该尽快报告一个符合我的过滤条件(在服务UUID上过滤)的新广告包。重复的广告包对我没用。当外围设备将在其侧注册事件时广告分组将改变,因此广告分组是我检测改变并相应地动作的机会。我还需要知道外设何时停止广告(关闭电源或不再在范围内)。

我尝试设置回调类型如下:

setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST)

此参数的文档说:

  

int CALLBACK_TYPE_ALL_MATCHES

     

针对与过滤条件匹配的每个蓝牙广告触发回调。如果没有激活过滤器,则报告所有广告包。

     

int CALLBACK_TYPE_FIRST_MATCH

     

仅对收到的与筛选条件匹配的第一个广告包触发结果回调。

     

int CALLBACK_TYPE_MATCH_LOST

     

当不再从先前由第一次匹配回调报告的设备收到广告时,接收回叫。

我希望这可以在外围设备可用时收到通知,然后在外设丢失时收到通知。然而,这并没有触发任何扫描结果,至少在我的Pixel 2上没有。所以我只是切换到使用CALLBACK_TYPE_ALL_MATCHES,现在我得到了所有的广告包。如果我想从同一个外设获得更新的数据包,这可能就是我想要的。

我查看了setMatchMode个参数,看来这只根据信号强度来配置回调率:

  

int MATCH_MODE_AGGRESSIVE

     

在激进模式下,即使信号强度较弱且持续时间内目击/匹配次数较少,hw也会更快确定匹配。

     

int MATCH_MODE_STICKY

     

对于粘滞模式,在通过hw

报告之前,需要更高的信号强度和目击阈值

setNumOfMatches声称要处理每个过滤器的广告数量,但是没有任何记录的参数似乎有所不同,我仍然从相同的外围设备获得一串没有变化的数据包,无论参数如何,似乎都大致相同。

为了满足我的要求,我需要确定外围设备是否停止广告(断电或不在范围内),我想出了来自外围设备的最后一个数据包的时间戳,并确定外设是否丢失当我没有看到一个数据包x秒钟。这是必要的,因为CALLBACK_TYPE_FIRST_MATCHCALLBACK_TYPE_MATCH_LOST似乎根本不起作用。

这很遗憾地意味着我会在我的代码中触发链式反应的类似数据包突发,我现在必须处理。

如何配置扫描,以便仅在广告包更改或外围设备停止广告时才收到通知?我在这里遗漏了什么,或者说那是不可能的。

2 个答案:

答案 0 :(得分:0)

像这样设置代码:

  new ScanSettings.Builder ()
                 .setScanMode (ScanSettings.SCAN_MODE_BALANCED)
                 .setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                 .build (),...

此设置适用于所有设备。但是每个智能手机都会给您一个不同的错误,这会引起混乱。

答案 1 :(得分:0)

我最近不得不对停止广告的设备做出反应(更新可用 BLE 设备的列表)。我的大部分测试也是在 Pixel 2 上完成的。

我不确定您是否可以在外围设备的广告包更改时收到回调并且在外围设备停止广告时收到回调,尽管我尚未对此进行测试。 要在设备停止广告时接收回调并停止对每个数据包的回调进行轰炸,请使用:

科特林:

private val bleScanSettings =
            ScanSettings.Builder().setCallbackType((ScanSettings.CALLBACK_TYPE_FIRST_MATCH or ScanSettings.CALLBACK_TYPE_MATCH_LOST)).build()

Java:

ScanSettings bleScanSettings = new ScanSettings().Builder.setCallbackType((ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST)).build();

我的代码在 Kotlin 中,Java 代码是我认为应该的样子,并且看起来与您的相同。在没有 ScanFilter 的情况下进行扫描时,此配置会触发错误回调,这可能是您的原始问题吗?

此配置将在收到设备的第一个匹配广告数据包以及匹配设备停止广告时触发回调。

您可以尝试查看当(先前匹配的)设备的广告数据包更改时是否也触发匹配的回调。否则,似乎不可能。