【发布时间】: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_MATCH 和 CALLBACK_TYPE_MATCH_LOST 似乎根本不起作用。
不幸的是,这意味着我收到大量类似的数据包,触发了我现在必须处理的代码中的连锁反应。
如何配置扫描,以便仅在广告包更改或外围设备停止广告时收到通知?我是否在这里遗漏了什么,或者那是不可能的。
【问题讨论】:
-
我也有同样的问题。你解决过这个问题吗?
-
这里有同样的问题。有更新吗?
-
我解决它的方法是实现我自己的包过滤器,它在发现时运行并自己限制回调。不幸的是,此 API 的行为在操作系统版本和 OEM 之间并不一致。
标签: android bluetooth-lowenergy