上篇文章中《BLE-2の蓝牙4.0协议栈概览》,对蓝牙4.0BLE协议栈总体进行了介绍,并且提到了数据链路层(LL)是协议栈的重点和难点,这一张对数据链路层做一个详细的讲解,由于新学,本篇内容不是原创,基本上是各个优质帖子中摘出来的进行融合的,我会在文末逐篇注明出处。
1. Link Layer的定义:
我找了手头资料和网上博客对链路层的定义:
-
定义1:
-
定义2:
链路层定义了在各种状态下的数据包格式、时序规范和接口协议,在物理层的基础上,提供两个或多个设备之间,和物理层无关的逻辑传输通道,对链路层的上层屏蔽了物理层的特性,链路层的上层不需要再理解物理层的信息。
各种状态也就是状态机的五种状态了。 -
定义3:
-
定义4:
总结:
定义1,2是从传统的蓝牙协议基带层演变过来的,定义3,4是从BLE协议定义出发定义的。
个人比较赞同定义2 的写法:链路层定义了在各种状态下的数据包格式、时序规范和接口协议,在物理层的基础上,提供两个或多个设备之间,和物理层无关的逻辑传输通道,对链路层的上层屏蔽了物理层的特性,链路层的上层不需要再理解物理层的信息。
2. Link Layer的状态:
如上所述:“链路层定义了在各种状态下的数据包格式、时序规范和接口协议。”
LL的状态有可分为5种:
待机状态(Standby State)
广播状态(Advertising State)
扫描状态(Scanning State)
发起状态(Initiating State)
连接状态(Connection State)
状态机同一时刻只能有一种状态,链路层应至少具有一个支持广播态或扫描态之一的链路层状态机。
待机状态(Standby State)
不接收和发送任何数据包,但是任何状态都可以转换成待机态。通过上图1.1可以很清楚地了解到各个状态之间的转换。
广播状态(Advertising State)
处于广播状态的链路层将发送广播信道包,并可能监听和响应由这些广播信道包触发的响应。广播状态中的设备称为广播者, 可以从待机状态进入广播状态。
发送advertising channel packets,接受来自scanner的响应
扫描状态(Scanning State)
处于扫描状态的链路层将侦听来自正在播放广播设备的广播信道数据包,处于扫描状态的设备称为扫描者。
扫描态有两种子状态,主动扫描和被动扫描。
- 主动扫描:主动扫描接收了广播报文后,对设备产生额外的兴趣,想要获取更多的信息,因而发送扫描请求给广播设备,并且接收该设备的响应数据;
- 被动扫描:被动扫描即设备仅仅简单的侦听那些正在广播的设备,并接收其发送的广播报文。
被动扫描就好像你走在地铁口,听到的那些房产销售广告,仅仅是听听而已,你就离开了;而主动扫描则是你听见了那些房产销售广告之后,你对它产生了兴趣,又主动问了问该广告的相关信息。扫描态只能和待机态进行相互转换,开始和停止扫描是其转换条件。
监听来自advertiser的advertising channel packets
发起状态(Initiating State)
处于发起状态的链路层将侦听来自特定设备的广播信道数据包,并响应这些数据包来启动与设备的连接,即进入发起态之后,链路层监听自己试图连接的设备,一旦接收到该设备发送的广播报文,则发送连接请求,并使自身进入连接态。处于发起状态的设备称为发起者。
<这里的特定设备指的是什么?是已经链接过的设备吗?>
监听来自特殊设备的advertising channel packets,并进行初始化连接
连接状态(Connection State)
可以从发起状态或广播状态进入连接状态。 处于连接状态的设备被称为处于连接中。
连接态有两个子角色,Master Role和Slave Role,主连接角色和从连接角色。
- 主连接角色:发起连接的,由发起态进入的叫做主连接态。
- 从连接角色:被动接受连接,由广播态进入的叫做从连接态,断开连接则进入就绪态。
在连接状态时,定义了2个角色分别是master 和 slave
initating --->>> connection状态的设备就是 master 设备
advertising --->>> connection状态的设备就是slave
谁发起的广播,谁就是slave。
进入连接态之后,链路层可以进行连接管理和数据传输,主连接中的链路层将与从连接中的设备通信,并定义传输时间。
处于Master Role的设备可以和多个Slave Role分时通信;
处于Slave Role的设备只能和处于Master Role的设备通信。
3. 字节传输顺序
LL(Link Layer)的比特序采用LSB(Least Significant Bit:最低有效位)最先发送的方式,小端模式。比如一个数据参数X=3,有三个bit,其bit0=1,bit1=1,bit2=0,在空中传输时,先传输bit0,然后传输bit1最后传输bit2.
但是在core_v4.2中有以下描述:
Multi-octet fields, with the exception of the Cyclic Redundancy Check (CRC) and the Message Integrity Check (MIC), shall be transmitted with the least significant octet first.
等之后遇到CRC和MIC时,再来看它们有什么不一样。
4. 设备地址(Device Address)
链路层适用设备地址来识别设备,下面是地址分类:
4.1 公共设备地址(Public device address)
这个是要¥¥¥$$$$$的,不能白嫖。
4.2 随机设备地址(Random Device Address )
Static Device Address和Private Device Address
4.2.1 Static address
需要遵循以下规则:
1)最高两bit恒定为 1 1
2)上电的时候随机生成,并且在一个上电周期内保持不变
3)除开最高两位,剩余的46bits是一个随机数,不能全部为0,也不能全部为1。
4)下一次上电的时候可以改变。但不是强制的,因此也可以保持不变。
4.2.2 Private Device Address
Private Device Address又分为两种:
Non-resolvable private address(可解析或者说不加密地址) 和
Resolvable private address(不可解析或者说加密地址)
4.2.2.1 Non-resolvable private address
Non-resolvable private address会定时更新。更新的周期称是由GAP规定的,称作T_GAP(private_addr_int) ,建议值是15分钟。要求如下:
1)最高两bit恒定为 0 0
2)除开最高两位,剩余的46bits是一个随机数,不能全部为0,也不能全部为1
3)以T_GAP为周期,定时更新
4)此地址不能和 public device address 冲突
4.2.2.2 Resolvable private address
这种地址也称 RPA 加密地址,只能被拥有相同 Identity Resolving Key (IRK) 的设备扫描到,可以防止被未知设备扫描和追踪。
1)最高两位是 1 0
2)至少在 random part of prand 有一个 1
3)至少在 random part of prand 有一个 1
高位24bits是随机数部分,其中最高两个bits为“1 0”;
低位24bits是随机数和IRK经过hash运算得到的hash值,运算的公式为hash = ah(IRK, prand),具体算法我们现在可以先不关心。
当对端BLE设备扫描到该类型的蓝牙地址后,会使用保存在本机的IRK,和该地址中的prand,进行同样的hash运算,并将运算结果和地址中的hash字段比较,相同的时候,才进行后续的操作。
在蓝牙核心协议中指出:
一个BLE设备,可以使用两种类型的地址(一个BLE设备可同时具备两种地址):Public Device Address和Random Device Address。
引用:
ble协议栈从零开始三(linklayer 细致分析上)
蓝牙专题(3)——BLE协议栈(链路层Link Layer)
蓝牙学习之旅——低功耗蓝牙之链路层Link Layer
详解BLE 空中包格式—兼BLE Link layer协议解析
BLE(2)—— 基本特性(状态、角色、地址、信道)