链路层位于物理层之上,链路层和物理层一样,都属于BLE协议栈的controller(控制器)部分。
在我查看的文章和书籍上,都是一来就介绍链路层的五种状态,这对于笔者这样理解能力不够又喜欢刨根问底的人来说,无疑是一种折磨,那五种状态和链路层有什么关系,为什么网上各种文章还有书籍都是一来就介绍各种状态之间的转换?好吧,或许是因为BLE核心协议就是这样做的,将其翻译过来就是现在网上和书籍上的内容。这对本来就不怎么聪明的大脑无疑是雪上加霜,无法理解这些状态和链路层有什么关系,为什么要在链路层引入那些状态。直到我使用英文搜索问题之后,发现有如下表述:
我恍然大悟,原来链路层就是一个或多个状态机,这样就可以理解core_4.2中为什么一来就是描述链路层状态。
链路层定义了在各种状态下的数据包格式、时序规范和接口协议,在物理层的基础上,提供两个或多个设备之间,和物理层无关的逻辑传输通道,对链路层的上层屏蔽了物理层的特性,链路层的上层不需要再理解物理层的信息。
链路层的五种状态:
• Standby State 待机态
• Advertising State 广播态
• Scanning State 扫描态
• Initiating State 发起态
• Connection State 连接态
对于Standby状态,有的翻译为就绪态,有的翻译为待机态,就我个人而言,更偏向于后者,因为待机更能准确的反映其状态,就绪态总是会给人一种万事俱备,只欠东风(连接)的感觉,可是Standby state是不能直接转换成连接状态的,所以笔者使用待机态表述Standby state。
状态机同一时刻只能有一种状态,链路层应至少具有一个支持广播态或扫描态之一的链路层状态机。
待机状态不接收和发送任何数据包,但是任何状态都可以转换成待机态。通过上图1.1可以很清楚地了解到各个状态之间的转换。
处于广播状态的链路层将发送广播信道包,并可能监听和响应由这些广播信道包触发的响应。广播状态中的设备称为广播者, 可以从待机状态进入广播状态(各个状态直接的转换看figure 1.1,后面不再赘述)。
处于扫描状态的链路层将侦听来自正在播放广播设备的广播信道数据包,处于扫描状态的设备称为扫描者。扫描态有两种子状态,主动扫描和被动扫描。主动扫描接收了广播报文后,对设备产生额外的兴趣,想要获取更多的信息,因而发送扫描请求给广播设备,并且接收该设备的响应数据;被动扫描即设备仅仅简单的侦听那些正在广播的设备,并接收其发送的广播报文。被动扫描就好像你走在地铁口,听到的那些房产销售广告,仅仅是听听而已,你就离开了;而主动扫描则是你听见了那些房产销售广告之后,你对它产生了兴趣,又主动问了问该广告的相关信息。扫描态只能和待机态进行相互转换,开始和停止扫描是其转换条件。
处于发起状态的链路层将侦听来自特定设备的广播信道数据包,并响应这些数据包来启动与设备的连接,即进入发起态之后,链路层监听自己试图连接的设备,一旦接收到该设备发送的广播报文,则发送连接请求,并使自身进入连接态。处于发起状态的设备称为发起者。
可以从发起状态或广播状态进入连接状态。 处于连接状态的设备被称为处于连接中。
连接态有两个子角色,Master Role和Slave Role,主连接角色和从连接角色,发起连接的,由发起态进入的叫做主连接态,被动接受连接,由广播态进入的叫做从连接态,断开连接则进入就绪态。进入连接态之后,链路层可以进行连接管理和数据传输,主连接中的链路层将与从连接中的设备通信,并定义传输时间。
处于Master Role的设备可以和多个Slave Role分时通信;处于Slave Role的设备只能和处于Master Role的设备通信。
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时,再来看它们有什么不一样。
DEVICE ADDRESS(设备地址)
LL层使用设备地址识别设备,BLE的设备地址分为公共地址和随机地址。
![]()
Public Device Address (公共设备地址)
![]()
Random Device Address (随机设备地址)
既然已经有公共地址了,为什么还需要随机地址呢?主要原因是固定的设备地址带来了很大安全隐患,同时,公共地址需要购买,增大了成本。显然,随机地址就是解决这些问题的。随机地址又分为Static Device Address和Private Device Address两类。
Static Device Address
Static Device Address的最高两个bit都为“1”,Random part of static address为46bits的随机数,但是这46位不能都为1或者0。同时,在一个上电周期内,Static Device Address不允许改变,但是在下一次上电时可以选择是否改变。
Private Device Address
Private Device Address又分为两种:Non-resolvable private address和Resolvable private address即不可解析和可解析专用地址。
Non-resolvable private address
其中:最高两bits为 '00';剩余的46bits是一个随机数,不能全部为0,也不能全部为1。Non-resolvable private address会定时更新,更新的周期建议值是15分钟。该种方式下的设备地址是动态变化的,虽然安全性得到提高,可是配对复杂性也随之增高,该种方式不常用。
resolvable private address
resolvable private address通过一个随机数和一个称作identity resolving key (IRK) 的密码生成,因此只能被拥有相同IRK的设备扫描到,可以防止被未知设备扫描和追踪。
高位24bits是随机数部分,其中最高两个bits为“10”;
低位24bits是随机数和IRK经过hash运算得到的hash值,运算的公式为hash = ah(IRK, prand),具体算法我们现在可以先不关心。
当对端BLE设备扫描到该类型的蓝牙地址后,会使用保存在本机的IRK,和该地址中的prand,进行同样的hash运算,并将运算结果和地址中的hash字段比较,相同的时候,才进行后续的操作。
NOTE:
![]()
![]()
一个BLE设备,可以使用两种类型的地址(一个BLE设备可同时具备两种地址):Public Device Address和Random Device Address。
以上是core_4.2的Vol 6,Part B的第一小节,还有2-6小节:
![]()
这些后面根据具体应用来研究。文章标题最后有一个 (星号)* ,代表未更新完毕。