经过Physical Layer
的定义,通信所需的物理通道已经okay了,即40个RF Channel
(后面统一使用Physical Channel
指代)
此时Link Layer
可以粉墨登场了,它主要的功能,就是在这些Physical Channel
上收发数据,与此同时,不可避免的需要控制RF收发相关的参数。除此之外,还要做到:
Physical Layer
仅仅提供了有限的40个Physical Channel
,而BLE中参与通信的实体的数量,肯定不是这个数量级。Link Layer
需要解决Physical Channel
的共享问题Logical Link
)。这也是Link Layer
需要解决的Physical Channel
是不可靠的,任何数据传输都可能由于干扰等问题而损毁、丢失,这对有些应用来说,是接受不了的。因此Link Layer需要提供校验、重传等机制,确保数据传输的可靠性;BLE协议在Link Layer
层抽象出5种状态:
Connection
状态外的任意一种状态。Initiater
和对应的Advertiser
都会切换到Connection
状态。该状态由Standby状态进入。Initiating State
或Advertising State
进入。通道断开后,会重新回到Standby
状态。进入Connect State
后,又定义了两种角色:
Initiating State
进入的Connect State
,连接成功后,变成了Master Role
。Advertising State
进入的Connect State
,连接成功后,变成了Slave Role
。
该章节官方文档定位:
Core5.0 P2562
状态和角色定义完成后,剩下的事情就简单了,主要包括两类:
BLE
协议中,这些事情是由一个叫做空中接口数据包(Air Interface Packets)
的家伙负责。
Air Interface Packets定义了一种包的格式,主要用于描述LE Uncoded PHY
、advertising channel
和data channel
的通信格式。
包的格式如下:
Preamble
前导码:是0和1的交替序列,当物理通道为LE 1M PHY
时,前导码为1Byte
;当前导码为LE 2M PHY
时,前导码为2Byte
。
格式如下:
Access Address
:对于所有在广播通道发送的数据包,其值都为0x8E89BED6
。一旦链路层处于Initiating State状态时,会生成一个新的Access Address
用于连接。该Access Address
为一个4Byte
的值。
蓝牙使用Access Address
来标识不同的设备,Access Address可以是一个公共的地址,也可以是一个随机的地址,无论是哪一种类型的地址,均为48bits
长度。
静态地址一般都是随机生成的,但是需要满足下面的几点规则:
大多数的设备(手机)都是在上电之后,初始化一次静态地址,一旦初始化后,静态地址就不变了;重新上电后,会生成新的静态地址。
私有地址又分为:不可解析私有地址和可解析的私有地址。
① 不可解析的私有地址
不可解析私有地址,遵守以下生成规则:
② 可解析的私有地址
可解析的私有地址,说直白点就是带加密算法所生成的。设备需要有Local Identity Resolving Key (IRK)
或者the Peer Identity Resolving Key (IRK)
这两个密钥,生成24bit
的号码,
可解析的私有地址,遵守以下规则:
总结:最高有效位的前两位,代表了设备地址的类型
Air Interface Packets
整体的包结构我们已经熟知,下面主要分析以下PDU
字段。
PDU
:分为两种,广播通道上传输Advertising Channel PDU
;数据通道上传输 Data Channel PDU
,长度为2-257
字节
广播通道PDU
,包括Advertising PDU
、Scanning PDU
、Initiating PDU
三种类型。
广播通道的PDU
,由16bit
的数据头和1-255Byte
的可变大小数据组成。
16bit
数据头组成如下:
PDU Type有多种,文章定位:
core 5.0 P2567
,可自行查阅。
ChSel
:该位为1,支持LE Channel Selection Algorithm
,即LE通道选择算法,反之,不支持。TxAdd
:该位为0,表明Payload
的AdvA
字段为公共的;该位为1,表明Payload
的AdvA
字段为随机的。Length
:该字段表明了Payload
的长度官方文档定位:
core 5.0 P2569
常见的Advertising PDU
有:
常见的Scaning PDU
有:
常见的Initiating PDU
有:
LLData
域有对应了一些链路层参数的设置,可以详细看Core 5.0 P2578
每一种PDU Type
,都会定义自己的Payload
组成。
数据通道PDU的格式,包括16bit的Header
,可变大小的Payload
,以及消息完整性检查MIC
.
包的格式如下:
Header包括
LLID
:该字段标识了这个包为LL Data PDU
或者LL Control PDU
NESN
:下次期望的序列号
根据LLID
字段,Data Channel PDU
又分为LL Data PDU
和 LL Control PDU
两种类型。
当LLID
为01b
时,并且Length=0
时,表示一个 Empty PDU
。
当LLID
为10b
时,则Length不能设置为0。
Opcode操作码也有多种:
每一种操作码对应不同的数据长度。详细可见
core5.0 P2589
CRC
字段:在链路层包的最后,校验所有的PDU
数据,大小长度为3Byte
。
如果PDU数据加密,则CRC将会计算加密后的PDU数据。
CRC算法采用多项式求和的形式进行,感兴趣的可以了解。Core 5.0 P2601
本篇主要讲了BLE
的Link Layer
,包括链路层定义的角色和状态,空中接口数据包的通信格式以及各个字段的含义,方便我们去分析LOG
和定位问题。