BLE 技术(三)--- 链路层七种状态与空口报文设计(Core_v5.2)

LE 链路层定义了两个设备如何利用无线电传输信息,包括报文、广播信道、数据信道等的详细定义,也规定了发现其它设备的流程、广播通讯、链接的创建与管理、链接通讯等。html

1、LE Link Layer States

广播通讯中发出广播报文的一方称为Advertiser,接收广播报文的一方称为Scanner,链接通讯中发起链接的一方称为Mater,接受链接的一方称为Slave,这些设备角色并非固定的,一个蓝牙设备能够根据须要在多个角色之间切换,也能够同时身兼多个角色。为了方便管理蓝牙设备的角色,在链路层使用状态机来标识蓝牙设备当前的状态,蓝牙设备角色的切换也就至关于状态机中状态的迁移,Bluetooth 5.2 链路层状态机以下:
LE Link layer state machineweb

  • Standby State:上电后,链路层进入并保持待机态,即不收发数据的非活动状态。根据上层的命令可由其它任何一种状态进入,也能够切换到除Connection状态外的任意一种状态;
  • Advertising State:能够经过广播通道发送数据的状态,由Standby状态进入。想向必定区域内其它设备广播数据的设备、可被发现或可被链接的设备须要处于Advertising状态,它广播的数据能够由处于Scanning或者Initiating状态的实体接收,也能够回应Scanning状态的实体发来的扫描请求。广播态的设备能够回到Standby状态,链接成功后也可切换为Connection状态;
  • Scanning State:能够经过广播通道接收数据的状态,由Standby状态进入。Scanning状态可用于侦听必定区域内的广播数据,有被动扫描和主动扫描两个子状态,被动扫描仅接收广播报文,主动扫描则发送扫描请求给广播态设备,并获取附加的扫描响应数据。Scanning状态的设备只能进入Standby状态,状态迁移条件是中止扫描;
  • Initiating State:为了发起链接,链路层须要处于Initiating状态,侦听本身试图链接的设备,若是收到了来自该设备的connectable广播报文,链路层会向其发送链接请求并进入Connection状态,当链接成功后对端的广播设备也会进入Connection状态。Initiating状态由Standby状态进入,若是再也不发起链接或链接失败则返回Standby状态,若是链接成功则创建链接的双方都进入Connection状态;
  • Connection State:和某个实体创建了单独通道的状态,在通道创建以后,由Initiating或者Advertising自动切换而来(由Initiating状态进入Connection状态的设备称为Master / Center,由Advertising状态进入Connection状态的设备称为Slave / Peripheral),通道断开后会从新回到Standby状态;
  • Isochronous Broadcasting State:能够经过广播通道发送BIS(Broadcast Isochronous Stream) 数据报文,由Standby状态进入。想向必定区域内其它设备广播同步数据流(好比音频数据流)的设备须要处于Isochronous Broadcasting状态,处于该状态的设备称为Isochronous Broadcaster。处于Isochronous Broadcasting状态的链路层状态机应发送由一个或多个BIS 组成的BIG(Broadcast Isochronous Group),每一个BIG最多包含31个BIS,每一个BIS承载一个单独的同步数据流。传输第一个BIS 数据报文后链路层应通知主机,若中止同步广播则回到Standby状态;
  • Synchronization State:能够经过广播通道接收BIS同步数据流,由Standby状态进入。Synchronization状态可用于侦听必定区域内的BIS广播同步数据流(好比音频数据流),处于Synchronization状态而且正在接收同步数据包的设备称为Synchronized Receiver,只能单向接收BIG,若是在主机指定时间内未侦听到任何有效BIG,处于该状态的设备将回到Standby状态并通知主机。

