基于 BLE 5.1 协议 Core Spec。
目录
1、White List
2、Advertising Filter Policy
3、Scanner Filter Policy
4、Initiator Filter Policy
5、Configuration
BLE 提供设备地址过滤机制,设备的过滤机制是基于 White List(白名单,也称白表)。旨在Link Layer进行设备回应机制的最小化。在不同的 State 会有不同的 filter 策略,按照 State 来分为:
Advertising State 过滤策略
Scanning State 过滤策略
Initiating State 过滤策略
白名单,可以理解为一组设备地址的集合,Link Layer 通过记录在白名单上的地址信息(地址和地址类型),在不同的 State 启动不同的过滤策略。
注:White List 属于一个功能,可以开启,也可以关闭
White List (后面简称 WL)中存储的白名单,由上层指定。那么一个系统有多少个 WL 呢?肯定不是无限个。这个和具体的 BLE BaseBand 的硬件实现有关系,绝大多数情况下,WL 过滤都是由硬件来做的(软件做也行,不过每次都要收包后,再去判断,这样造成工作量非常之大),硬件来做这个的话,就需要消耗硬件资源来存储地址信息,所以不同的基带实现,会有不同的 WL 支持的个数。上层可以通过 HCI 命令,来获取 Link Layer 支持的 WL 的设置个数(Link Layer 其实是和硬件交互,返回硬件能够支持的 WL 的个数)。上层知道最多能够同时存在多少个 WL,就可以更好的进行配置,利用。
在系统初始化初期,WL 为空(合理)。后续根据业务情况,上层进行配置。
Advertising Filter Policy 过滤策略指明了 Advertising 如何处理 Scan 和 Connection 请求。
注:如果 Link Layer 使用如下类型的广播,那么 Advertising Filter Policy 过滤策略被忽略:
1、non-connectable and non-scannable directed advertising events
2、scannable directed advertising events
3、connectable directed advertising events
其实翻译一下,就是定向广播不用过滤策略,因为定向广播指定了对端的地址,这就算是过滤了。
Advertising Filter Policy 过滤策略有 4 种 Mode,并且同一时间只能处于其中一种 Mode:
Mode
Advertising Filter Policy
1
Link Layer只接受位于 WL 白名单中的设备的 Scan 和 connection 请求(最严格);
2
Link Layer可以接受任何设备的 Scan 和 connection 请求(最不严格,Controller reset后的默认状态);此时白名单无作用
3
Link Layer可以接受任何设备的 Scan 请求,但只接受位于白名单中的设备的 connection 请求;
4
Link Layer可以接受任何设备的 connection 请求,但只接受位于白名单中的设备的 Scan 请求;
因为 Scanner 只和 Advertising 交互,故 Scanner Filter Policy 指明了扫描者如何处理 Advertising Packages,在同一时刻,使用且仅仅只能使用下述策略中的一种过滤策略:
Mode
Scanner Filter Policy
1
Link Layer 只处理位于白名单中的设备的广播数据,并且忽略没有包括该 Scanner 的 Connectable Directed advertising packet;
2
Link Layer 处理所有设备的广播数据,并且忽略没有包括自身地址的 Connectable Directed advertising packet(Controller reset后的默认状态),此时白名单无作用
注:如果 Link Layer 支持 Extended Scanner Filter 策略,则下述策略也需要支持
Mode
Scanner Filter Policy
3
Link Layer 只处理位于白名单中的设备的广播数据,并且不能忽略InitA地址为“resolvable private address”的connectable Directed advertising packet;
4
Link Layer处理所有设备的广播数据,并且不能忽略InitA地址为“resolvable private address”的connectable Directed advertising packet。
因为 Initiator 只和 Advertising 交互,故 Initiator Filter Policy 指明了扫描者如何处理 Advertising Packages,在同一时刻,使用且仅仅只能使用下述策略中的一种过滤策略:
Mode
Initiator Filter Policy
1
Link Layer只处理位于白名单中的设备发送的可连接的广播包,并在收到的时候发起连接请求;
2
忽略白名单,Link Layer处理由Host指定的设备所发送的可连接的广播包,并在收到的时候发起连接请求。
综上所述,我们知道了白名单机制是用于过滤的,不同的状态,有自己的 Mode,那么我们怎么样告诉 Link Layer ,我们想让当前的状态处于什么 Mode 呢?当然也是由上层发送给的 HCI 指定的。打个比方,我们要开启一个 ADV,根据开启 ADV 的流程,先需要配置 ADV 的参数,我们看看这一条 HCI:
看到最后一个参数了么,这个参数就决定了我们将要启动的这个 ADV 的 Fliter Policy,我们看看这个字段的解释:
看到了么,这里的 4 个 Mode,就对应到了 Link Layer 让 Advertising 进入的 Fliter Polcy 的 Mode。
其他两个状态类似,这里不再多说。