【问题标题】:Understanding Android BLE ScanSettings parameters了解 Android BLE ScanSettings 参数
【发布时间】:2018-05-03 21:39:10
【问题描述】:

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

在积极模式下,即使信号强度微弱且持续时间内的目击次数/比赛次数很少,硬件也会更快地确定比赛。

int MATCH_MODE_STICKY

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

setNumOfMatches 声称可以处理每个过滤器的广告数量,但所有记录的参数似乎都没有影响,我仍然从同一个外围设备获得了一堆没有改变的数据包,看起来大约在无论参数如何,速率都相同。

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

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

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

【问题讨论】:

  • 我也有同样的问题。你解决过这个问题吗?
  • 这里有同样的问题。有更新吗?
  • 我解决它的方法是实现我自己的包过滤器,它在发现时运行并自己限制回调。不幸的是,此 API 的行为在操作系统版本和 OEM 之间并不一致。

标签: android bluetooth-lowenergy


【解决方案1】:

这样设置代码:

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

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

【讨论】:

    【解决方案2】:

    我最近不得不实现对停止广告的设备做出反应(更新可用 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 的情况下进行扫描时,此配置会触发错误回调,这可能是您最初的问题吗?

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多