BLE扫描
蓝牙扫描想必是蓝牙使用者最常操作的动作吧,那大家了解传统扫描和BLE扫描的区别吗?本篇我们就简单聊聊BLE扫描(scan)那点事。
- 传统扫描:Inquiry,扫描周围环境中的BR/EDR蓝牙设备,常见于设置-蓝牙中的搜索
- BLE扫描:Scan,扫描周围环境中的低功耗蓝牙设备,常见于第三方APP搜索低功耗蓝牙(手环、手表、体脂秤等应用中)
简单的BLE扫描其实也是分为多种扫描方式,按照协议主要分为如下两种:
- Passive Scanning — 被动扫描,蓝牙设备被动扫描周围环境中对等设备发送出来的广播包并直接上报到Host
- Active Scanning — 主动扫描,蓝牙设备主动扫描来获取更多对端设备的信息上报Host,为后续建立链路做准备
因此BLE的主动扫描相比于被动扫描更具优势(获取更多信息),接下来以Active Scan为主进行分析。
不管是主动还是被动扫描,BLE scan的基本流程为:设置扫描参数 -> 使能扫描 -> Controller上报扫描结果 -> 停止扫描,经过如上四步则整个BLE扫描完成。
设置扫描参数
Host设置BLE扫描所必须的参数到Controller,这样Controller才知晓扫描上报哪类低功耗设备信息。
- LE_Scan_Type:扫描类型,就是上面所说的被动扫描(type = 0)和主动扫描(type = 1)
- LE_Scan_Interval、LE_Scan_Window:扫描的窗口和间隔,Range: 0x0004 ~ 0x4000,因此扫描的这两个时间范围:2.5 ms ~ 10.24 s,Interval <= Window。如果这两个参数设置成相同值,则Controller会连续运行扫描占满资源而无法执行其他ble任务
- Own_Address_Type:本端设备的扫描请求数据包中使用的地址类型
- Scanning_Filter_Policy:BLE扫描的过滤策略,Controller依据该过滤策略只上报Host关心的设备信息
使能扫描、停止扫描
Host启动和停止扫描,启动扫描后Controller发现周围环境中的广播设备。
- LE_Scan_Enable:使能还是停止扫描,使能—1、停止—0
- Filter_Duplicates:是否开启广播重复过滤,开启enable—1、关闭disable—0,开启后可避免Host在BLE扫描期间接收到重复的低功耗设备信息,该值只有在扫描使能才会生效
Controller上报扫描结果
BLE扫描过程中一个或多个低功耗蓝牙设备对主动扫描作出了响应,或者在被动扫描期间收到了广播。 控制器Controller依次将扫描到的这些设备信息上报给Host。
BLE扫描流程中涉及到的HCI命令和事件如上所述,如果本端蓝牙芯片支持扩展广播能力,则以上指令使用对应的扩展命令即可。
本端蓝牙芯片是否支持扩展广播能力参考蓝牙初始化阶段HCI命令 HCI_LE_Read_Local_Supported_Features 中芯片侧的回复。
本篇基于蓝牙4.2协议分析的BLE扫描到这儿就结束了,最新协议5.2上还涉及到周期广播的扫描以后有机会再给大家分享。感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!
更多互联互通技术,欢迎关注微信公众号:Connectivity