BLE链路层
BLE链路层位于物理层之上,主要是控制无线电进行数据的传输,其功能主要包括:
- 数据报文的管理
- 广播、数据信道的划分和管理
- 设备的广播、扫描、连接建立、连接管理、连接中的数据传输
- 数据加密
- 2.4G频段跳频技术抗干扰等
链路层状态机
如上图所示,链路层状态机总共有5中状态,我们依次对其进行说明:
就绪态
链路层上电后就进入了就绪态,处于等待host的命令的状态,在链路层状态机中处于中心状态,是其他状态转换的中转站,是一种非活动状态,但是ble中保持时间最长的状态。
广播态
处于广播态的链路层可以完成以下工作:
- 发送广播报文
- 接收扫描请求
- 发送扫描响应
其状态变化很简单,停止广播就进入了就绪态;在收到发起者的连接请求后就进入了连接态。
扫描态
扫描态分为两种子状态,主动扫描和被动扫描。
其区别很容易理解,被动扫描即设备仅仅简单的侦听那些正在广播的设备,并接收其发送的广播报文;主动扫描则接受了广播报文后,对设备产生额外的兴趣,想要获取更多的信息,因而发送扫描请求给广播设备,并且接受该设备的响应数据。被动扫描就好像你走在大街上,听到的那些广告,而主动扫描则是你听见了那些广告,又问了问发广告的人相关的信息。
扫描态只能和就绪态进行相互转换,开始和停止扫描就是转换条件。
发起态
为了发起连接,链路层必须处于发起态。进入发起态之后,链路层监听自己试图连接的设备,一旦接收到该设备发送的广播报文,则发送连接连接请求,并使自身进入了连接态;而链路层不在试图发送连接请求时,转入就绪态。
连接态
连接态也有两个子状态,从连接态和主连接态,发起连接的即由发起态进入的叫做主连接态,被动接受连接由广播态进入的叫做从连接态。断开连接则进入就绪态。
进入连接态之后,链路层可以进行连接管理和数据传输。
主设备定期向从设备发送报文,从设备通过相应这些报文进行数据的发送,从设备无权主动发送数据。
多个状态机
对于单个链路而言,只有一个状态是激活的,但是很多情况下,是存在多条链路的,每一个链路有分别对应一个状态机实例。
多个状态机实例中的状态却存在很多限制,在不同的状态机中不能同时作为主从设备,也不能同时作为两个设备的从设备,同时,因为这两个限制,导致有些状态是冲突的,例如,处于从连接状态的设备不能处于发起态,因为这会导致设备同时成为主从状态。
《低功耗蓝牙权威指南》一书中对于这种限制的目的做了如下的描述:
通过这一限制,设备在任何时间点上做任何事情没有不确定性。这一确定性是的设备可以使用高效的调度算法,这符合低功耗的需要。
设计目的
状态机是整个链路层的核心,链路层都是围绕状态机进行设计的。那么状态机的设计肯定整体上的设计目的的,除了我们知道的状态机设计可以将与特定状态相关的行为分离开来,实现架构的清晰和见解之外,还有低功耗的要求。实现状态机的,可将广播、发现、连接过程与数据传输分离,使得广播信道得以分离,这样因为广播必须在所有的广播信道传输相同的广播报文,这样的设计其广播的功耗降低到3信道的功耗。