BLE 链路层各类通讯模式拓扑结构
从BLE 链路层支持的状态功能及其状态迁移过程能够看出,链路层通讯主要有三个模式:安全

  • Advertiser/Broadcaster — Scanner/Observer:广播者与扫描者之间经过广播信道传输数据,广播通讯是一种一对多的通讯方式,只要广播者发送的是可被发现报文,扫描者在信号接收范围内就能够接收到广播报文,扫描者的数量不受限制。广播通讯只能进行单方向通讯,因为不支持数据包分割重组而没法传输较大的数据包,广播者并不知道有谁接收了数据所以通讯并不可靠;
  • Isochronous Broadcaster — Synchronized Receiver:等时广播者与同步接收者之间经过广播信道传输同步数据流BIS(好比音频数据流),等时同步广播通讯也是一种一对多的通讯方式,是在Bluetooth 5.2 中新增的,一样只能进行单方向通讯,好比可让听讲座的众多观众借助支持该通讯模式的蓝牙耳机同步听到一个演讲者等时广播的音频数据流;
  • Master/Central — Slave/Peripheral:主从设备经过数据信道传输数据,链接通讯是一种一对一的通讯方式(一个主设备能够与多个从设备创建链接,每对儿主从设备构成一个独立的piconet),LE 的链接通讯通常用于传输异步数据,在Bluetooth 5.2 中新增了传输CIS(Connected Isochronous Stream)等时同步数据流的能力,每一个CIS 承载一个单独的等时同步数据流,一个或多个CIS 可组成CIG(Connected Isochronous Group),每一个CIG 最多包含31个CIS。

上面介绍的每种通讯模式均可以在链路层找到对应的Logical Link,下面给出承载每种通讯模式的Logical Link、Physical Link、Physical Channels 架构层级图:
LE 物理层与链路层架构网络

2、Link Layer Packet format

若是了解TCP/IP 协议栈,不难发现网络协议每层都有本身的数据报文结构,上层的报文至关于下一层的数据,每一层都会添加便于本层处理数据的报文字段。数据报文或者数据帧在分层协议中应用很是广泛,BLE 的链路层状态管理、状态迁移、链路数据传输都靠数据报文来实现。架构

BLE 链路层的报文能够看做是带标签的数据,由一个设备发送、一个或多个设备接收,标签指明了数据由谁发出,以及应该由哪些设备接收。Bluetooth 5.2 中的LE 链路层定义了两种基本的数据报文(对应LE Physical Layer 中介绍的四种调制方式):app

  • LE Uncoded PHYs:未使用纠错码能够有比较高的通讯速率(能够支持好比音频数据流这种高速率近距离的应用),从Bluetooth 5.x 开始提供两种调制码率也即LE 1M PHY 和LE 2M PHY,后者的通讯速率是前者的两倍;
  • LE Coded PHY:使用纠错码能够有比较远的传输距离(能够支持好比传感器这种低速率远距离的应用),从Bluetooth 5.x 开始也提供两种调制码率即LE Coded PHY with S=2 coding 和LE Coded PHY with S=8 coding,前者的传输距离是LE Uncoded PHYs 的两倍(速率为其1/2),后者的传输距离是LE Uncoded PHYs 的四倍(速率为其1/8);

这两种数据报文有什么区别呢?先从链路层对两种报文的比特流处理过程看起,在发射和接收数据的过程当中,未使用FEC(Forward error correction) 前向纠错码的LE Uncoded PHYs 报文只须要增长CRC生成/校验、数据白化与反白化(LE Physical Layer 中介绍过,为了解决GFSK 调制/解调连续相同比特能力差的问题)和可选的加密/解密过程便可。使用FEC 前向纠错码的LE Coded PHY 则须要新增FEC 编码/解码(纠错码原理可参考文章:二维码的秘密)、Pattern mapper(用于s = 2 或 s = 8 的模式映射),使用FEC 纠错码能够在数据丢失一部分的状况下恢复出原数据,所以能够接收并处理更小的信号(也即接收灵敏度更小),容许的最大损耗功率更大了,传播距离也就更远了。
Bit stream processing for LE Uncoded/Coded PHYsdom

  • LE Uncoded PHYs 数据报文格式:

Link Layer packet format for the LE Uncoded PHYs
LE Uncoded PHYs 数据报文中各字段的描述以下:异步

