案例1--蓝牙扫描设备过程分析
应用层发起搜索蓝牙设备,Android 官方提供的蓝牙扫描方式有三种,分别如下:
- BluetoothAdapter.startDiscovery(); //可以扫描经典蓝牙和BLE两种。
- BluetoothAdapter.startLeScan();//扫描低功耗蓝牙,在api21中已弃用,不过还是可以使用
- BluetoothLeScanner.startScan();//新的BLE扫描方法
当应用层调用startDiscovery()时,Host会通过HCI发送一个 Inquiry HCI Command给 Controller。接下来我们会通过分析HCI log,来学习Inquiry的流程。在分析HCI log前,我们先来学习下HCI Command数据包的结构。
1.1 HCI Command 数据包结构
HCI Command数据包结构定义在蓝牙核心协议规范Core_v5.3.pdf中。
HCI Command数据包格式如下,开头的Opcode是区分不同类型的命令的唯一标识,Opcode由OpCode Group Field (OGF) 和 OpCode Command Field (OCF)组成。根据OGF的值,可以将HCI commands进行分类。OpCode 的计算公式为:** OpCode = OGF << 6 + OCF 。有了OpCode计算的方式,我们就可以通过OpCode过滤**HCI log里面的指定类型的HCI Command。
HCI Command packet
OpCode 计算方法
1.2 过滤 Inquiry Command
Inquiry Command 是 Link Control command 类型的command,通过查询 Bluetooth Core Specification 中的 Vol4-> Part E-> 7.1Link Control Command小节,可知,Link Control Command的 OCF值为 0x0001.
Bluetooth Core Specification V5.3
Inquiry Command
因此,Inquiry Command 的Opcode 为 0x0001 << 6 + 0x01 = 0x0401,通过0x0401就确定某条command为 Inquiry Command,该命令的名称为 HCI_Inquiry。
ComProbe Protocol Analysis System 支持过滤功能,通过设置filter可以过滤出 Opcode为 0x0401的log,设置方法如图:
过滤HCI_Inquiry
1.3 扫描过程分析
1.发送Inquiry请求
- Host发送 Command: HCI_Inquiry
应用层要进行蓝牙设备扫描,Host先发一条 HCI_Inquiry的Command 通知 Controller
HOST发送HCI_Inquiry
- Controller回复HCI Event
Controller在收到HCI_Inquiry这条Command后,会回复一条Command Status的HCI Event,来表示Controller执行HCI_Inquiry后的状态,即Status: Success。并且这两条HCI log的Frame标号是挨着的,HCI_Inquiry的帧号是127,Command Status的帧号是128。
Controller:Command status
2.扫描结果
扫描完成后,Controller会发送Event: HCI Extended Inquiry Result。以列表中搜索到的Jabra Classic v0.5.3为例,它的HCI Extended Inquiry Result数据包中会包含它的设备名称、它所支持的Service的UUID,和设备类型:Wearable Headset device,因此,Jabra Classic v0.5.3的Icon是一个耳机的图标。
扫描结果
HCI日志详情
以上就是大致的蓝牙搜索到列表显示的流程分析。