链路层LL(Link Layer)是协议栈中最重要的一层。 链路层的核心是状态机,包含广播、扫描、发起和连接等几种状态,围绕这几种状态,BLE设备可以执行广播和连接等操作,链路层定义了在各种状态下的数据包格式、时序规范和接口协议。 对于广播行为,链路层根据其可连接性,可扫描性,定向性三个维度定义了多种不同类型广播事件,相应的扫描行为和连接行为根据广播包的类型区分处理。连接过程涉及复杂的时序过程,利用连接参数可以配置连接过程时序。 广播、扫描和连接各自具有白名单过滤机制,可以针对指定地址的设备进行操作。链路层提供了一些列控制规程,比如加密连接和数据长度更新等,上层协议可以利用这些规程控制链路层。 此外,链路层利用私有地址实现了隐私特性。 1. 状态机链路层设计了五种工作状态,涵盖了链路层的全部操作状态:
状态 | 描述 | Standby | 系统不做任何广播和扫描动作,可以维持低功耗。 | Advertising | 系统对外发出广播数据和扫描响应数据。扫描响应数据也是一种广播数据,由扫描设备发出扫描请求,广播包设备返回扫描响应数据。 | Scanning | 监听外部的广播数据。扫描状态并不能直接进入连接状态。 | Initiating | 监听外部的广播数据。它可以发起连接请求,然后进入状态。 | Connection | 两个设备建立连接,进行通信。 |
这五种状态共同组成一个状态机,它们相互转换关系如下:
观察上图,扫描态无法直接进入连接态,从待机状态进入连接状态通常发生在连接已经建立的情况。 如果设备从发起态进入连接态称为主角色(Master Role)或主设备,如果从广播态进入连接态称为从角色(Slave Role)或从设备。主设备发起连接请求,并且会设定连接过程的时序参数,从设备接受主设备设定的参数进行通信。 在一个时刻,状态机只能处于一种状态,而链路层可以同时拥有多个状态机。这就意味着BLE设备在一个状态机中保持连接状态的同时,另一个状态机保持广播状态,或者多个链路状态机同时处于连接状态,这是BLE设备实现多个连接的基础。 以下为同时建立多个连接的场景: - 如果设备A已经跟设备B保持连接,那么设备A可以执行广播或扫描操作。
- 如果设备A已经跟设备B保持连接,并且设备A是主设备,那么设备A能够跟其他从设备C再次建立连接。
- 如果设备A已经跟设备B保持连接,并且设备A是从设备,那么设备A能够跟其他主设备C再次建立连接。
- 如果设备A已经跟设备B保持连接,那么不能实现设备A扫描,设备B广播并再次建立连接。设备A与B之间只能维持一个连接状态机。
2. 设备地址设备地址代表了设备的唯一识别码,它是设备间相互识别的依据,不同的设备必须具有不同的设备地址。 设备地址分为多种类型,最简单的是Public Address。这种地址固定不变,可以根据设备地址跟踪到该设备。 Public Address属于一种48-bit的MA-L类型地址,它的结构为:NN:NN:NN:NN:NN:NN。 其中前三个字节使用OUI(Organizationally Unique Identifier),后三字节自由分配。OUI代表了一个指定的组织机构识别码,全球已经有许多科技公司申请了自己的OUI。开发者可以从IEEE网站上下载已被分配的MA-L地址,也可以从第三方网站查询某个公司的OUI或某个OUI对应的公司。 与Public Address不同,Random Address采用一个随机数作为地址,Random Address分为Static Address和Private Address两类,Private Address又分为Resolvable private address和Non-resolvable private address两类。 它们的特点如下表所示: 地址类型 | 是否可变 | 更新触发机制 | 作为识别地址 | 描述 | 1. Public Address | 固定 | 无 | Yes | 固定不变,需要避免地址冲突。 | 2. [Random Address] | | | | | 2.1 Static Address | 随机 | 设备重新上电 | Yes | 设备上电时产生新的随机地址。 | 2.2 [Private Address] | | | | | 2.2.1 Resolvable private address | 随机 | 定时 | Yes | 过一段时间更新随机地址,链路层推荐更新周期为15分钟。该地址可以通过地址识别密钥解析识别。 | 2.2.2 Non-resolvable private address | 随机 | 定时 | Yes | 过一段时间更新随机地址,链路层推荐更新周期为15分钟。该地址可以不可被解析识别。 |
一个设备可以具有多种类型的地址,但是必须拥有一个识别地址。Public Address和Static Address可作为识别地址。所以如果设备采用Resolvable private address地址类型,必须同时具有一个Public Address或Static Address地址。
3. 物理信道在物理层的介绍中,提到了BLE将2.4GHz频段分成了40个物理信道,相邻信道频率间隔为2MHz。 这40个物理信道分成以下几类: 信道类型 | 信道号 | 描述 | Primary Advertising Channel | 37、38、39 | 发送传统广播和扫描请求 | Secondary Advertising Channel | 0 – 36 | 发送扩展广播 | Periodic Advertising Channel | 0 – 36 | 发送周期广播 | Data Channel | 0 – 36 | 发送连接数据 |
4. 数据包结构4.1 非编码型物理层非编码型物理层对应的链路层数据包结构包含四个部分:前导码,访问地址,PDU和CRC。如下所示: 字段 | Preamble | Access Address | PDU | CRC | 长度 | 1 or 2 octets | 4 octets | 2 – 257 octets | 3 octets | 传输时间(1M PHY/2M PHY) | 8 us/8 us | 32 us/16 us | 16 – 2056 us/8 – 1028 us | 24 us/12 us |
- 前导码:前导码内容为重复的0/1或1/0序列,用于频率同步、符号时序计算和自动增益控制。对于1M速率的物理层,其长度为1字节;对于2M速率的物理层,其长度为2字节。
- 访问地址:用于区分不同的数据类型。对于主要广播信道的数据包,其访问地址是一个固定值,对于其他信道的数据包,其访问地址是一个随机值。
- PDU:包含了有效数据。
- CRC:针对PDU部分进行校验。假如PDU经过加密,则校验加密后的PDU。
4.2 编码型物理层编码型物理层对应的链路层数据包做了FEC编码处理,增加了几个字段,其结构如下: 字段 | Preamble | Access Address | CI | TERM1 | PDU | CRC | TERM2 | 长度 | 10 octets | 4 octets | 2 bits | 3 bits | 2 – 257 octets | 3 octets | 3 bits | 传输时间(1M Coded PHY) | 80us | 256us | 16 us | 24 us | N×8×S us | 24×S us | 3×S us |
其中Access Address、CI和TERM1属于FEC block 1,PDU、CRC和TERM2属于FEC block 2。FEC block 1采用S=8编码算法,FEC block 2根据CI字段值采用S=2或S=8编码算法。 编码型物理层的符号传输速率是1M Sym/s,当采用S=2编码,数据传输速率为500bit/s,当采用S=8编码,数据传输速率为125bit/s。 - 前导码:前导码内容为重复的00111100序列,它不执行FEC编码。
- 访问地址:与上相同。
- CI:编码指示器,如果CI=0,则FE block 2执行S=8编码,如果CI=1,则FEC block 2执行S=2编码。
- TERM1和TERM2:FEC算法终止符。
|