Packet Field Description
Preamble 全部链路层数据报文都会有一个前同步码,在接收器中用于执行频率同步、符号时序评估、自动增益控制等,是一个交替显示0 和 1 的固定比特序列。LE 1M PHY报文的前同步码为8位,LE 2M PHY报文的前同步码为16位,前同步码的第一个比特位应与Access Address 的LSB 首位相同。
Access Addredd 有广播接入地址和数据接入地址两种类型:广播信道的接入地址是固定值0x8E89BED6;数据信道的接入地址是一个随机值,不一样的链接有不一样的值,能够经过接入地址来区分不一样的链接。须要注意的是,这里的接入地址并不是蓝牙的MAC地址,二者比特长度都不相同,接入地址字段是不加密的,采用随机值能够避免被攻击者肯定正在通讯的是哪一个设备(设备的MAC地址在须要的时候放到PDU 中传递)。
PDU Protocol Data Unit,主要有三种类型:一个报文在primary or secondary advertising、periodic physical channel上传输时,为Advertising Physical Channel PDU;一个报文在data physical channel上传输时,为Data Physical Channel PDU;一个报文在isochronous physical channel上传输时,为Isochronous Physical Channel PDUs。这三种类型的PDU 正对应前面介绍的三种链路层通讯模式,是链路层报文的核心。
CRC Cyclic Redundancy Check,对PDU 计算获得一个24比特的循环冗余校验码,接收机能够经过CRC 校验及时发现传输比特错误,还能根据传输比特错误判断通讯信道受到干扰,能够协商及时跳频到下一个信道继续通讯。
CTE Constant Tone Extension,该字段是可选的,主要用于Bluetooth 5.1 新增的AoA 和AoD Direction Finding,支持Bluetooth 5.1 的设备能够经过CTE 信息实现厘米级的室内定位精度。
  • LE Coded PHY 数据报文格式:

Link Layer packet format for the LE Coded PHY
LE Coded PHY 数据报文每一个字段的长度都是根据持续时间Duration 定义的,这是由于物理层支持LE 1M PHY 和LE 2M PHY 两种速率,在不一样速率物理信道上传输时,该数据报文各字段比特数不一样,故使用Duration 定义各字段长度。LE Coded PHY 数据报文中与LE Uncoded PHYs 报文相同的字段做用差很少,这里再也不赘述,下面只给出LE Coded PHY 报文独有的字段描述:svg

Packet Field Description
Preamble 长度为80 个symbols,由10个重复的符号模式“ 00111100”(按传输顺序)构成。
CI Coding Indicator,用来识别FEC Block 2 使用的是 s=8 或 s=2 哪一种纠错码模式。
TERM1 / TERM2 每一个FEC Block 末尾都有一个terminator,每一个terminator 长度为3 比特。

了解了BLE 链路层两种基本数据报文的总体结构,下面开始介绍数据报文的核心 PDU Field,LE 链路层的三种通讯模式分别对应三种类型的PDU,将依次对其进行介绍。编码

2.1 Advertising physical channel PDU

BLE 为了提升广播通讯的效率并尽量下降功耗,只设计了 3 个固定广播信道,在Bluetooth 5.x 中为了加强广播能力,新增了扩展广播信道,能够将数据信道看成广播信道使用。广播信道PDU 包含Header 和Payload 两部分:
Advertising physical channel PDU

PDU Fields Description
PDU Type 广播PDU 的类型,目前支持 9 种类型,每种类型都有不一样的payload 格式和行为,下文将会逐个介绍
RFU RESERVED FOR FUTURE USE
ChSel 广播者是否支持LE Channel Selection Algorithm,若支持则该字段设置为 1
TxAdd 广播报文发送者的MAC 地址类型,若为public address 则该字段设置为 0;若为random address 则该字段设置为 1
RxAdd 广播报文接收者的MAC 地址类型,若为public address 则该字段设置为 0;若为random address 则该字段设置为 1
Length 数据有效载荷payload 的长度,有效范围是 1 - 255 个octets
Payload 广播数据的有效载荷,能够是实际广播传输的服务数据、主动扫描响应的附加数据、创建链接须要的信息等

继续介绍PDU 类型及其payload 以前,先简单解释下MAC 地址的类型,通常每一个蓝牙设备都有一个惟一且固定的MAC 地址,也就是上表提到的Public Device Address。Public MAC address 须要向IEEE 购买,申请、管理、维护Public MAC 成本较高,且固定的Device Address 有加大信息泄露的安全风险,为了进一步下降成本并提升安全性,BLE 协议新增了Random Device Address,即设备地址不是固定分配的,而是在设备设备启动后随机生成的(可参考博文:BLE地址类型)。
Advertising physical channel PDU header’s PDU Type field encoding
上面的广播类型根据使用的Physical Channel 能够分为三种类型:Primary Advertising、Secondary Advertising、Periodic。本文限于篇幅主要介绍Primary Advertising,Secondary Advertising做为Auxiliary广播类型就不介绍了,读者能够参阅Bluetooth Core Specification_v5.2

