一、BR/EDR/BLE简介
BR的数据速率为 721.2 kb/s,EDR的数据速率为 2.1 Mb/s,LE 系统包含的功能旨在使产品比 BR/EDR 需要更低的功耗、更低的复杂性和更低的成本。
1、BR/EDR
通过BR/EDR连接的两个设备在物理无线电信道上使用相同的时钟和跳频模式。 一台设备提供同步参考,称为中央设备(Central)。 与中央设备的时钟和跳频模式同步的所有其他设备称为外设(Peripheral)。 以这种方式同步的一组设备形成一个微微网。 这是蓝牙 BR/EDR 无线技术中通信的基本形式。
微微网中的设备使用特定的跳频模式,该模式由中央设备的蓝牙地址和时钟中的某些字段通过算法确定。 基本跳频模式是 ISM 频段中 79 个频率的伪随机排序,频率间隔为 1 MHz。
蓝牙技术通过使用时分双工(TDD)方案提供全双工传输的效果。
在物理信道之上有链路和通道以及相关控制协议的分层。 信道和链路的层次结构从物理信道向上是物理信道、物理链路、逻辑传输、逻辑链路和L2CAP信道。
通常在物理信道内,在中央设备和一个或多个外围设备之间形成物理链路(查询扫描和寻呼扫描物理没有关联的物理链路), 物理链路提供中央设备和外设之间的双向数据包传输。
物理链路用作一个或多个逻辑链路的传输,这些逻辑链路支持单播同步、异步和等时流量以及广播流量。 通过占用资源管理器中的调度功能分配的时隙,将逻辑链路上的流量复用到物理链路上。
除了用户数据之外,逻辑链路还承载基带和物理层的控制协议, 这就是链路管理器协议(LMP)。微网中活动的设备具有默认的异步面向连接的逻辑传输,用于传输 LMP 协议信令,称为 ACL 逻辑传输。
在基带之上,L2CAP(逻辑链路控制和适配协议)层为应用程序和服务提供了基于信道的抽象。
2、BLE
LE包含 LE 1M PHY和LE 2M PHY, LE 1M PHY可以选择支持纠错编码,称为 LE 编码PHY。 LE 2M PHY仅支持未编码数据。
LE 1M 和 LE 2M 统称为 LE 未编码PHY。
LE采用两种多址方案:频分多址(FDMA)和时分多址(TDMA)。 FDMA 方案中使用 40 个物理信道,间隔2 MHz。 3 个用作主广播信道,37 个用作通用信道(包括作为辅助广播信道)。 使用基于TDMA的轮询方案时,一个设备在预定时间发送报文并且对端设备在预定间隔之后发送报文进行响应。
物理信道被细分为称为事件(event)的时间单位。 数据在这些事件中以数据包的形式在 LE 设备之间传输。存在以下类型的事件:广播、扩展广播、定期广播、连接和同步事件。
在广播 PHY 信道上发送广播数据包的设备称为advertiser, 在广播物理信道上接收广播数据包但无意连接到广播设备的设备称为scanner。
当一台设备需要与另一台设备形成 ACL 连接时,会监听可连接的广播数据包,此类设备称为initiator。 如果advertiser正在使用可连接广播事件,则initiator可以使用其接收到的可连接广播数据包的同一广播PHY信道来发出连接请求。 如果advertiser收到并接受发起连接的请求,则广告事件结束并且连接事件开始。 一旦建立连接,initiator就成为所谓的微微网中的中心设备(Central),而advertiser则成为外围设备(Peripheral)。
使用 ACL 连接,中央设备可以使用等时物理信道建立一个或多个等时连接。 等时连接通过逻辑传输在 Central 和 Peripheral 之间传输等时数据,此逻辑传输称为连接等时流(CIS)。 一个CIS 由若干个定期(间隔ISO_Interval)发生的 CIS 事件组成,每个 CIS 事件都包含一个或多个子事件。
一个设备可以使用等时无连接逻辑传输在等时物理信道上广播等时数据。 一个等时无连接逻辑传输称为一个广播等时流(BIS)。 BIS 由定期(间隔ISO_Interval)发生的 BIS 事件组成。 每个BIS事件由一个或多个子事件组成。在每个子事件中,广播设备传输等时数据包。 每个子事件使用通过通道选择算法确定的 PHY 通道。
在BLE的物理信道之上也有链路、信道和相关控制协议的概念。 层次结构同样是物理信道、物理链路、逻辑传输、逻辑链路和L2CAP信道。
在物理信道内,设备之间形成物理链路。活动物理链路提供中央设备和外设之间的双向数据包传输。物理链路用作支持异步流量的一个或多个逻辑链路的传输。
除了用户数据之外,逻辑链路还承载链路和物理层的控制协议, 这就是链路层协议(LL)。 微微网中活动的设备具有默认的 LE 异步连接逻辑传输(LE ACL),用于传输 LL 协议信令。 默认LE ACL 是在创建微微网时创建的。
总体而言,微微网由活动物理链路上的一个 ACL 逻辑传输 加上等时物理链路上的零个或多个 CIS 逻辑传输组成。
同 BR/EDR 中一样,在链路层之上,L2CAP 层为应用程序和服务提供基于信道的抽象。除了 L2CAP 之外,LE 还提供位于 L2CAP 之上的两个附加协议层。 安全管理器协议(SMP)使用固定的L2CAP通道来实现设备之间的安全功能。 另一种是属性协议(ATT),它提供了一种通过固定L2CAP 信道传送少量数据的方法。 设备还使用ATT来确定其他设备的服务和功能。 ATT也可以在 BR/EDR 上使用。
3、BR/EDR物理信道分类
蓝牙物理信道不同于wifi信道只与频率相关,蓝牙的物理信道是一组与时间参数和空间因素相关的 PHY 频率。某一个频率在某一时刻可以作为基本微微网信道,在下一时刻可能会是适应性微微网信道。
3.1 基本微微网信道
基本微微网信道用于正常操作期间已连接的设备之间的通信。
3.2 适应性微微网信道
适应性微微网信道可以基于少于79个频率,在存在干扰或其他特殊情况下,蓝牙设备可以动态调整跳频序列,以避开受干扰的信道。
3.3 查询扫描信道
为了发现设备,需要使用查询扫描信道。 可发现设备在其查询扫描信道上侦听查询请求,然后发送对该请求的响应。 为了让设备发现其他设备,它以伪随机方式迭代(跳跃)所有可能的查询扫描信道频率,在每个频率上发送查询请求并侦听任何响应。
查询扫描通道遵循较慢的跳频模式,并使用访问码来区分使用不同物理信道的两个共置设备偶尔占用的同一射频。
3.4 寻呼扫描信道
- 可连接设备在其寻呼扫描信道上监听寻呼请求,一旦接收到,就进入与该设备的一系列交换。
- 寻呼扫描信道使用比基本微微网信道和适应性微微网信道更慢的跳跃率。
- 使用寻呼扫描信道的设备一直保持被动状态,直到收到来自另一个蓝牙设备的寻呼请求。
- 在寻呼过程成功结束之后,两个设备都切换到基本微微网信道,其特征在于以寻呼设备为中心设备。
3.5 同步扫描信道
同步扫描信道的主要作用是帮助设备获取定时和频率信息,以恢复微微网时钟,接收在CPB(无连接外设广播)逻辑传输上发送的数据包。
4、BLE物理信道
BLE系统定义了四个 LE 物理信道。 每个都经过优化并用于不同的目的。
4.1 LE 微微网物理信道
用于连接设备之间的通信,并与特定微微网关联。
4.2 LE 广播物理信道
使用37、38、39三个信道,用于在两个设备之间建立连接或在未连接的设备之间传递广播信息。 这些广播可用于发现、连接用户数据或将用户数据发送到扫描仪或initator设备。
4.3 周期性物理信道
用于用于在未连接的设备之间建立周期性广播。以指定的间隔在周期性通告中将用户数据发送到扫描仪设备。
4.4 LE 等时物理信道
用于在定期发生的同步事件中传输同步数据。 LE 微微网中的 LE 设备之间传输等时数据,或在未连接的 LE 设备之间传输同步数据。
5、RF信道
BR/EDR、BLE RF信道都使用2400-2480的频率范围。BR/EDR分为0-78共79个RF信道,每个信道间隔1MHz。BLE RF信道使用0-39共40个RF信道,每个信道间隔2MHz,其中37、38、39为广播物理信道。
6、蓝牙设备地址
6.1 BR/EDR的地址:
每个蓝牙设备应分配一个唯一的48位蓝牙设备地址(BD_ADDR)。该地址应为根据IEEE 802-2014标准创建的48位扩展唯一标识符(EUI-48)。该地址需要从IEEE注册机构获取。该地址被分为LAP(Lower Address Part)、UAP(Upper Address Part)、NAP(Non-significant Address Part)三部分。
如下图所示为LAP、UAP和NAP如何映射到EUI-48。除了用于通用和专用查询的64个保留LAP值的地址外,BD_ADDR可以取任何值。
6.1.1 保留地址
一块连续的64个LAP被保留用于查询操作,地址范围是0x9E8B00~0x9E8B3F;其中一个LAP是所有设备通用的(0x9E8B33),保留用于通用查询,其余63个LAP保留用于特定类别设备的专用查询(见分配编号)。
无论UAP和NAP的内容如何,都使用相同的LAP值。因此,这些LAP中的任何一个都不能作为用户BD_ADDR的一部分。所有地址的最低有效位(LSB)在最右边位置,采用十六进制表示。每当使用保留的LAP地址时,默认检查初始化(DCI)用作UAP。DCI定义为0x00(十六进制)。
6.2 BLE的设备地址:
BLE设备地址分为两大类:公共设备地址和随机设备地址,二者都是48位。当地址类型不同时,即使两个48位地址相同,BLE设备地址也是不同的。
BLE设备应至少使用一种类型的设备地址,也可以同时使用两种。任何设备都可以通过此设备地址对此设备进行寻址。
设备的身份地址是其在传输数据包中使用的公共设备地址或随机静态设备地址。如果设备使用可解析私有地址,它还应具有一个身份地址。
6.2.1 公共设备地址
BLE的公共设备地址格式同BR/EDR一样,也是需要向IEEE注册管理机构获取。但如果BLE的公共设备地址也用作BR/EDR控制器的BD_ADDR,则对LAP值的限制不适用。
6.2.2 随机设备地址:
随机设备地址分为两类:静态地址和私有地址。
具体的子类型由随机设备地址的两个最高有效位指示,如下表所示。传输随机设备地址是可选的。设备应接受来自远程设备的随机设备地址。
6.2.2.1 静态设备地址
静态地址是一个48位随机生成的地址,并应满足以下要求:
- 地址的随机部分至少有一位是0
- 地址的随机部分至少有一位是1
设备可以选择在每次断电重启后将其静态地址初始化为一个新值。设备一旦初始化了静态地址,在断电重启之前不得更改其静态地址值。
注意:如果设备的静态地址发生变化,那么存储在远端设备中的地址将不再有效,并且将无法使用旧地址重新连接远端设备。
静态地址的格式如下图所示。
6.2.2.2 私有设备地址生成
私有地址分为两类:不可解析的私有地址和可解析的私有地址。
6.2.2.2.1 不可解析私有地址
要生成一个不可解析的地址,设备应生成一个48位的地址,并满足以下要求:
- 地址的随机部分至少有一位是1
- 地址的随机部分至少有一位是0
- 该地址不得等于公共地址
不可解析的私有地址的格式如下图所示。
6.2.2.2.2 可解析私有地址
要生成一个可解析的私有地址,设备必须具有Local IRK(身份解析密钥)或Peer IRK。可解析的私有地址应使用IRK和一个随机生成的24位数字生成,这个24位随机数称为prand,并应满足以下要求:
- prand的随机部分至少有一位是0
- prand的随机部分至少有一位是1
可解析的私有地址的格式如下图所示。
哈希值是使用随机地址函数ah生成的,输入参数为设备的IRK和prand。
hash = ah(IRK, prand)
prand和hash连接在一起生成随机地址(randomAddress),如下所示:
randomAddress = prand || hash
hash的最低有效字节成为randomAddress的最低有效字节,而prand的最高有效字节成为randomAddress的最高有效字节。
6.2.2.3 私有设备地址解析
如果对应设备的IRK可用,则可以使用此过程解析可解析的私有地址。如果成功解析了一个可解析的私有地址,设备可以将该地址与远端设备关联起来。
可解析的私有地址(RPA)分为24位的随机部分(prand)和24位的哈希部分(hash)。RPA的最低有效字节成为hash的最低有效字节,而RPA的最高有效字节成为prand的最高有效字节。然后使用随机地址哈希函数ah生成localHash值,输入参数k设置为已知设备的IRK,输入参数r设置为从RPA提取的prand值:
localHash = ah(IRK, prand)
然后将localHash值与从RPA提取的hash值进行比较。如果localHash值与提取的hash值匹配,则远端设备的身份已被解析。
如果设备存储了多个IRK,设备会对每个存储的IRK重复上述过程,以确定接收到的可解析私有地址是否与某个存储的IRK相关联,直到其中一个IRK成功解析地址或所有IRK都已尝试过。
注意:无法在T_IFS内解析私有地址的设备可以在接收到下一个事件时响应。
不可解析的私有地址无法被解析。
7、BR/EDR拓扑
在微微网A 中,有两个物理信道。 设备 B 和 C 使用基本微微网物理通道(由蓝色外壳表示),因为它们不支持自适应跳频。 设备 D 和 E 能够支持自适应跳频,并且正在使用适应性微微网物理信道(由红色外壳表示)。 设备 A 能够自适应跳频,并在 TDM(Time Division Multiplexed 时分复用) 基础上在两个物理信道上运行,根据该物理信道对外设进行寻址。
微微网D 和微微网F 都仅使用基本微微网物理信道(分别由青色和洋红色外壳表示)。 在微微网D 的情况下,这是因为设备 J 不支持自适应跳频模式。 尽管设备 D 支持自适应跳频,但它无法在此微微网中使用它。 在微微网F中,设备F不支持自适应跳频,因此不能在该微微网中使用。
微微网M(由橙色外壳表示)使用自适应微微网物理信道上的无连接外围广播物理链路,将配置文件广播数据从发送器设备 M 发送多个接收器设备(包括E 和 N)。
设备 K 与其他设备位于同一位置。 它当前不是微微网的成员,但具有向其他蓝牙设备提供的服务。它当前正在侦听其查询扫描物理信道(由绿色外壳表示),等待来自另一个设备的查询请求。
设备 L 与其他设备位于同一位置。 它当前不是微微网的成员,但当前正在监听其同步扫描物理信道(由棕色外壳表示),等待来自另一个设备的同步序列。
8、BLE拓扑
实线箭头从Central指向Peripheral; 虚线箭头,指示连接发起,使用可连接的广播事件从initiator指向advertiser; 正在广播的设备用星号表示。
设备 A 是两个微微网(由阴影区域表示)中的中心设备,设备 B 和 C 分别作为外围设备。 与 BR/EDR 外设不同,BLE 外设不与中央设备共享单个微微网或通用物理信道。 每个外围设备通过单独的物理信道与中央设备进行通信。
- 发起广播的设备是 advertiser,如D、C、H、K、R.
- 准备发起连接的设备是 initiator,如 A、N、O.
- 在LE广播物理信道监听的设备是 scanner,如 E、I、J.
设备 A 和 B 使用一个 LE 微微网物理信道(由蓝色外壳和深灰色背景表示)。 设备 A 和 C 正在使用另一个 LE 微微网物理信道(由蓝色外壳和浅灰色背景表示)。
设备 D 使用可连接的广播事件在广播物理信道(由绿色外壳表示)上进行广播,设备 A 是initiator。 设备 A 可以与设备 D 建立连接,创建一个新的微微网。
设备 C 还使用设备 E(scanner)捕获的任何类型的广播事件在广播物理信道(由橙色外壳表示)上进行广播。 设备 C 和 D 可能使用不同的广播 PHY 信道或不同的时序来避免冲突。
设备 F 和 G 使用一个微微网和 一个LE 微微网物理信道(由浅绿色外壳表示)。 设备 F 是 Central,设备 G 是 Peripheral。
设备 H、I 和 J 正在使用 LE 广播物理通道(由紫色外壳表示)。 设备 H 是advertiser,设备 I 和 J 是scanners。
在涉及设备K的分散网中,设备K和L正在使用一个微微网和LE微微网物理信道。 设备 K 和 M 正在使用另一个微微网和 LE 微微网物理信道。 设备 K 也在广播物理信道上使用可连接的广播事件进行广播,并且设备 N 是 initiator。设备N可以与设备K形成连接,导致设备K同时成为两个设备的外围设备和一个设备的中心设备。
在涉及设备 O 的分散网中,设备 O 和 P 使用一个微微网和 LE 微微网物理信道。 设备 O 和 Q 正在使用另一个微微网和 LE 微微网物理信道。 设备 R 正在使用广播物理通道上的可连接广播事件进行广播,并且设备 O 是 initiator。 设备O可以与设备R形成连接,导致设备O同时成为两个设备的外围设备和一个设备的中心设备。
9、蓝牙packets格式
-
1)BR报文格式
-
2)EDR报文格式
-
3)LE UNCODED PHYS报文格式
-
4)LE CODED PHY报文格式
10、BR/DER报文类型:
微微网中使用的数据包与其所使用的逻辑传输相关。BR/EDR定义了四种具有不同数据包类型的逻辑传输:SCO(Synchronous Connection-Oriented)、eSCO(Extended Synchronous Connection-Oriented)、ACL(Asynchronous Connection-Oriented)、CPB(Connectionless Peripheral Broadcast)。
10.1)通用数据包类型
BR/EDR一共有五种常见的通用数据包。除了表6.2中段1列出的类型外,ID数据包也是一种常见的数据包类型,但由于它没有数据包头,因此未列在表6.2段1中。
-
ID packet
ID packet由设备访问码(DAC-device access code)或查询访问码(IAC-inquiry access code)组成。它的固定长度为68位。由于接收器使用位相关器将接收到的数据包与ID包的已知位序列进行匹配,因此它是一个非常可靠的数据包。
ID packet仅在寻呼(Paging)、查询(Inquiry)和角色切换中明确规定的情况下使用。在允许使用其他数据包类型的情况下,不得使用ID包。 -
NULL packet
NULL包没有有效载荷,仅由信道访问码和数据包头组成。它的总长度(固定)为126位。NULL包可用于向源返回有关前一次传输成功与否的信息(ARQN),或RX缓冲区的状态(FLOW)。NULL包不需要确认。 -
POLL packet
POLL包与NULL包非常相似。它没有有效载荷。与NULL包不同的是,它需要接收方的确认。它不是ARQ方案的一部分。POLL包不会影响ARQN和SEQN字段。在接收到POLL包时,即使外围设备没有任何信息要发送(除非该时隙中有散射网承诺),外围设备也应响应一个数据包。这个返回的数据包是对POLL包的隐式确认。中央设备可以在微微网中使用此数据包来轮询(poll)外围设备。外围设备不得发送POLL包。POLL包不得在无连接外围广播逻辑传输上发送。 -
FHS packet
FHS包是一种特殊的控制包,其中包含蓝牙设备地址和发送方的时钟等信息。其有效载荷包含144个信息位和一个16位的CRC码。有效载荷采用2/3速率的前向纠错编码,总长度为240位。图6.9展示了FHS有效载荷的格式和内容。FHS包用于Central page response、Inquiry response和角色切换。FHS包不加密,没有有效载荷头或MIC。FHS包包含实时时钟信息。每次重传之前都应更新此时钟信息。FHS有效载荷的重传不同于普通数据有效载荷的重传,后者在每次重传中使用相同的有效载荷。FHS包用于在微微网信道建立之前或现有微微网转换到新微微网时进行频率跳变同步。然而,FHS包不用于无连接外围广播接收器与无连接外围广播发射器进行频率跳变同步。
-
DM1 packet
DM1报文用于支持允许使用DM1包的任何逻辑传输中的控制消息(见表6.2),也可以承载常规用户数据,被视为ACL包。
10.2)SCO packet
SCO报文包含:HV1、HV2、HV3、DV。
HV和DV包用于同步SCO逻辑传输。HV包不包含MIC或CRC,并且不应重传。DV包的数据部分包含CRC,但同步数据部分不包含CRC,不包含MIC,数据部分应重传。
SCO包可以路由到同步I/O端口。在SCO逻辑传输上允许使用四种包:HV1、HV2、HV3和DV。这些包通常用于64 kb/s语音传输,但也可用于透明的同步数据传输。
当启用E0时,SCO包只能使用E0加密。当启用AES-CCM加密时,不应发送SCO包。
10.3)eSCO packet
EV包用于同步eSCO逻辑传输。这些包包含CRC,如果在重传窗口内没有收到正确接收的确认,则可以进行重传。没有MIC。
eSCO包可以路由到同步I/O端口。定义了三种用于基本速率操作的eSCO包类型(EV3、EV4、EV5)和四种用于增强数据速率操作的额外eSCO包类型(2-EV3、3-EV3、2-EV5、3-EV5)。eSCO包可以用于64 kb/s语音传输以及64 kb/s及其他速率的透明数据传输。
10.4)ACL packet
ACL包用于异步逻辑传输和CPB(无连接外设广播)逻辑传输。所携带的信息可以是任一逻辑传输的用户数据或异步逻辑传输的控制数据。
ACL为基本速率操作定义了六种包类型:DM1、DH1、DM3、DH3、DM5和DH5。为增强数据速率操作定义了六种额外的包类型:2-DH1、3-DH1、2-DH3、3-DH3、2-DH5和3-DH5。AUX1包也被定义用于测试目的。有效载荷头中的长度指示器指定了用户字节的数量(不包括有效载荷头、MIC和CRC码)。
11、BR/EDR Link Manager Protocol
链路管理协议(Link Manager Protocol, LMP)用于控制和协商两台BR/EDR设备连接。这包括逻辑传输和逻辑链路的设置与控制,以及物理链路的控制。
链路管理协议用于在两台设备上的链路管理器(Link Managers, LM)之间进行通信。所有 LMP 消息仅适用于发送和接收设备之间的物理链路及其相关的逻辑链路和逻辑传输。
该协议由一系列消息组成,这些消息将在两台设备之间通过 ACL-C 或 APB-C 逻辑链路传输。LMP 消息应由链路管理器解释并执行,不应直接传播到更高的协议层。
11.1 连接控制
11.1.1 建立连接
在寻呼过程之后,可以启动时钟偏移请求、LMP版本、支持的功能、名称请求和分离的LMP过程。
当寻呼设备希望创建涉及LM层以上的连接时,它会发送一个LMP_HOST_CONNECTION_REQ PDU。当另一方接收到此消息时,Host会被告知有一个传入的连接。远端设备可以通过发送LMP_ACCEPTED PDU或LMP_NOT_ACCEPTED PDU来接受或拒绝连接请求。或者,如果外围设备需要进行角色切换,它会在接收到LMP_HOST_CONNECTION_REQ PDU后发送LMP_SLOT_OFFSET PDU和LMP_SWITCH_REQ PDU。如果角色切换失败,LM应继续创建连接,除非由于资源有限无法支持这种情况,在这种情况下,连接应通过带有错误代码“远程设备因资源不足终止连接”(0x14)的LMP_DETACH PDU终止。当角色切换成功完成后,旧的外围设备将回复LMP_HOST_CONNECTION_REQ PDU一个LMP_ACCEPTED PDU或LMP_NOT_ACCEPTED PDU(事务ID设置为0)。如果寻呼设备收到响应LMP_HOST_CONNECTION_REQ的LMP_NOT_ACCEPTED PDU,它应立即断开链接。
如果LMP_HOST_CONNECTION_REQ PDU被接受,则可能会调用LMP安全过程(配对、认证和加密)。当设备在连接建立过程中不再启动任何其他安全过程时,它会发送一个LMP_SETUP_COMPLETE PDU。当两个设备都发送了LMP_SETUP_COMPLETE PDU后,流量可以在BR/EDR ACL逻辑传输上进行传输。
11.1.2 断开连接
Central设备或Peripheral设备可以随时通过发送LMP_DETACH命令断开两个BR/EDR设备之间的连接。消息中包含一个错误代码参数,用于告知另一方为什么连接被断开。
11.2 安全
11.2.1 认证
BR/EDR定义了两种认证程序:传统认证和安全认证。当至少一个设备不支持安全连接(Controller)和安全连接(Host)功能,并且本地设备允许使用传统认证时,应执行传统认证。当两个设备都支持安全连接(Controller)和安全连接(Host)功能时,应执行安全认证。
传统认证程序基于挑战-响应方案。验证者发送包含随机数(挑战)的LMP_AU_RAND PDU给请求者。请求者计算一个响应,该响应是挑战、请求者的BD_ADDR和一个密钥的函数。响应被发送回验证者,验证者检查响应是否正确。
安全认证程序是一个挑战-响应方案。验证者发送包含随机数(挑战)的LMP_AU_RAND PDU给请求者。请求者用另一个也包含随机数的LMP_AU_RAND PDU进行响应。两个链路管理器使用h4函数计算设备认证密钥,然后使用h5函数计算SRES_C、SRES_P和ACO值。外围设备(无论是验证者还是请求者)将其响应(SRES_P)发送给中央设备。中央设备将其响应(SRES_C)发送给外围设备。成功计算认证响应要求两个设备共享一个密钥。
12.2.1.1 申请者拥有链路密钥(传统认证)
如果申请者拥有与验证者关联的链路密钥,它应计算响应并通过LMP_SRES将其发送给验证者。验证者检查该响应。如果响应不正确,验证者可以通过发送带有错误代码“认证失败”(0x05)的LMP_DETACH PDU来结束连接,详见第4.1.2节。
[图片]
12.2.1.2 申请者没有链路密钥(传统认证和安全认证)
如果申请者没有与验证者关联的链路密钥,在接收到LMP_AU_RAND PDU后,它应发送一个带有错误代码“PIN或密钥丢失”(0x06)的LMP_NOT_ACCEPTED PDU。
注意:此过程对于传统认证和安全认证是相同的。
[图片]
12.2.1.3 响应者拥有链路密钥(安全认证)
中央设备和外围设备的链路管理层(LM)都充当验证者和申请者。发起者是第一个发送LMP_AU_RAND PDU的设备。
发起者向响应者发送一个LMP_AU_RAND PDU。如果响应者拥有与发起者关联的链路密钥,它应回应一个LMP_AU_RAND PDU。发起者和响应者应计算响应值。外围设备首先用包含SRES_P的LMP_SRES PDU进行响应。然后,中央设备用包含SRES_C的LMP_SRES PDU进行响应。中央设备应验证外围设备发送的SRES_P是否与中央设备计算的SRES_P匹配。外围设备应验证中央设备发送的SRES_C是否与外围设备计算的SRES_C匹配。如果响应不正确,则任一设备可以通过发送带有错误代码“认证失败”(0x05)的LMP_DETACH PDU来结束连接。
[图片]
11.2.2 配对
当两个设备没有共同的链路密钥时,应使用配对或安全简单配对程序创建初始化密钥(K init)。在使用配对时,K init 应基于PIN码、随机数和BD_ADDR创建。当两个设备都计算出K init 后,将创建链路密钥,并进行相互认证。配对过程从一个设备发送LMP_IN_RAND PDU开始;该设备在第4.2.2.1节至第4.2.2.5节中被称为“发起LM”或“发起者”。另一个设备被称为“响应LM”或“响应者”。
11.2.2.1 响应者接受配对并具有可变PIN码
如果响应者接受配对并具有可变PIN码,那么它应回复一个LMP_ACCEPTED PDU。然后,两个设备应基于响应者的BD_ADDR计算K init,并继续进行链路密钥的创建。
[图片]
11.2.2.2 响应者接受配对并具有固定PIN码
如果响应者接受配对并具有固定PIN码,那么它应生成一个新的随机数,并在LMP_IN_RAND PDU中发送回去。如果发起者具有可变PIN码,那么它应接受LMP_IN_RAND PDU,并回复一个LMP_ACCEPTED PDU。然后,双方应基于最后的IN_RAND和发起者的BD_ADDR计算K init,然后继续进行链路密钥的创建。
[图片]
如果响应者具有固定PIN码且发起者也具有固定PIN码,那么发起者应通过发送带有错误代码“配对不允许”(0x18)的LMP_NOT_ACCEPTED PDU来拒绝第二个LMP_IN_RAND。
[图片]
11.2.2.3 响应者拒绝配对
如果响应者拒绝配对(例如,因为用户在设备上禁用了配对),那么在收到LMP_IN_RAND PDU后,它应发送一个带有错误代码“配对不允许”(0x18)的LMP_NOT_ACCEPTED PDU。
[图片]
11.2.2.4 链路密钥的创建
当两个设备中都计算出K init后,应创建链路密钥。此链路密钥将在两设备之间的所有后续连接中的认证过程中使用,直到其被更改。在配对过程中创建的链路密钥将是一个组合密钥;两个设备发送LMP_COMB_KEY PDU,开始计算链路密钥。
LMP_COMB_KEY PDU的内容是LK_RAND与K init进行按位异或(XOR)操作的结果。任何配置为使用组合密钥的设备都应存储该链路密钥。当新的链路密钥创建后,应进行相互认证以确认在两个设备中创建了相同的链路密钥。在相互认证之后,如果启用了加密,发起设备应暂停并立即恢复加密以生成新的加密密钥。
注意:这将导致从相互认证过程中创建的ACO生成新的加密密钥,并且当使用E0加密时,将使用在响应恢复加密过程中发送的LMP_START_ENCRYPTION_REQ PDU中的随机数。
[图片]
如果在上图中,任一设备发送LMP_UNIT_KEY PDU,另一设备应通过发送带有错误代码“配对不支持单元密钥”(0x29)的LMP_NOT_ACCEPTED PDU来响应。
11.2.3 加密
如果至少执行过一次认证,则可以使用加密。定义了两种加密机制:E0加密(传统)和AES-CCM加密。如果两个设备都支持安全连接(Controller)和安全连接(Host)功能,那么在启用加密时应使用AES-CCM。如果至少有一个设备不支持安全连接(Controller)和安全连接(Host)功能中的任意一个,那么在启用加密时应使用E0。
当使用E0加密时,为了使中心设备在微微网中对所有外设使用相同的加密参数,它应发出一个临时密钥K_temp。在开始加密之前,中心设备应将此密钥设置为微微网中所有外设的当前链路密钥。这是广播数据包需要加密时的必要步骤。
注意:使用广播加密加密的数据包不能被启用了AES-CCM加密的外设接收。当本地控制器支持安全连接且微微网中没有任何外设不支持安全连接时,广播数据包将不会被加密,并且可以被支持安全连接的外设接收。
11.2.3.1 加密模式
中心设备和外设必须就是否使用加密达成一致(在LMP_ENCRYPTION_MODE_REQ中Encryption_Mode=1表示使用加密,Encryption_Mode=0表示不使用加密)。如果使用半永久密钥,加密应仅适用于点对点数据包。如果使用临时链路密钥,加密应适用于点对点数据包和广播数据包。如果中心设备和外设就加密模式达成一致,中心设备将继续提供有关加密的更多详细信息。
如果两个设备都支持安全连接(Controller)和安全连接(Host)功能,则不允许将Encryption_Mode设置为0。如果设备收到一个Encryption_Mode设置为0的LMP_ENCRYPTION_MODE_REQ PDU,它应以带有错误代码“加密模式不允许”(0x25)的LMP_NOT_ACCEPTED PDU进行响应。
Initiating LM应暂停ACL-U逻辑链路上的通信。然后,发起设备应发送LMP_ENCRYPTION_MODE_REQ PDU。如果响应设备接受加密模式的更改,则它应完成当前在ACL逻辑传输上的数据包传输,然后暂停ACL-U逻辑链路上的传输。响应设备随后应发送LMP_ACCEPTED PDU。
只有在尝试加密或解密逻辑传输完成后,才能恢复ACL-U逻辑链路上的通信。
[图片]
11.2.3.2 加密密钥大小
中心设备发送一个包含建议密钥大小L_sug_c的LMP_ENCRYPTION_KEY_SIZE_REQ PDU,初始时L_sug_c应等于L_max_c。如果L_min_p ≤ L_sug_c ≤ L_max_p,则外设应响应一个LMP_ACCEPTED PDU,并使用L_sug_c作为密钥大小。
如果L_sug_c > L_max_p,外设应返回一个包含外设建议密钥大小L_sug_p(设置为L_max_p)的LMP_ENCRYPTION_KEY_SIZE_REQ PDU。如果L_sug_c < L_min_p,外设应返回一个带有错误代码“Unsupported LMP Parameter Value”(0x20)的LMP_NOT_ACCEPTED PDU,并且设备不应使用加密进行通信。
如果外设返回一个LMP_ENCRYPTION_KEY_SIZE_REQ PDU,则中心设备对外设的建议进行相应的测试。该过程重复进行,直到达成密钥大小协议或明确无法达成协议为止。如果达成协议,设备发送一个LMP_ACCEPTED PDU,并使用最后一个LMP_ENCRYPTION_KEY_SIZE_REQ PDU中的密钥大小。
如果达成密钥大小协议,则开始加密。如果未达成协议,设备发送一个带有错误代码“Unsupported LMP Parameter Value”(0x20)的LMP_NOT_ACCEPTED PDU,并且设备不应使用加密进行通信。
L_max_c和L_max_p应设置为至少7个八位字节。L_min_c和L_min_p应设置为至少7个八位字节。在中心设备和外设之间的ACL连接期间,L_max_c、L_min_c、L_max_p和L_min_p的值不得更改。
注意:如果中心设备或外设的主机使用需要安全模式4的服务,则可以强制使用比两个链路管理器协商的密钥大小更长的密钥大小。
[图片]
11.2.3.3 启动加密
要启动加密,中心设备生成随机数EN_RAND并计算加密密钥。当使用广播加密时,对于微微网中的所有外设,该随机数应相同。然后,中心设备发送一个包含EN_RAND的LMP_START_ENCRYPTION_REQ PDU。
外设在接收到此消息后应计算加密密钥,并通过发送LMP_ACCEPTED PDU进行确认。对于E0,加密密钥应使用E3算法计算。对于AES-CCM,加密密钥应使用h3算法计算。
注意:对于AES-CCM,在创建加密密钥时不使用EN_RAND。
[图片]
启动加密应分三步进行:
- 将中心设备配置为发送未加密的数据包并接收加密的数据包。
- 将外设配置为发送和接收加密的数据包。
- 将中心设备配置为发送和接收加密的数据包。
在步骤1和步骤2之间,中心设备到外设的传输是可能的。这时会传输LMP_START_ENCRYPTION_REQ PDU。当外设接收到此消息时,触发步骤2。在步骤2和步骤3之间,外设到中心设备的传输是可能的。这时会传输LMP_ACCEPTED PDU。当中心设备接收到此消息时,触发步骤3。
11.2.3.4 加密密钥刷新
当使用E0加密时,链路管理器应在上次启动或恢复加密后的2^28
个蓝牙时钟周期内刷新加密密钥。当使用AES-CCM加密时,链路管理器应在PayloadCounter或dayCounter回绕之前(至少在上次启动加密后的2^38个蓝牙时钟周期内)刷新加密密钥。要刷新加密密钥,链路管理器应先暂停加密,刷新后立即恢复加密。
如果在回绕事件发生前未刷新加密密钥,则应立即终止链路。
11.2.7 安全简单配对
在安全简单配对(Secure Simple Pairing)链路管理过程中定义了四个阶段:
- IO能力交换
- 公钥交换
- 认证阶段1
- 认证阶段2
设备首先应交换IO能力,以确定要使用的合适算法。BR/EDR安全简单配对有三种算法:数字比较、密码输入、带外(Out of Band)。
在接下来的部分中,请求IO能力的设备被称为“Initiating LM”或“Initiator”。另一个设备被称为“LM”或“Responder”。这种命名方式在整个安全简单配对过程中保持不变。
11.2.7.1 IO能力交换
链路管理器(Link Managers)应根据本地设备和远端设备的IO能力来确定将使用哪种关联模型。
如果Simple_Pairing_Mode设置为启用,Initiator应从Host请求IO能力。Initiator应向Responder发送LMP_IO_CAPABILITY_REQ PDU。如果Responder的Simple_Pairing_Mode设置为启用,它应回复一个包含其IO能力描述的LMP_IO_CAPABILITY_RES PDU。
11.2.7.2 公钥交换
一旦交换了IO能力,两个设备之间应交换公钥。
由于公钥的大小超过了DM1数据包的有效载荷长度,因此交换应使用LMP_ENCAPSULATED_HEADER和LMP_ENCAPSULATED_PAYLOAD PDU进行。
当至少有一个设备不支持安全连接时,应使用P-192曲线来计算公钥和私钥。当两个设备都支持安全连接时,应使用P-256曲线来计算公钥和私钥。
Initiator应首先发送其公钥,然后Responder应回复其公钥。当接收到最后一个LMP_ENCAPSULATED_PAYLOAD并发送了相关的LMP_ACCEPTED PDU后,公钥应被视为已接收。然后设备可以开始计算其DHKey。
11.2.7.3 认证阶段1
在认证阶段1中应使用以下程序之一:
- 如果一个或两个设备的OOB_Auth_Data参数设置为已接收,则应使用带外(Out-of-Band)程序。
- 如果两个设备的Authentication_Requirements参数都设置为不需要中间人保护(MITM Protection Not Required)选项之一,则应使用数字比较程序。
- 如果一个或两个设备的Authentication_Requirements参数设置为需要中间人保护(MITM Protection Required)选项之一,如果本地或远程IO能力设置为仅键盘输入(KeyboardOnly),且另一个IO能力未设置为无输入无输出(NoInputNoOutput),则应使用密码输入程序。否则,应使用数字比较认证程序。
11.2.7.4 认证阶段2:DHKey检查
在此阶段,两个设备根据DHKey和之前交换的信息计算新的确认值。
Initiator应向Responder发送一个LMP_DHKEY_CHECK PDU。如果发起者确定接收到的公钥无效,PDU应包含一个与计算出的确认值不同的值(例如,替换为随机生成的数值)。否则,PDU应包含计算出的确认值。
Responder收到后,如果接收到的确认值等于计算出的值,并且接收到的公钥有效,应回复一个LMP_ACCEPTED PDU。
然后,Responder应发送一个包含其计算出的确认值的LMP_DHKEY_CHECK PDU给发起者。Initiator接收后,如果接收到的值等于计算出的值,且接收到的公钥有效,Initiator应回复一个LMP_ACCEPTED PDU。
此时,两个设备开始计算链路密钥。
如果至少有一个设备不支持安全连接(Controller)和安全连接(Host)功能,发起者应开始标准的相互认证。如果两个设备都支持安全连接(Controller)和安全连接(Host)功能,发起者应开始安全认证。
在安全认证之后,如果启用了加密,发起设备应暂停并立即恢复加密以生成新的加密密钥。
注意:这将使用h3函数生成一个新的加密密钥,包括在安全认证过程中创建的ACO。
在安全简单配对过程中的任何时候,如果设备检测到来自对段设备的无效公钥,则应使配对过程失败,从而不创建链路密钥。
[图片]
11.3 请求信息
11.3.1 时间精度
LMP(链路管理协议)支持请求时间精度信息。此信息可用于在微微网物理信道重新同步期间最小化扫描窗口,这意味着设备能够更快速和高效地重新建立同步,从而减少连接中断的时间。返回的时间精度参数包括以ppm为单位测量的长期漂移和以µs为单位测量的最坏情况时钟的长期抖动。这些参数对于某个设备是固定的,并且在多次请求时应保持一致。报告的时间精度不应包括因执行微微网时钟调整而引起的变化。如果未从远程设备接收到时间精度信息,则应使用最坏情况下的值(漂移=250 ppm,抖动=10微秒)。
[图片]
11.3.2 时钟偏移
时钟偏移可以用于加快下一次对同一设备进行寻呼的时间。中央设备可以在成功完成基带寻呼过程后(即在连接建立之前、期间或之后的任何时候)请求时钟偏移。时钟偏移应由以下方程定义:
(CLKN 16-2 Peripheral - CLKN 16-2 Central ) mod 2^15
[图片]
11.3.3 LMP版本
LMP(链路管理协议)支持请求LM协议的版本。LMP_VERSION_REQ和LMP_VERSION_RES PDU包含三个参数:Version(版本)、Company_Identifier(公司标识符)和Subversion(子版本)。Version指定设备支持的蓝牙LMP规范版本。所有创建独特LM实现的公司都应有自己的Company_Identifier。同一家公司还负责子版本的管理和维护。建议每个公司为其每个RF/BB/LM实现使用唯一的子版本。对于给定的Version和Company_Identifier,每次发布新实现时,Subversion的值应增加。对于Company_Identifier和Subversion,值0xFFFF表示没有适用的有效编号。LMP版本无法协商,该序列仅用于交换参数。在成功完成基带寻呼过程后,可以随时请求LMP版本。
注意:给定的Version值并不表示设备支持相应版本规范中的所有功能;应检查相关的功能位。
[图片]
11.3.4 支持的功能
在成功完成基带寻呼过程后,可以通过发送LMP_FEATURES_REQ PDU随时请求支持的功能。接收到LMP_FEATURES_REQ PDU后,接收设备应返回一个LMP_FEATURES_RES PDU。
扩展功能掩码提供了对超过64个功能的支持。扩展功能掩码的支持由LMP功能掩码中的相应位指示。LMP_FEATURES_REQ_EXT和LMP_FEATURES_RES_EXT PDU的操作方式与LMP_FEATURES_REQ和LMP_FEATURES_RES PDU完全相同,只是它们允许请求扩展功能掩码的各个页面。在交换LMP_FEATURES_REQ和LMP_FEATURES_RSP PDU之后,可以随时发送LMP_FEATURES_REQ_EXT。
LMP_FEATURES_REQ_EXT PDU包含一个Features_Page参数,该参数指定请求的页面以及请求设备的该页面内容。页面编号从0到255,其中页面0对应于普通功能掩码。每个页面由64位组成。如果设备不支持任何页面编号,它应返回一个所有位都设置为0的Extended_Features参数。它还包含该设备中包含任何非零位的最大功能页面编号。LMP_FEATURES_REQ_EXT PDU的接收者应响应一个包含相同页面编号和相应功能页面以及其自身最大功能页面编号的LMP_FEATURES_RES_EXT PDU。
如果不支持扩展功能请求,则假定该设备的所有扩展功能页面中的所有位均为零。
[图片]
11.3.5 请求名称
LMP支持请求获取另一设备名称。该名称是与设备关联的用户友好名称,最多由248字节组成,按照UTF-8标准编码。名称被分割成一个或多个DM1数据包。当发送LMP_NAME_REQ PDU时,Name_Offset指示期望的片段。相应的LMP_NAME_RES PDU携带相同的Name_Offset、表示设备名称总字节数的Name_Length以及Name_Fragment,其中:
- Name_Fragment(N) = name(N + Name_Offset),if(N + Name_Offset) < Name_Length
- Name_Fragment(N) = 0,otherwise。
这里0 ≤ N ≤ 13。在第一次发送的LMP_NAME_REQ PDU中,Name_Offset=0。然后重复执行下图操作,直到发起者收集到名称的所有片段。在成功完成基带寻呼过程后,可以随时进行名称请求。
[图片]
11.4 角色转换
11.4.1 时隙偏移
Slot_Offset表示在不同微微网(Piconet)中的时隙边界之间的时间差。具体来说,它描述了从一个微微网中的中央设备传输开始到另一个微微网中的中央设备传输开始之间的时间差(以微秒为单位)。
在角色转换过程中,Slot_Offset用于确保新主设备能够正确地同步其时隙,以便与从设备进行通信。这是因为在角色转换后,原来的从设备将成为新的主设备,而原来的主设备将成为新的从设备。为了维持连接并确保数据传输的连续性,新主设备需要知道当前时隙的偏移量。
不同微微网中时隙边界之间的差异信息通过LMP_SLOT_OFFSET传输 。如果ACL逻辑传输处于活动模式且LM未协商同步逻辑传输,则在基带Paging完成后,任何时候都可以发送LMP_SLOT_OFFSET PDU。该PDU携带参数Slot_Offset和BD_ADDR。
[图片]
11.4.2 角色转换
由于寻呼设备总是成为微微网的中央设备,因此有时需要进行角色转换。角色转换可以作为连接建立的一部分进行,也可以在连接建立完成后的任何时间进行。
LMP_SWITCH_REQ只有在ACL逻辑传输处于活动模式、加密已停止或暂停,并且同一物理链路上的所有同步逻辑传输都被禁用时才应发送。在LM正在协商同步逻辑传输时,不应发起或接受LMP_SWITCH_REQ。
11.5 操作模式
BR/EDR设备有两种低功耗模式:保持模式(Hold Mode)和嗅探模式(Sniff Mode)。这两种模式都旨在降低设备的功耗,但它们的工作方式和适用场景有所不同。保持模式适合于短时间内完全不需要通信的情况,而嗅探模式则适合于需要长期保持连接但通信频率较低的情况。
11.5.1 保持模式(Hold Mode):
- 在保持模式下,设备暂时停止传输数据,但保持连接。
- 设备在进入保持模式之前会协商一个保持时间,在此期间设备不会发送或接收任何数据。
- 保持模式通常用于短时间内不需要数据传输的情况,以节省电池能量。
- 当保持时间结束后,设备会恢复正常操作。
11.5.2 嗅探模式(Sniff Mode):
- 在嗅探模式下,设备以较低的频率定期“唤醒”并检查是否有数据需要传输。
- 设备在进入嗅探模式之前会协商嗅探间隔,即设备在两个嗅探周期之间的休眠时间。
- 嗅探模式允许设备在低功耗状态下保持连接,并且可以在需要时快速响应数据传输请求。
- 嗅探模式适用于需要长时间保持连接但数据传输频率较低的情况。
11.6 逻辑传输
当两个设备之间首次建立连接时,建立的连接包括ACL逻辑传输(承载LMP消息的ACL-C逻辑链路和承载L2CAP数据的ACL-U逻辑链路)和APB逻辑传输(承载LMP消息的APB-C逻辑链路和承载L2CAP数据的APB-U逻辑链路)。然后可以添加一个或多个同步逻辑传输(SCO或eSCO)。如果创建新的逻辑传输会导致所有时隙都分配给次级LT_ADDR上的保留时隙,则不应创建新的逻辑传输。
SCO和eSCO逻辑传输用于实时数据的传输,如语音和音频流。
11.6.1 SCO(同步连接导向)逻辑传输:
- 用途:主要用于传输语音数据。
- 特性:SCO链接在固定的时间间隔内保留时隙,以确保低延迟和同步传输。这对于语音通话等应用非常重要,因为它们需要稳定的传输速率和低延迟。
- 数据包类型:常见的数据包类型包括HV1、HV2和HV3,每种类型具有不同的错误校正能力和带宽要求。
- HV1:每个数据包占用一个时隙,提供较高的冗余和错误校正。
- HV2:每个数据包占用两个时隙,提供中等的冗余和错误校正。
- HV3:每个数据包占用三个时隙,提供最低的冗余,但带宽最高。
11.6.2 eSCO(增强同步连接导向)逻辑传输:
- 用途:除了支持语音传输外,还可以用于传输其他实时数据,如音频流。
- 特性:eSCO提供了更高的灵活性和改进的错误处理机制。与SCO相比,eSCO允许重传数据包,从而提高了数据传输的可靠性。此外,eSCO还支持更长的时隙间隔,这有助于减少功耗。
- 数据包类型:eSCO支持EV3、EV4和EV5等数据包类型,这些类型提供了不同的带宽和错误校正选项。
- EV3:每个数据包占用三个时隙,适用于中等带宽和错误校正需求。
- EV4:每个数据包占用六个时隙,适用于高带宽和低错误校正需求。
- EV5:每个数据包占用六个时隙,适用于高带宽和中等错误校正需求。
逻辑传输的实现:
- 时隙分配:SCO和eSCO逻辑传输通过预定的时隙分配来实现同步传输。时隙由主设备和从设备之间的协商确定。
- 时钟同步:为了确保数据的同步传输,主设备和从设备的时钟需要保持同步。Timing_Control_Flags参数用于指示如何计算第一个SCO或eSCO时隙。
- 句柄区分:每个SCO或eSCO链接都有一个唯一的句柄,用于区分不同的链接。句柄为零的SCO链接不应使用。
注意事项: - 在使用AES-CCM加密时,链路管理器不得发起SCO或eSCO连接,并且应拒绝任何SCO或eSCO连接请求。
- 外围设备根据中央设备的蓝牙时钟解释Timing_Control_Flags中的初始化标志。
总结来说,SCO和eSCO逻辑传输在蓝牙BR/EDR中用于实时数据传输,通过预定的时隙分配和时钟同步来实现低延迟和高可靠性的传输。
12、BLE链路层状态(Link Layer)
链路层的操作可以用状态机来描述,并且每次只允许一个状态处于活动状态。链路层应至少有一个状态机支持广播状态或扫描状态。此外,链路层可能包含多个状态机实例。链路层状态机包含以下状态:
1)待机状态(Standby State)
处于待机状态的链路层不会发送或接收任何数据包。待机状态可以从任何其他状态进入。
2)广播状态(Advertising State)
处于广播状态的链路层将发送广播物理信道数据包,并可能监听和响应由这些广播物理信道数据包触发的响应。处于广播状态的设备称为advertiser。广播状态可以从待机状态进入。
3)扫描状态(Scanning State)
处于扫描状态的链路层将监听来自广播设备的广播物理信道数据包。处于扫描状态的设备称为scanner。扫描状态可以从待机状态进入。
4)初始化状态(Initiating State)
处于初始化状态的链路层将监听来自特定设备的广播物理信道数据包,并响应这些数据包以与另一设备建立连接。处于初始化状态的设备称为initiator。初始化状态可以从待机状态进入。
5)连接状态(Connection State)
连接状态可以从初始化状态或广播状态进入。处于连接状态的设备称为已连接设备。在连接状态中,定义了两种角色:
- 中心(Central)角色
- 外围(Peripheral)角色
当设备从Initiating状态进入Connection状态时,该设备为Central角色。当设备从Advertising状态进入Connection状态时,设备为Peripheral角色。
Central设备的链路层将与Peripheral设备进行通信,并定义传输的时间安排。Peripheral设备的链路层仅与一个Central设备进行通信。
6)同步状态(Synchronization State )
处于同步状态的链路层将监听来自特定设备的周期性物理信道数据包,这些数据包形成一个特定的周期性广播序列。同步状态可以从待机状态进入。在此状态下,Host可能会指示链路层监听来自指定设备的等时数据包,该设备正在传输广播等时组(BIG)。处于同步状态并接收等时数据包的设备称为同步接收器(Synchronized Receiver)。
7)等时广播状态(Isochronous Broadcasting State)
处于等时广播状态的链路层将在等时物理信道上传输等时数据包。等时广播状态可以从待机状态进入。处于等时广播状态的设备称为等时广播器(Isochronous Broadcaster)。
[图片]
13、BLE Security Manager
BLE设备的Security Manager(安全管理器)是蓝牙协议栈中的一个关键组件,负责管理和执行BLE设备间的安全功能。它主要处理配对、加密和身份验证等任务,以确保数据在传输过程中的机密性和完整性。
安全管理器定义了配对和密钥分发的方法、这些方法的协议以及这些方法或蓝牙设备其他部分使用的安全工具箱。
[图片]
安全管理器(SM)使用密钥分发方法来执行无线通信中的身份验证和加密功能。这意味着每个设备生成并控制其分发的密钥,其他设备不会影响这些密钥的生成。密钥的强度取决于分发设备内部实现的算法的强度。安全架构的设计使得响应设备的内存和处理需求低于发起设备的内存和处理需求。
配对用于建立可以用来加密链路的密钥。然后进行密钥分发传输来分享密钥,以在未来重新连接时可以用来加密链路、验证签名数据和随机地址解析的密钥。
配对是一个三阶段的过程。前两个阶段是必须有的,并且第3阶段的特定传输密钥分发为可选步骤(见图2.1):
- 阶段1:配对功能交换
- 阶段2(LE传统配对):短期密钥(STK)生成
- 阶段2(LE安全连接):长期密钥(LTK)生成
- 阶段3:特定传输密钥分发
[图片]
设备应首先在配对功能交换中交换认证需求和IO能力,以确定在阶段2中使用以下哪种方法:
- 直接配对(Just Works):这种方法不需要用户交互,设备自动完成配对过程,安全性较低。
- 数字比较(仅适用于LE安全连接):设备在显示屏上显示一个6位数字,用户需要确认两个设备上显示的数字是否相同。如果相同,则确认配对
- 密码输入:一种设备生成并显示一个6位数的密码,用户需要在另一设备上输入这个密码以完成配对。
- 带外通信(OOB:Out of Band):使用蓝牙之外的其他通信渠道(如NFC、QR码、物理连接等)来交换配对信息,安全性最高。
从配对功能交换中获取的认证需求还决定了使用LE安全连接还是LE传统配对。随后可以执行阶段3以分发特定传输密钥,例如身份解析密钥(IRK)值和身份地址信息。无论阶段2中使用何种方法,阶段1和阶段3都是相同的。
阶段1和阶段2可以在加密或未加密的链路上执行,阶段3只能在使用以下方式加密的链路上执行:
- 使用LE传统配对时在阶段2中生成的STK
- 使用LE安全连接时在阶段2中生成的LTK
- 使用BR/EDR配对生成的共享链路密钥
13.1 SMP(Security manager Protocol)
安全管理协议(SMP)用于配对和传输特定的密钥分发。所有SMP命令都通过安全管理通道发送,该通道是一个L2CAP固定通道。
为了防止安全管理协议停滞,使用了一个安全管理计时器。在发送或接收到Security Request命令时,应重置并重新启动安全管理计时器。在发送或接收到 Pairing Request命令时,应重置并启动安全管理计时器。
当L2CAP SMP命令排队等待传输时,应重置安全管理计时器。接收到按键通知时应重置安全管理计时器(如果在接收到按键通知时不重置计时器,由于没有对按键通知的响应,安全管理器可能会在对等设备的安全管理器之前超时)。当配对过程完成(无论成功与否)时,应停止安全管理计时器。
如果安全管理计时器达到30秒,则应认为该过程失败,并通知本地上层。不应再通过L2CAP安全管理通道发送任何SMP命令。只有在建立新的物理链路时才能执行新的配对过程。
13.1.1 Pairing Request
Initiator通过向响应设备发送Pairing Request命令来启动Pairing Feature Exchange。如果本地设备在BR/EDR传输上已发起配对,并且在LE传输上接收到来自同一远程设备的配对请求,则如果双方都支持LE安全连接,应以SMP错误代码BR/EDR配对进行中(0x0D)拒绝LE配对。
如果BR/EDR/LE设备支持LE安全连接,那么它应当一次仅在一个传输上对同一远程设备发起配对。
13.1.2 Pairing Response
如果响应设备允许配对,则在接收到发起设备的Pairing Request命令后,响应设备使用此命令完成 Pairing Feature Exchange。
13.1.3 Pairing Confirm
在成功完成配对功能交换后,使用此命令启动LE传统配对的STK生成和LE安全连接配对的LTK生成。
此命令由两个设备使用,用于向对等设备发送确认值。
发起设备通过向响应设备发送Pairing Confirm命令来启动密钥生成。如果发起设备想要中止配对,它可以改为发送Pairing Failed命令。
响应设备在接收到发起设备的Pairing Confirm命令后发送Pairing Confirm命令。
13.1.4 Pairing Random
此命令由发起设备和响应设备用来发送随机数,此随机数用于计算Pairing Confirm命令中的Confirm值。发起设备在接收到响应设备的Pairing Confirm命令后发送配对Pairing Random。
在LE传统配对中,如果响应设备计算的确认值与从发起设备接收到的确认值匹配,则响应设备应在接收到发起设备的Pairing Random命令后发送Pairing Random命令。如果计算的确认值不匹配,则响应设备应回复Pairing Failed命令。
在LE安全连接中,响应设备应在接收到发起设备的Pairing Random命令后发送Pairing Random命令。如果计算的确认值不匹配,则响应设备应回复Pairing Failed命令。
如果发起设备计算的确认值与从响应设备接收到的确认值匹配,则发起设备应使用生成的密钥(LE传统配对中的STK或LE安全连接中的LTK)加密链路。链路成功加密或重新加密是向响应设备发出密钥生成已成功完成的信号。如果计算的确认值不匹配,则发起设备应回复Pairing Failed命令。
配对失败后应该从Pairing Feature Exchange重新开始配对过程。
13.1.5 Pairing Public Key
此消息用于将设备的本地公钥(X和Y坐标)传输到远端设备。此消息由发起者和响应者共同使用。此协议数据单元(PDU)仅用于安全连接。其
13.1.6 Pairing DHKey Check
DHKey(Diffie-Hellman Key)是指通过Diffie-Hellman密钥交换算法生成的共享密钥。Diffie-Hellman密钥交换是一种安全的方法,使两个参与方能够在不安全的通信信道上生成一个共享的秘密密钥。这个共享密钥可以用于后续的加密通信,以确保数据传输的机密性和完整性。
在LE Secure Connections中,DHKey用于生成确认值和其他加密参数,以确保配对过程的安全性。
此消息有发起者或相应者用于传输使用f6生成的128位DHKey Check values(Ea/Eb)。这些是使用DHKey生成的确认值。此消息由发起者和响应者共同使用。此协议数据单元(PDU)仅用于LE安全连接。
二、BR/EDR连接过程
1、Inquiry过程
BR/EDR设备通过在查询扫描信道每个频率上发送查询请求,求并侦听响应。可被发现设备则响应查询请求,发送自身的设备地址和时钟信息。
BR/EDR设备通过发送HCI_Inquiry命令来发起查询过程,扫描周围的可连接设备。
Step 1: Host发送HCI_Inquiry命令
[图片]
Step 2:Controller将使用指定的询问访问码和询问长度启动基带询问过程。当收到询问响应时,Controller提取所需的信息,并通过一个或多个HCI_Inquiry_Result事件将找到的设备相关信息返回给Host。(见图2.5。)
[图片]
ID Packet(标识包):ID包用于设备发现阶段,它包含一个唯一的设备地址(BD_ADDR),使其他设备能够识别并区分不同的蓝牙设备。还用于同步两个设备之间的通信,通过接收ID包,设备可以同步到发送设备的时钟和跳频序列。
FHS Packet(频率跳变同步包):FHS包在连接建立过程中用于交换频率跳变信息和时钟信息,使得设备能够在相同的跳频序列上进行通信,在某些情况下,FHS包也用于主从角色切换过程中的信息交换。
[图片]
2、Paging过程
- Page设备会在多个频率上发送page request包,以增加被目标设备接收的概率,在发送Page请求包时,会使用目标设备的地址信息来进行频率跳变同步。
- Page Scanning设备在特定的物理信道上进行扫描,等待接收到Page request包,当接收到来自Page设备的Page请求包时,Page Scanning设备会发送响应包,表示愿意建立连接。
- 当目标设备响应Page请求后,Page设备会继续发送FHS(Frequency Hopping Synchronization)包,完成连接的建立。FHS包中包含自己的地址、时钟偏移和跳频模式等信息。
- Page Scanning设备会根据Page设备发送的FHS包进行频率跳变同步,完成连接的建立
[图片]
3、ACL连接建立过程
paging过程是蓝牙设备之间建立物理连接的第一步,而ACL链路建立是基于这个物理连接之上,用于实际数据传输的逻辑链路建立过程。
图3.1展示了两个设备之间连接建立和断开的流程图,部分步骤是可选的。
[图片]
Step 1:发送 HCI_Create_Connection
Host A向Controller发送 HCI_Create_Connection 命令。然后,Controller使用指定的 BD_ADDR 向B设备发起Paging过程。
[图片]
Step 2:交换双方支持的feature
(可选项)LM(Link Manager)可以选择交换双方支持的feature。
[图片]
[图片]
Step 3:LM发起连接请求
Central上的链路管理器(LM)将请求一个LMP_HOST_CONNECTION_REQ PDU。外围设备上的链路管理器(LM)随后会确认连接是否可行,如果可行,还会确认首选的角色。
[图片]
Step 4a: 对端设备接受连接请求。
[图片]
Step 4b: 对端接受连接请求,并要求做Central。
对端Host在接受此连接请求时,有时会选择作Central设备。这将导致在发送LMP_HOST_CONNECTION_REQ PDU的LMP_ACCEPTED之前发生角色切换。
[图片]
Step 5:Central设备发起AFH请求(可选)
在交换特性并确定支持AFH(自适应跳频)功能后,中央设备可以随时发送LMP_SET_AFH和LMP_CHANNEL_CLASSIFICATION_REQ PDU。
[图片]
Step 6:发起认证(可选)
链路管理器(LM)向Host请求此连接的链接密钥来询问是否需要认证。
[图片]
Step 7a:配对(无密钥时)
如果上层要求认证,并且要连接的设备没有共同的link key,就会发起配对过程。链路管理器(LM)将向Host请求此连接的链接密钥,如果收到Negative_Reply,则会请求输入PIN码。该PIN码将在连接双方请求,并基于此PIN码进行认证。最后一步是将此连接的新链接密钥传递给Host,以便其存储以备将来连接使用。
[图片]
Step 7b: 认证(有密钥时)
如果设备之间存在共同的链接密钥,则不需要配对。链路管理器(LM)将向Host请求此连接的链接密钥。如果收到肯定回复,则使用该链接密钥进行认证。如果配置参数Authentication_Enable已设置,则执行认证过程。下图仅显示在双方都设置了Authentication_Enable的情况。
[图片]
Step 8:加密
一旦配对或认证过程成功,便可以开始加密过程。此消息序列图(MSC)仅显示加密点对点连接的设置。
[图片]
Step 9:连接完成
链路管理器(LM)通过发送LMP_SETUP_COMPLETE协议数据单元(PDU)来指示连接已建立。这将导致Host收到新的Connection_Handle通知,并且该连接可以用于发送更高层的数据,如L2CAP信息。
[图片]
Step 10:连接断开
一旦不再需要连接,任一设备都可以使用HCI_Disconnect命令和LMP_DETACH消息PDU终止连接。断开过程是单向的,不需要远程链路管理器(LM)的明确确认。基带层的ARQ ACK表明远程LM已收到LMP_DETACH PDU。
[图片]
4、ACL链接建立后可选步骤
4.1)认证请求
在ACL连接建立后,认证可以随时显式执行。如果没有可用的链路密钥,则需要从Host获取链路密钥。(见图4.1)
注意:如果控制器或链路管理器(LM)和主机都没有链路密钥,设备将需要按照ACL连接建立中Step 7a的步骤进行配对。
传统认证流程如下:
[图片]
如果两个设备都支持安全连接,则使用安全认证:
[图片]
4.2)安全的简单配对
图4.3显示了两个设备之间的安全简单配对流程图。该过程分为11个不同的步骤,其中一些步骤有多个不同的选项。
[图片]
4.3)链路监控超时更改事件
当Host启用链路监控超时监控后,外围设备在接收到LMP_SUPERVISION_TIMEOUT PDU后会生成一个HCI_Link_Supervision_Timeout_Changed事件。
[图片]
4.4)设置连接加密
步骤1:Host可以随时使用HCI_Set_Connection_Encryption命令开启加密。该命令可以由中央设备或外围设备发起。图4.30中仅显示了中央设备。如果该命令是由外围设备发送的,唯一的区别是LMP_ENCRYPTION_MODE_REQ PDU将由外围设备发送。LMP_ENCRYPTION_KEY_SIZE_REQ和LMP_START_ENCRYPTION_REQ PDU将始终由中央设备请求。(见图4.30)
[图片]
结束使用加密则发送HCI_Set_Connection_Encryption命令。
[图片]
4.5)更改连接链路密钥(Link Key)
中央设备的Host(Host A)可以使用HCI_Change_Connection_Link_Key命令更改连接链路密钥。一个新的链路密钥将被生成,并且主机将收到这个新链路密钥的通知。(见图4.32。)
[图片]
4.6)使用加密暂停和恢复更改连接链路密钥
中央设备的主机(主机A)可以使用HCI_Change_Connection_Link_Key命令更改连接链路密钥。一个新的链路密钥将被生成,并且主机将收到这个新链路密钥的通知。然后加密将被暂停并恢复,立即使用这个新的链路密钥生成新的加密密钥。(见图4.33。)
[图片]
4.7)临时链路密钥
通常用于设备之间长期的配对和连接的Link Key称为Semi-permanent Link Key(半永久链路密钥),这种密钥在设备断开连接后仍然有效,可以在下次连接时继续使用。而Temporary Link Key(临时链路密钥)是用于短期的、安全性要求较低的连接。它在设备断开连接后会失效,需要重新生成。
当至少一个设备不支持加密暂停和恢复时,Host可以使用HCI_Link_Key_Selection命令从半永久链路密钥更改为临时链路密钥。(见图4.34。)
[图片]
Host可以使用HCI_Link_Key_Selection命令从临时链路密钥更改为半永久链路密钥。(见图4.35。)
[图片]
4.8)读取远端设备支持的功能
Host使用HCI_Read_Remote_Supported_Features命令可以读取远程设备支持的LMP功能。(见图4.36。)
如果之前已经获取了远程支持的功能,那么控制器可能会直接返回这些信息,而无需发送任何LMP PDU。
[图片]
4.9)读取远端设备的扩展功能
Host使用HCI_Read_Remote_Extended_Features命令可以读取远端设备的扩展LMP功能。(见图4.37。)
如果之前已经获取了远程扩展功能,那么控制器可能会直接返回这些信息,而无需发送任何LMP PDU。
[图片]
4.10)读取时钟偏移
在BR/EDR通信中,读取时钟偏移的主要作用是加速设备之间的重新连接过程。当中央设备(Central)和外围设备(Peripheral)之前已经建立过连接并且记录了时钟偏移值后,在下一次尝试重新连接时,中央设备可以利用这个时钟偏移值更快速地找到外围设备,从而减少连接建立的时间。这对于提高连接效率和用户体验非常重要。
Central设备的Host可以使用HCI_Read_Clock_Offset命令读取外围设备的时钟偏移(见图4.38)。时钟偏移可以用于加速后续连接尝试中的寻呼过程。
[图片]
如果该命令是从外围设备请求的,控制器将直接返回一个HCI_Command_Status事件和一个HCI_Read_Clock_Offset_Complete事件,而无需发送任何LMP PDU(见图4.39)。
[图片]
4.11)在加密链接上使用加密暂停和恢复进行角色切换
HCI_Switch_Role命令可以用于显式地切换本地设备与指定设备之间的当前中央/外围角色。中央设备的主机(A)请求与外围设备进行角色切换将首先暂停加密,然后发送切换请求,外围设备将响应时隙偏移并接受。角色切换通过执行TDD切换和微微网切换来完成。切换后加密恢复,最后在双方发送HCI_Role_Change事件。(见图4.40。)
[图片]
4.12)刷新加密密钥
在BR/EDR通信中,刷新加密密钥(Refreshing Encryption Keys)的主要作用是提高安全性。随着时间的推移,使用相同的加密密钥可能会增加被破解的风险,因此定期刷新加密密钥可以增强数据传输的安全性。
中央设备的主机(Host)可以使用HCI_Refresh_Encryption_Key命令显式地暂停和恢复加密,以刷新加密密钥。加密恢复后,双方都会收到HCI_Encryption_Key_Refresh_Complete事件。(见图4.41)。
[图片]
当两个设备都支持安全连接时,加密密钥刷新序列按如下步骤执行。
[图片]
4.13)读取远端设备版本信息
使用HCI_Read_Remote_Version_Information命令可以读取远程设备的版本信息。(见图4.43)
如果之前已经获取了远程版本信息,那么控制器可能会直接返回这些信息,而无需发送任何LMP PDU。
[图片]
4.14)QoS 设置
在BR/EDR中,服务质量(QoS)是指管理和保证数据传输的性能和可靠性的一组机制。QoS主要用于确保在蓝牙连接中满足特定应用的带宽、延迟和抖动要求。
使用 HCI_Flow_Specification 命令,可以将连接的服务质量(QoS)和流规范要求通知给控制器。然后,控制器可以与远程设备更改服务质量参数,包括最大和最小服务间隔、最大突发大小、峰值带宽和延迟等。
[图片]
4.14)角色切换
HCI_Switch_Role 命令可以用于显式地切换本地设备与指定设备之间的当前中央(Central)/外围(Peripheral)角色。
step 1a: 中央设备的Host(A)请求与一个外围设备进行角色切换。这将发送切换请求,外围设备会响应时隙偏移并接受请求。(见图 4.45。)
[图片]
Step 1b::外围设备的Host(B)也可以发起请求与中央设备进行角色切换。这将发送时隙偏移和切换请求,中央设备会以 LMP_ACCEPTED PDU 响应。(见图 4.46。)
[图片]
Step 2:角色切换通过进行时分双工(TDD)切换和微微网(piconet)切换来完成。最后,双方都会发送一个 HCI_Role_Change 事件。(见图 4.47。)
[图片]
4.15)LMP 事务冲突
中央设备和外围设备的链路管理器可能会同时发起相同的 LMP 事务,此时处理机制如下:
[图片]
5、同步链接的建立和断开
在BR/EDR中,同步连接(Synchronous Connection)主要用于实时音频传输,如语音通话和高质量音频流。这类连接包括SCO(Synchronous Connection-Oriented)和eSCO(Extended Synchronous Connection-Oriented)两种类型。
SCO连接特点:
- 固定时间间隔:SCO链路使用固定的、周期性的时间间隔来传输语音数据。
- 低延迟:由于其固定的时间间隔,SCO链路具有较低的延迟,非常适合实时语音通信。
- 电路交换:SCO链路采用电路交换方式,保证了数据传输的连续性和稳定性。
- 数据包丢失后不会重传,因此在干扰环境下可能会有语音质量下降的问题。
- 带宽有限,无法支持高质量音
eSCO连接特点: - 是对SCO的扩展,提供更灵活的时间间隔和更高的数据传输速率。
- 支持重传机制,可以在数据包丢失时进行重传,提高了数据传输的可靠性。
- 可以携带更多的用户数据,不仅限于语音,还可以传输其他类型的数据。
- 提供更好的音频质量和更高的抗干扰能力。
5.1 同步连接设置
使用 HCI_Setup_Synchronous_Connection 命令,主机可以在链路上添加一个同步逻辑信道。通过创建 SCO 或 eSCO 逻辑传输,可以提供同步逻辑链路。
注意:必须先建立 ACL 连接,然后才能创建同步连接。
Step 1a:中央设备请求与另一设备使用eSCO建立同步连接流程如下图。
[图片]
Step 1b:外围设备请求与另一设备使用eSCO建立同步连接时流程如下:
[图片]
Step 1c:中央设备请求使用SCO与另一设备建立同步连接流程如下:(见图 5.3。)中
[图片]
Step 1d:中央设备请求与传统外围设备建立同步连接流程如下:
[图片]
Step 1e:任何仅支持 SCO 连接的设备请求与另一设备建立同步连接流程如下:
[图片]
Step 2a:中央设备重新协商 eSCO 连接:
[图片]
Step 2b:中央设备重新协商 eSCO 连接:
[图片]
Step 3a:eSCO连接断开流程:
[图片]
Step 3b:SCO链接断开流程:
[图片]
5.2 使用增强同步命令建立同步连接
通过 HCI_Enhanced_Setup_Synchronous_Connection 命令,主机可以在链路上添加一个同步逻辑通道。同步逻辑链路可以通过创建 SCO 或 eSCO 逻辑传输来提供。同样,在创建同步连接之前,必须先建立 ACL 连接。
Step 1a:中央设备使用HCI_Enhanced_Setup_Synchronous_Connection命令请求与外围设备建立eSCO同步连接。
[图片]
Step 1b:外围设备使用HCI_Enhanced_Setup_Synchronous_Connection命令请求与中心设备建立eSCO同步连接。
[图片]
Step 1c: 中心设备使用HCI_Enhanced_Setup_Synchronous_Connection请求与外围设备建立SCO同步连接。
[图片]
Step 1d: 外围设备使用HCI_Enhanced_Setup_Synchronous_Connection请求与中心设备建立SCO同步连接。
[图片]
Step 2a: 中心设备使用HCI_Enhanced_Setup_Synchronous_Connection请求重新协商eSCO连接参数。
[图片]
Step 2b: 外围设备使用HCI_Enhanced_Setup_Synchronous_Connection请求重新协商eSCO连接参数。
[图片]
三、BLE连接过程
链路层控制协议(LLCP)用于控制和协商两个链路层之间的连接操作方面。这包括连接控制、启动和暂停加密以及其他链路过程的程序。
BLE的连接过程中状态改变可以大体描述为如下图过程。
四、BLE Pairing流程
BLE 配对流程大体上分为4步,步骤2根据加密方法的不同而有所区别。
[图片]
1、PHASE 1: Pairing Feature Exchange
配对过程可以由Central设备发送Pairing Request命令发起,如下图:
[图片]
也可由Peripheral设备先发送Security Request要求Central发起配对请求:
[图片]
2、PHASE 2: Authenticating and Encrypting
BLE配对和加密过程可以分为传统配对(Legacy Pairing)和安全配对(Secure Connections Pairing),在配对特性交换完成后,将选择一种配对方法进行链路加密。
2.1 LE legacy pairing
LE传统配对使用的是基于临时密钥(Temporary Key, TK)的配对方法,使用 TK 和随机数来生成短期密钥(Short Term Key, STK),安全性较低,容易受到中间人攻击(Man-in-the-Middle, MITM)和被动窃听攻击。包括 Just Works、Passkey Entry 和 Out of Band (OOB) 三种配对方法。
2.1.1 Just Works
Just Works方法适用于不需要用户交互的设备,但安全性较低,例如简单的传感器或外设。
[图片]
2.1.2 Passkey Entry
Passkey Entry 方法适用于需要用户输入 PIN 码或密码的场景,提供了更高的安全性。
[图片]
2.1.3 Out of Band (OOB)
Out of Band (OOB) 方法使用蓝牙之外的通信渠道(如 NFC 或 QR 码)来交换配对信息,从而提高安全性。
[图片]
2.2 LE Secure Connections Pairing
Le安全配对引入了椭圆曲线 Diffie-Hellman (ECDH) 密钥交换机制,先使用 ECDH 协议生成共享密钥,再使用共享密钥生成长期密钥(Long Term Key, LTK),提供更强的抗中间人攻击能力,提高了密钥管理的安全性。支持 Numeric Comparison、Passkey Entry、Just Works 和 OOB 四种配对方法。
2.2.1 交换public key
在步骤1a和1b中,两个设备交换公钥。Central将其公钥发送给Peripheral,然后Peripheral将其公钥发送给Central。
[图片]
2.2.2 认证阶段1
2.2.2.1 数字比较(或仅需操作)
当两个设备都具有输出能力,或者其中一个设备没有输入或输出能力时,将进行数字比较步骤。如果两个设备都有输出能力,此步骤需要显示用户确认值。该值应显示直到步骤2结束。如果一个或两个设备没有输出能力,则使用相同的协议,但主机将跳过要求用户确认的步骤。
注意:Just Works的序列与数字比较的序列相同,唯一的区别是主机不会向用户显示数字。
[图片]
2.2.2.2 密码键入
密码键入步骤用于两种情况:当一个设备只有数字输入功能,而另一个设备具有显示或数字输入功能时。在此步骤中,一个设备显示一个数字,供另一个设备输入,或者用户在两个设备上输入相同的数字。在用户输入阶段,会显示按键通知消息。
注意:由于需要在SMP上执行20次重复操作,密码键入可能会延长配对体验的时间。
[图片]
2.2.2.3 带外(OOB)认证
只有当至少一个设备具有一些可用的OOB信息时,才会进行OOB认证。此步骤不需要用户交互。
[图片]
2.2.3 计算Long Term Key
一旦DHKey生成完成,长期密钥(LTK)将从DHKey计算得出。
[图片]
2.2.4 认证阶段2(DHKey check)
一旦完成LTK计算和认证阶段1,就会通过交换使用DHKey生成的DHKey检查值来检查生成的DHKey值。如果成功,那么两个设备将完成向用户显示有关该过程的信息,因此主机可以停止显示这些信息。
[图片]
3、PHASE 3: Transport Specific KEY Distribution(可选)
在生成短期密钥并加密链路之后,传输特定的密钥将被分发。图C.24显示了中央设备和外围设备分发所有密钥和值的示例。
[图片]
4、使用先前分发的LTK重新建立安全性
BLE设备可以使用先前分发的长期密钥(LTK)重新建立安全性。可以由Central设备主动发起加密过程,也可以有Peripheral请求后Central发起加密过程,Central设备始终发起加密过程。
4.1 Central主动发起链路层加密
中央设备发起加密过程。没有用于启用此过程的SM信令;中央设备仅发起链路层加密。
4.2 Peripheral请求后Central设备发起链路层加密
外围设备可以请求中央设备启动安全程序,然后由中央设备发起链路层加密,如下图:
五、BLE链路层各状态操作流程
1 、Standby State
1)初始化
首先,Host将等待Controller通过一个无操作命令操作码上的命令完成事件来指明当前允许Host发送的HCI命令包的数量。然后,它会重置Controller到已知状态。接下来,需要读取本地支持的功能,以检查该控制器是否支持低功耗。之后,它会设置事件掩码和LE事件掩码,以启用希望Controller生成并发送给Host的事件。接下来,将使用Read Buffer Size和LE Read Buffer Size命令检查可用于数据流的缓冲区。然后,它会读取本地支持的LE feature,并选择希望使用的feature。最后,如果Controller有公共设备地址,它将读取该地址。
[图片]
2)随机设备地址
BLE设备可以使用随机设备地址,但必须在广播、扫描或初始化之前先配置该地址。
[图片]
3)设置过滤器
在广播、扫描或初始化之前,可以使配置滤接受列表,可以根据需要清空列表或添加设备。
[图片]
4)添加IRK到解析列表
在广播、扫描或初始化前,可以配置解析列表,可根据需要清空或添加设备。
[图片]
5)设置默认数据长度
在建立连接之前,Host可以指定Controller首选的最大传输包大小和最大包传输时间值,以用于新连接。这既可以在Central设备也可在Peripheral设备上进行。
[图片]
6)设置周期性广播列表
在使用周期性广播列表之前,可根据需要清除该列表并根据需要添加条目(见图2.6)。
[图片]
2、Advertising State
1)无定向广播
非定向广播是面向所有设备的广播,任何处于扫描模式的设备都可以接收到这些广播。任何接收到广播的设备都可以发起连接请求。
BLE设备可以通过启用广播进入广播状态。在此之前,它还应配置广播参数。
[图片]
2)定向广播
定向广播是针对特定设备的广播。广播数据包中包含了目标设备的地址,只有该特定设备能够识别并响应这些广播。通常用于快速建立连接,减少连接时间。目标设备在接收到定向广播后,可以立即发起连接请求。可以结合隐私功能使用,以防止第三方设备追踪。
BLE设备可以使用定向广播来允许initiator与其连接。高占空比定向广播在Controller中是有时间限制的,因此在建立连接之前可能会失败。下图仅展示了失败情况。
[图片]
低占空比定向广播没有时间限制,下图展示了未建立连接的情况。设备在进行此操作之前还应配置广播参数。
[图片]
3)使用ADV_EXT_IND的扩展广播
扩展广播能够支持更长的数据包和更多的广告信道。扩展广播首先使用ADV_EXT_IND指示设备正在发送扩展广播,报文中包含含了指向后续辅助数据包(如 AUX_ADV_IND)的信息,而后在AUX_ADV_IND辅助广播数据包中承载实际的广告数据。ADV_EXT_IND扩展广播仍然只使用37、38、39三个信道,而辅助广播可以使用其他数据信道。
[图片]
4)扫描请求通知
BLE设备可以在广播数据包中设置扫描请求通知功能,此设置将允许广播设备在接收到扫描请求(SCAN_REQ)时通知应用层。这项功能在某些情况下非常有用,例如需要了解哪些设备正在扫描自己,或者需要对扫描请求做出特定的响应。
[图片]
5)持续特定时间的广播
BLE设备可以通过设置广播参数来配置设备在限定的时间内进行广播。这些参数包括广播间隔、广播类型和广播持续时间等。
[图片]
6)周期性广播
周期性广播以固定的时间间隔发送广告数据包。这种广告播模式适用于需要定期广播信息的应用场景,如信标、传感器数据广播等。周期性广播与常规广告是独立的,可以同时进行。周期性广播可以使用AUX_SYNC_INT发送同步信息,使接收设备能够与发送设备的广播数据流同步。
[图片]
7)无连接恒定音调扩展传输
无连接恒定音调扩展传输(Connectionless Constant Tone Extension Transmission,CTE)是一种用于定位和方向测量的技术。它允许设备在不建立连接的情况下,通过周期性广告数据包发送恒定音调信号,从而实现高精度的定位和方向测量。
[图片]
8)等时广播状态(Isochronous Broadcasting state)
等时广播状态是一个专门用于实时数据传输的状态,特别适用于需要严格时间控制和低延迟的应用,如音频和视频流传输。这个状态允许设备以固定的时间间隔广播同步数据,使多个接收设备能够同时接收并处理这些数据。
8.1) 创建一个广播等时组
设备进入等时广播状态,并启用与 BIG(广播等时组)相关的周期性播。然后,设备创建 BIG 并通过等时数据路径发送等时数据。
[图片]
8.2)结束一个广播等时组
[图片]
9)带响应的周期性广播(PAwR)
PAwR 允许一个设备以固定的时间间隔发送周期性广播,并且接收设备可以在特定的时间窗口内对这些广播进行响应。这种机制特别适用于需要高效、低延迟通信的应用场景,如物联网(IoT)设备、传感器网络和可穿戴设备。
[图片]
10)发送 PAwR 子事件
发送PAwR子事件是带响应的周期性广播的扩展。它允许Controller在一个或多个子事件中传输数据,通过时隙分配机制,同时与不同设备在不同的子事件或时隙中进行通信,从而避免冲突和干扰,实现更高效和灵活的通信。
[图片]
11)使用 PAwR 中的响应时隙
在每个带响应周期性广播事件中,定义了一系列响应时隙,BLE设备可以对 PAwR 广播数据包发送响应。每个响应时隙是一个独立的时间段,接收设备可以在这个时间段内发送响应数据。响应的时间由Host根据广播数据包中的信息确定。Host可以通过指示响应时隙和在该响应时隙中要发送的数据来发送响应。
[图片]
12)从 PAwR 进行连接
BLE设备可以使用LE Extended Create Connection命令与同步设备发起连接,该命令中设置了使用的子事件和远端设备的 BD_ADDR。在该子事件中通过发送 AUX_CONNECT_REQ PDU 来启动连接。
[图片]
13)通过周期性广播响应链接失败
同步设备有可能错过周期性Advertiser发送的AUX_CONNECT_REQ PDU,从而导致连接失败,如下图。
[图片]
也有可能是周期性Advertiser错过了同步设备发送的 AUX_CONNECT_RSP PDU,从而导致连接失败,如下图。
[图片]
3、Scanning State
1)被动扫描
BLE设备可以使用被动扫描来发现区域内的广播设备。这样可以接收来自对端设备的广播数据包,并将这些数据包报告给主机。
[图片]
2)主动扫描
BLE设备可以使用主动扫描来获取更多关于其他设备的信息,这些信息可能发送给用户接口。主动扫描涉及更多的链路层广播消息。
[图片]
3)针对定向隐私广播的被动扫描
如果BLE设备的Controller不支持隐私功能,它可以选择转发来自支持隐私功能的设备的 LE 定向广告报告事件,而无需通过控制器解析列表进行过滤。
[图片]
4)带隐私功能的主动扫描
BLE设备可以使用主动扫描来获取更多关于其他设备的信息,这些信息可能对填充用户接口有用。在主动扫描过程中,可以使用隐私功能,以使得在主动扫描期间更难以追踪任一设备(参见图 4.4)。
[图片]
5)带隐私功能并且Controller能定期生成可解析私有地址的主动扫描
如果BLE设备在使用带隐私功能的主动扫描和广播,Controller将会定期更新两个设备上使用的可解析私有地址。Host可以随时从Controller读取当前正在使用的地址。
[图片]
6)在次级广播物理信道上进行主动扫描
设备可以在次级广播物理信道上使用主动扫描,以获取更多关于设备的信息,这些信息可能对填充用户界面有用(见图4.6)。
[图片]
7)扫描超时
[图片]
8)扫描周期性广播
设备可以与周期性广播设备建立同步,并将周期性广播数据包报告给主机(见图4.8)。
[图片]
9)取消周期性广播扫描
设备可以取消与周期性广告发布者建立同步的待处理请求。此示例显示了一个未成功的同步,随后是同步的取消(见图4.9)。
[图片]
10)周期性广播同步超时
设备可能会与周期性广播设备失去同步(见图4.10)。
[图片]
11)停止接收周期性广播
一旦与周期性广播设备同步,Host可以终止同步(见图4.11)。
[图片]
12)无连接恒定音调扩展接收
设备可能会接收到包含恒定音调扩展的周期性广播数据包,并将IQ样本发送给主机(见图4.12)。
[图片]
13)与单独启用报告的同步
设备在与周期性广播序列建立同步后,可以启用或禁用报告。
[图片]
4、Initiating State
1)发起连接
一个BLE设备可以向一个Advertiser发起一个连接,发起连接的设备称为Initiator。下图是一个连接成功的示例,连接成功后两个设备即可互相发送应用数据。
[图片]
2)取消发起连接
BLE设备可以取消正在创建的连接,下图展示了一个未成功的连接发起过程,随后取消了连接发起过程。
[图片]
3)使用带隐私功能的非定向广播发起连接
BLE设备可以向广播设备发起连接。在连接发起过程中,可以使用隐私功能,以使得在连接设置期间更难以追踪任一设备。此示例展示了一个成功的连接发起过程,结果是两个设备都能够发送应用数据(参见图 5.3)。
[图片]
4)使用带隐私功能的定向广播发起连接
设备可以向使用定向广播的Advertiser发起连接。在连接发起过程中,可以使用隐私功能,以使得在连接设置期间更难以追踪任一设备,并且能够针对单个发起者。下图展示了一个成功的连接发起过程,链接成功后两个设备都能够发送应用数据(参见图 5.4)。
[图片]
5)发起连接fail
下图展示了一个发起连接fail的过程,因为设备B(广播设备)未能响应设备A发送的数据物理信道PDU。设备A在等待6个connection interval后断开连接。
[图片]
6)在辅助广告物理信道上发起连接
BLE设备可以在辅助信道上向Advertiser发起连接。此示例展示了一个成功的连接发起,结果是两个设备都能够发送应用数据(见图5.6)。
[图片]
7)发起信道选择算法#2连接
如果BLE设备支持信道选择算法#2功能,它可以向广播物理信道PDU的ChSel字段设置为1的广播设备发起使用信道选择算法#2的连接。下图示例中连接使用了信道选择算法#2。
BLE规范中的默认通道选择算法是ChSel #1(Algorithm #1),它基于一个简单的伪随机数生成器来选择下一个数据通道。虽然实现简单,但在高干扰环境下可能不够高效。
ChSel #2(Algorithm #2)是为了应对ChSel #1在高干扰环境下的不足而引入的。它在BLE 4.2版本中被引入,并在BLE 5.0及之后的版本中得到进一步推广。ChSel #2使用更复杂的算法来选择信道,考虑了更多因素,如当前信道的质量和历史数据传输成功率,从而提供更好的抗干扰能力和更高的通信可靠性。
[图片]
5、Connection State
1)发送数据
一旦两个设备建立连接,任一设备都可以发送数据。下图展示了两个设备发送数据过程,例如,当属性协议发送读取请求并返回读取响应时。
[图片]
2)连接更新
连接的Central设备可以使用链路层控制过程请求连接更新(见图6.2)。
[图片]
3)信道映射更新
Central设备的Controller可能会从Host接收到一些信道分类数据,然后执Channel Update Link Layer Control过程。
[图片]
4)Feature交换
Central设备和Peripheral设备都可以查询对端设备上的可用feature。双方可以使用LL_FEATURE_REQ 或LL_PERIPHERAL_FEATURE_REQ来请求远端设备支持的feature。
[图片]
[图片]
5)版本信息交换
Central设备和Peripheral设备都可以执行版本信息交换过程
[图片]
[图片]
6)启动加密
如果连接尚未启用加密,则可由Central设备启动加密。
[图片]
7)没有long-term key情况下启动加密
如果连接尚未启用加密,可以由中心设备启动加密。如果Peripheral设备没有long-term key,则发送LL_REJECT_INT或LL_REJECT_EXT_INT,加密过程失败。
[图片]
8)在加密请求屏蔽的情况下启动加密
如果连接上尚未启动加密,可以由中心设备启动加密,当Peripheral设备屏蔽了HCI_LE_Long_Term_Key_Request事件时,加密请求fail。
[图片]
9)Peripheral设备不支持加密时请求加密
如果链接未启用加密,Central可发起加密过程,当Peripheral设备不支持加密时,将拒绝Central的加密请求。
[图片]
10)重新启动加密
如果连接上已经启动了加密,仍然可以由中心设备重新启动加密。这可能是为了使用由安全管理协议(SMP)协商的更强加密算法。
[图片]
11)断开连接
一旦连接不再需要保持活动状态,Central或者Peripheral设备都可以断开连接。
[图片]
[图片]
12)连接参数请求
连接的Central设备或Peripheral设备都可以使用链路层控制过程请求更改连接参数。
在蓝牙低功耗(BLE)通信中,锚点(Anchor Point)是指连接事件的开始时间点。它在主设备(Central)和从设备(Peripheral)之间的通信中起着关键作用。具体来说,锚点用于同步主设备和从设备的通信,使得数据传输能够在预定的时间间隔内进行,从而节省电能并提高通信效率。
每个连接事件都有一个锚点,主设备和从设备都会根据这个锚点来确定何时进行数据传输或接收。通过使用锚点,BLE设备可以在不需要持续保持无线电活动的情况下保持同步,从而实现低功耗操作。
- Peripheral设备请求更改锚点,Central设备接受流程:
[图片] - Peripheral设备请求更改锚点,Central设备拒绝流程:
[图片] - Peripheral设备请求更改连接参数,Central设备的Host接受请求:
[图片] - Peripheral设备请求更改连接参数,Central设备的Host拒绝请求:
[图片] - Central设备请求更改锚点,Peripheral设备接受请求:
[图片] - Central设备请求更改锚点,Peripheral设备拒绝请求:
[图片] - Central设备请求更改连接参数,Peripheral设备的Host接受请求:
[图片] - Central设备请求更改连接参数,Peripheral设备的Host拒绝请求:
[图片]
13)LE PING
LE Ping 允许设备在加密连接期间检查远程设备是否仍然存在并且连接是有效的,是一种用于验证连接的安全性和完整性的机制。主要功能包括:
- 身份验证:通过发送和接收特定的数据包,设备可以验证远程设备是否仍然处于连接状态,并确保数据包包含有效的消息完整性检查(MIC)。
- 保持连接:即使远程设备不支持 LE Ping 功能,链路层仍然可以使用该过程来验证连接的有效性。这有助于确保连接在长时间未传输数据的情况下仍然保持活跃。
- 请求数据包:LE Ping 过程还可以用于从远程设备请求包含有效 MIC 的数据包,以进一步验证连接的安全性。
Host可以使用 HCI_Write_Authenticated_Payload_Timeout 命令来更改包含有效 MIC 的数据包之间的最大间隔(当启用加密时链路层强制使能MIC) 。
[图片]
Central或Peripheral设备的链路层都可以使用 LE Ping 过程对远程设备进行身份验证,即使对端设备不支持 LE Ping 功能。此过程还可用于从远程设备请求包含有效 MIC 的数据包。下图中A既可以是Central设备也可以是Peripheral设备。
[图片]
当A设备发送LL_PING_REQ报文后,在 LE 认证有效负载超时时间内未收到包含有效 MIC 的数据包时,Host会被通知计时器已到期,从而断开连接。
[图片]
当Host设置Authenticated Payload Timeout后,LE_Authenticated_Payload定时器的值会被更新并重新计时。
[图片]
6、Periodic Advertising Sync Transfer
周期性广播同步传输是一种机制,允许一个设备将其已同步的周期性广播信息传输给另一个设备。这使得接收设备能够快速同步到周期性广播,而无需自己进行完整的扫描和同步过程。
在以下示例中,设备 B 正在进行周期性广播。设备 A 、B 与设备 C 处于连接状态,并将有关B的周期性广播序列的同步信息传输给设备 C。
1)由Scanner A将B的周期性广播信息发送给C(report禁用时)
扫描设备(A)将周期性广播同步信息传输给设备 C,设备 C 开始监听周期性广播序列,但仅在明确请求时才向Host发送报告。
[图片]
2)由Scanner A将B的周期性广播信息发送给C(report启用时)
扫描设备(A)将周期性广播同步信息传输给设备C,设备C开始监听周期性广播序列,收到B的周期性广播序列后立即向Host发送报告。
[图片]
3)由Advertiser传输同步信息
Advertiser(B)直接将其周期性广播的同步信息传输给设备C。在此示例中,向C的Host报告是禁用的。
[图片]
7、Synchronization State
1)与广播等时组同步(Synchronizing with a Broadcast Isochronous Group)
BIG是蓝牙低功耗音频(LE Audio)技术中的一个概念,主要作用是提供一种高效、可靠、低延迟的多设备同步数据传输机制,满足各种需要严格时间同步和高效数据广播的应用需求。BIS(Broadcast Isochronous Stream)是广播等时组(BIG)中的一个组成部分。每个BIG可以包含一个或多个BIS,每个BIS可以传输不同类型的数据流或服务于不同的应用需求。
BLE设备设备进入同步状态,从与BIG相关的周期性广播序列中接收同步信息,并与BIS同步流程如下图:
[图片]
2)结束与BIG的同步
BLE设备结束与BIG同步流程如下:
[图片]
3)BIG更新信道映射
BLE设备更新BIG信道映射流程如下图:
[图片]
4)与BIG失去同步
BLE设备与BIG失去同步流程如下:
[图片]
5)BIS的数据路径设置
下图展示了一个来自BLE Advertiser A的等时广播流的示例。Host A在Controller中设置了带编解码处理功能的ISO数据路径,以创建通过BIS传输的PDU(协议数据单元)。设备B成为BIS的同步接收器,并设置ISO数据路径以在Controller中对接收到的PDU进行编解码处理。
[图片]