蓝牙的广播有以下参数:
- Advertising interval 广播间隔
- Advertising_Type 广播类型
- Own_Address_Type 自身地址类型
- Direct_Address_Type 定向地址类型
- Direct_Address 定向地址
Advertising interval
广播间隔就是指从设备需要多长时间发送一次广播数据。
广播间隔设置过长会导致主机扫描的时间过长,但是从机的广播阶段的功耗会降低很多。
广播间隔设置的短,则主机扫描连接更顺畅,相应的从机的广播功耗变大。
这里应该设置为200ms到1s之间,超过1s链接的体验就非常差了。
Advertising Type
广播类型分为可连接的非定向广播,可连接的定向广播,不可连接的非定向广播和可扫描的非定向广播。
可连接的非定向广播
这是一种用途最广泛的广播类型,它代表当前设备可以接受其它设备的连接请求,他既可以被主设备扫描到,也可以被主设备发起连接。
可连接的定向广播
定向广播类型是为了尽可能快的建立链接,这种报文包含两个地址:广播设备地址,发起连接者的地址。发起连接者受到定向广播报文后,可以立即发起连接请求作为回应。定向广播的类型有特殊的时序要求,完整的广播事件必须每3.75ms重复一次,这样高频率的广播会让扫描设备在3.75ms后就收到这个定向广播,但是定向广播会占满广播信道,因此定向广播的时间有一个上线,不可以持续超过1.28s。也就是说,设备开启定向广播后,不支持被主动扫描,快速发送1.28s的定向广播,如果没有主机发起连接,则进入正常的非定向链接广播类型。这种定向广播主要用于配对好的设备进行快速链接使用,但要注意,定向广播的报文中除了两个地址外,不能有其他的附加数据。
不可连接的非定向广播
这种广播类型仅仅发送广播数据,而不想被扫描和链接,这是唯一可用于只有发射机而没有接收机设备的广播类型。
不可连接设备不会进入连接态,因此,它只能根据主机的要求在广播态和就绪态之间切换。
常用于 BLE Mesh、Beacon项目。
可扫描的非定向广播
又称可发现广播,这种广播不能用于发起连接,但允许其他设备扫描该广播设备。这意味着该设备可以被发现,既可以发送广播数据,也可以响应扫描,发送扫描回应数据,但不能建立连接。这是一种适用于广播数据的广播形式,动态数据可以包含与广播数据之中,而静态数据可以包含于扫描响应数据之中。
BLE设备的MAC地址类型
MAC全称:Meida Access Control,设备的媒体存取控制地址。BLE设备的MAC地址分类如下:
Public Device Address 公共设备地址
公共设备地址是全球唯一的,48bit全部需要向IEEE申请购买。其中,高24bit是公司的标识,由IEEE进行分配,低24bit由公司内部自行定义。
Random Device Address 随机设备地址
该地址是BLE协议新增的一种地址类型,该类型的设备地址不是固定分配的,而是设备启动后随机生成的。最高两位规定为“11”,剩下的46bit是一个随机数,不能全部为0或者1。这46位随机数在一个上电周期内保持不变,下一次上电时可以改变(随机地址),也可以保持不变(静态地址)。
Private Device Address 私有设备地址
通过定时更新和地址加密两种方式,提高蓝牙地址的可靠性和安全性。根据地址是否加密分为Non_Resolvable Private Address和Resolvable Private Address。Non_Resolvable Private Address:该地址不加密,不需要解析,会定时更新。相对安全,手机的蓝牙MAC地址一般属于这类。
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。这种方式可以确保自己的主设备只有自己的从设备可以扫描到,且不会被第三方监测。
注意:
- 公共地址和随机地址之间很难区分,因此广播数据中有一位来标记抵制类型,也就是头部信息中的TxAdd或者RxADD,0表示公有地址,1表示随机地址。为了防止被冒充、为了隐私,建议使用“可解析私有地址”。一个设备,它可能有公有地址,但是它仍可同时使用“可解析私有地址”。一个设备,它上电后使用了静态地址,但是它仍可同时使用“可解析私有地址”。
一个设备可以使用变化的“可解析私有地址”,它是一个相对固定的地址。这个相对固定的地址,就是“Identity Address”,它可以是公有地址也可以是自定义的静态地址。