Periodic报文类型AUX_SYNC_IND 能够传输BIG(Broadcast Isochronous Group) 相关信息,辅助BIG 中多个BIS(Broadcast Isochronous Stream)的等时同步。

Primary Advertising PDU 类型根据链路层状态也可分为三类:Advertising PDUs、Scanning PDUs、Initiating PDUs。Advertising PDUs 包括ADV_IND、ADV_DIRECT_IND、ADV_NONCONN_IND、ADV_SCAN_IND、ADV_EXT_IND 五种类型,能够分别从是否可链接、是否可扫描、是否认向广播三个维度对比各类Advertising PDUs 的区别,这三种PDU 类型的Payload 以下表所示:
Primary Advertising PDU Type
上表中的AdvA (Advertiser’s Address) 、TargetA (Target’s Address)、ScanA (Scanner’s Address)、InitA (Initiator’s Address)均为BLE MAC Address,能够是public device address 或random device address,应与报文PDU Header 中的TxAdd/RxAdd field 设置类型一致。LLData field 包含跟链接参数相关的字段,介绍链接创建与管理时再谈。
CONNECT_IND Payload and LLData fields
Primary Advertising PDU 种的ADV_EXT_IND PDU 使用Common Extended Advertising Payload Format(包括PDU Type 为0b0111 和 0b1000 共六种类型),除了包含AdvA、TargetA、AdvData等 fields 外(支持最长可达254 octets 的AdvData),还包含CTEInfo、AdvDataInfo、AuxPtr、SyncInfo、TxPower、ACAD等 fields,本文就不展开介绍了。
Common Extended Advertising Payload Format

2.2 Data Physical Channel PDU

BLE 提供了37 个数据信道,数据信道PDU 除了包含Header 和Payload 两个固定部分外,还包括一个可选的MIC (Messages Integrity Check)消息完整性检查部分:
Data Physical Channel PDU
数据信道PDU 中的MIC 字段包含在加密的ACL (Asynchronous Connection-oriented) 链接中,且其有效载荷Payload 长度不能为零,在未加密的ACL 链接中或Payload 长度为零的链接中不得包含MIC 字段。

数据信道PDU 中Header 部分各字段的描述以下(CTEInfo 为可选字段,故Header 有两种长度):
Data Physical Channel PDU header field
L2CAP 会对上层应用数据进行分片重组,LLID 能够识别L2CAP 消息的首个和最后一个分片,方便接收者在一个链接事件内能及时判断被分片后的L2CAP 消息是否还有后续。LLID 也能区分PDU 是Data 类型仍是Control 类型。

NESN 和SN 两个字段用于报文的确认重传,为了尽量减小Header 长度,只分别使用 1 个比特来实现确认重传功能。

下图中tSqNo 表示本地设备已发送的 transmitSeqNum, Packet 中的NESN 表示对端设备指望接收的Next Expected Sequence Number。若是两者相同表示对端设备指望接收的下一个Packet 和本地设备已发送的Packet 相同,判断为NAK 信号也即对端设备要求重发以前的old data;若是两者不一样则表示对端设备指望接收的下一个Packet 和本地设备已发送的Packet 不一样,判断为ACK 信号也即对端设备已成功接收前一个packet,要求本地设备发送new data,同时tSqNo 自增 1。

nExSqNo 表示本地设备指望接收的nextExpectedSeqNum,Packet 中的SN 表示对端设备发送过来的Sequence Number。若是两者不一样则表示对端设备发送来的packet 不是本地设备下一个指望接收的packet,判断对端设备发送来的packet 是重传的old data,直接忽略;若是两者相同则表示对端设备发来的packet 正是本地设备下一个指望接收的packet,判断对端设备发来的packet 是new data,本地设备接收该packet,同时nExSqNo 自增 1。

若是一个设备可能由于某些缘由(好比RX buffer已满)没法接受并处理新的packet,能够选择不增长nExSqNo 发送NAK 信号,这样对端设备就会重发old data,本地设备忽略这些包含old data 的packet,就在链路层实现了流量控制机制(Flow control)。

