目录
1.BLE设备的MAC地址分类
BLE全称:Bluetooth Low Energy,低功耗蓝牙。
MAC全称:Media Access Control,设备的媒体存取控制地址,分类
2. MAC地址分类详解
Public Device Address(公共设备地址):
该MAC地址是唯一的,48bit需要向IEE申请购买,高24bit是公司标识,由IEEE分配,低24bit由公司内部自行定义。
Random Device Address(随机设备地址):
该地址是BLE协议新增的一种地址类型,该类型的设备地址不是固定分配的,而是设备启动后随机生成的。最高两位为“11”,剩下的46bit是一个随机数,不能全部为0或者1,。这46位随机数在一个上电周期内保持不变,下一次上电时可以改变,也可以保持不变。
Private Device Address(私有设备地址):
通过定时更新和地址加密两种方式,提高蓝牙地址的可靠性和安全性。根据地址是否加密分为Non_Resolvable Private Address和Resolvable Private Address。
1)Non_Resolvable Private Address:该地址不加密,不需要解析,会定时更新。相对安全,手机的蓝牙MAC地址一般属于这类。
2)Resolvable Private Address:该地址加密,需要解析,会定时更新。该类型的地址不能单独使用,需要和Public Device Address或者Static Device Address结合使用。
通过一个随机数和一个称为Identify Resolving Key(IRK)的密码生成地址,对地址进行加密。因此只能被具有相同IRK的设备扫描到,可以避免被未知设备扫描和追踪。低24位是随机数和IRK经过hash运算得到的hash值。
当对端BLE设备扫描到该类型的蓝牙地址后,会使用保存在本地的IRK和该地址中的Prand进行相同的hash运算,并将运算结果和地址中的hash字段比较,如果相同才进行后续操作,这个过程称为resolve(解析)。如果不同则继续使用下一个IRK重复上述过程,直至找到一个关键的IRK或者一个也找不到。
3. 扫码机制
扫描是主机设备在一定范围内寻址其他低功耗蓝牙设备广播的过程。扫描设备在扫描过程中活使用广播信道。
在BT 4.2协议中,广播包大小为31B,如果主机采用主动扫描,还有一个31B的广播回包,最多可实现63个字节的空间。BT5.0中,把广播信道抽象为两种,一种是主广播信道,类似于蓝牙4.x的广播,只在37,38,39三个信道工作,最大广播广播包大小为31个字节。另一种叫次广播信道,或者第二广播信道,允许在三个通道外的其他37个信道上发送长度在255B之内的数据。
1) 被动扫描
扫描设备仅仅监听广播,不向广播设备发送任何数据。 注意:被动扫描不会向从设备发送任何数据。
2)主动扫描
主动扫描可以捕获到对端设备的广播数据包,还可以捕获到响应包,并区分这两种包。主机会给从设备发送一个扫描请求,从设备返回一个扫描响应包,同样也产生一个包含扫描响应数据的Adv_Report事件给主机。
4. 扫描参数
在执行扫描之前会先设置扫描参数,接着进行扫描初始化,调用nrf_ble_scan_start()启动主机扫描。LE扫描参数如下:
命令 | 操作码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_LE_Set_Scan_Parameters | 0x000B | LE_Scan_Type | Status |
LE_Scan_Interval | |||
LE_Scan_Window | |||
Own_Address_Type | |||
Scanning_Filter_Policy |
- LE_Scan_Type:设置扫描类型,1B
参数值 | 功能描述 |
0x00 | 被动扫描,不发送PDUs(默认) |
0x01 | 主动扫描。可以发送PDUs |
0x02-0xFF | 预留值 |
- LE_Scan_Interval:扫描的时间间隔,2B,是指从控制器开始最后一次LE扫描到后续LE扫描的时间间隔。默认10ms,时间范围为:2.5ms ~ 10.24s。
- LE_Scan_Window:扫描的持续时间,2B,默认10ms,时间范围2.5ms ~ 10.24s。
- Own_Address_Type:表示主机扫描解析地址,1B。
- Scanning_Filter_Policy:表示主机扫描过滤策略,1B。
参数值 | 功能描述 |
0x00 | 接受所有广播,除了定向广播不发送到这个设备,默认 |
0x01 | 只接受来自广播客户地址在白名单中的设备广播包。 |
0x02 | 接受所有广播,除了定向广播包,其中发起者的身份地址不针对这个设备。 |
0x03 | 接受所有广播 |
0x04-0xFF | 预留值 |
5. 关闭扫描
- 主函数不需要关闭主机扫描,但是有几处关闭扫描的位置:
- 在开始设置扫描参数的nrf_ble_scan_default_param_set()里,会先调用nrf_ble_scan_stop()关闭之前的扫描。
- 在启动主机扫描函数nrf_ble_scan_start()里,调用协议栈开始扫描之前会调用nrf_ble_scan_stop()关闭之前的扫描。
- 在扫描完成后,主机发起连接时,连接从设备的函数中回调nrf_ble_scan_stop()关闭扫描。
- 在扫描参数timeout扫描超时时,超过指定时间后,没有扫描到设备将自动停止扫描。