了解Android BLE ScanSettings参数

une*_*red 5 android bluetooth-lowenergy

有关ScanSettings的文档非常简洁,我很难提出最佳配置。

根据我的要求,我应该尽快报告一个符合我的过滤条件(根据服务UUID过滤)的新广告包。重复的广告包对我没有用。当外设在其一侧注册事件时,广告包将发生更改,因此广告包为我提供了机会来检测更改并采取相应措施。我还需要知道外围设备何时停止广告(关闭电源或不在范围内)。

我试图设置如下的回调类型:

setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH | ScanSettings.CALLBACK_TYPE_MATCH_LOST)
Run Code Online (Sandbox Code Playgroud)

此参数的文档说:

整型CALLBACK_TYPE_ALL_MATCHES

为找到的每个符合过滤条件的蓝牙广告触发回调。如果没有活动的过滤器,则报告所有广告包。

诠释CALLBACK_TYPE_FIRST_MATCH

仅针对接收到的与过滤条件匹配的第一个广告包触发结果回调。

诠释CALLBACK_TYPE_MATCH_LOST

当不再从以前由首次匹配回调报告的设备接收广告时,接收回调。

我希望借此在外围设备可用时得到通知,然后在外围设备丢失时得到通知。但是,这不会触发任何扫描结果,至少不会在我的Pixel 2上触发。因此,我刚刚切换为使用CALLBACK_TYPE_ALL_MATCHES,现在我得到了所有广告包。无论如何,如果我想从同一外设获取更新的数据包,这可能就是我想要的。

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

整数MATCH_MODE_AGGRESSIVE

在激进模式下,即使信号强度微弱且持续时间内瞄准/匹配的次数很少,hw也会更快地确定匹配。

整数MATCH_MODE_STICKY

对于粘性模式,在通过硬件报告之前,需要更高的信号强度和目击阈值

setNumOfMatches索赔处理每个过滤广告的数量,但没有形成文件的参数似乎有所作为,我还是得到同样的外围包并没有改变,看似在大约相同的速率无论参数一阵。

为了满足我需要确定外围设备是否停止广告(电源关闭或不在范围内)的要求,我想出了外围设备上次见到的数据包的时间戳,并确定外围设备是否丢失。几秒钟内看不到一个数据包。这是必要的,因为CALLBACK_TYPE_FIRST_MATCHCALLBACK_TYPE_MATCH_LOST似乎根本不起作用。

不幸的是,这意味着我收到大量类似的数据包,从而触发了我现在必须处理的代码中的连锁反应。

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

小智 -1

设置代码如下:

  new ScanSettings.Builder ()
                 .setScanMode (ScanSettings.SCAN_MODE_BALANCED)
                 .setCallbackType (ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
                 .build (),...
Run Code Online (Sandbox Code Playgroud)

此设置适用于所有设备。但每部智能手机都会给你带来不同的错误,这会导致混乱。