Transmit and receive SN and NESN flow diagram
MD 用来通知对端设备本身是否还有其它数据准备发送,若是MD 被设为 1 则应在当前链接事件中继续与对端设备通讯;若MD 被设为 0 则设备能够快速结束当前链接事件以节省能量。

CP 用来标识Header 是否包含CTEInfo 字段信息,若是CP 设置为 1 则后面包含CTEInfo 字段信息,不然不包含CTEInfo 字段信息。

Length 则为有效载荷Payload 和 MIC 的长度之和,范围是0 到 255 octets,因为MIC 占用 4 octets 长度,Payload 的长度范围是 0 到 251 octets。

LL Data PDU 主要用来安全可靠高效的传输上层应用数据,LL Control PDU 则用来传输控制报文,LL Control PDU 目前支持38 个,下面仅给出链接参数更新报文LL_CONNECTION_UPDATE_IND 做为示例:
LL Control PDU Payload: LL_CONNECTION_UPDATE_IND

LL_CONNECTION_UPDATE_IND PDU 的CtrData fields 跟前面介绍的CONNECT_IND PDU 的LLData fields 有很多相同的参数,从这里也能够看出LL_CONNECTION_UPDATE_IND 主要是用来更新链接参数的,这几个参数的含义放到后面介绍链接创建与管理时再谈。

2.3 Isochronous Physical Channel PDU

等时同步信道是Bluetooth 5.2 新增的,主要用来传输等时同步数据流(好比音频数据流)。因为等时同步数据流先后有承接关系,等时同步报文并非相互独立的,看起来跟前面介绍的数据信道报文有点相似(前面介绍的广播报文都是相互独立的),也是由固定的 Header 和Payload 再加上可选的 MIC(Messages Integrity Check) 三部分构成(等时同步信道PDU 的Header 部分并无CTEInfo 字段)。

等时同步数据流既能够经过广播方式单向传输,也能够经过链接方式双向传输,对应的Isochronous Physical Channel PDU 也分为Connected Isochronous PDU 和 Broadcast Isochronous PDU 两种,下面分别介绍。

  • Connected Isochronous PDU

Connected Isochronous Physical Channel PDU
Connected Isochronous PDU Header 各field 描述以下:
Connected Isochronous PDU header field
等时信道是支持Stream 和Frame 两种数据封装方式传送的,LLID 的做用跟数据信道PDU 中的相似,能够识别上层CIS (Connected Isochronous Stream)同步数据流的起始、结束分片,也能够区分Unframed CIS Data 与 Framed CIS Data。NESN 和SN 字段的做用跟数据信道PDU 中的同样,也是用来实现确认重传的。

CIE 字段可让通讯一方提早关闭CIS 事件,即使还有剩余CIS 未传输完成。当传输CIS Null PDU 时,NPI 位应被设置为 1。Length 字段的做用跟数据信道PDU 中的同样,也是用来标识有效载荷Payload 和 MIC 的长度之和,范围是0 到 255 octets。

  • Broadcast Isochronous PDU

Broadcast Isochronous Physical Channel PDU
Broadcast Isochronous PDU Header 各 field 描述以下:
Broadcast Isochronous PDU header field
LLID 的做用跟前面Connected Isochronous PDU 中的相似,不过这里区分的是Unframed BIS Data、Framed BIS Data 和BIG Control PDU。CSSN 和CSTF field 是用来标识BIG Control PDU 的,若是在当前BIG (Broadcast Isochronous Group) 中有发送BIG Control PDU 则CSTF 标识位应设置为 1。CSSN 用来标识BIG Control PDU 的序列编号,方便接收者判断接收到的BIG Control PDU 是重传报文仍是新报文,因为广播通讯是单向传输的,所以没有相似CSNESN 之类的field。

BIG Control PDU 的Payload 目前支持两种类型:BIG_CHANNEL_MAP_IND 主要用于设置信道映射图channel map;BIG_TERMINATE_IND 主要用于通知Synchronized Receiver 广播同步组BIG 即将终止及其终止缘由。BIG Control PDU CtrData 中的Instant 字段用来控制新的设置什么时候生效,两种BIG Control PDU 的Payload 结构以下:
Format of the Payload of a BIG Control PDU

了解了LE 链路层的报文结构,下一篇看链路层是如何使用这些报文完成广播通讯和链接通讯的?

更多文章: