0


【Bluetooth蓝牙开发】七、BLE协议之链路层

img
个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得!
img

文章目录

7.1 前言

ble_stack

经过

Physical Layer

的定义,通信所需的物理通道已经okay了,即40个

RF Channel

(后面统一使用

Physical Channel

指代)

此时

Link Layer

可以粉墨登场了,它主要的功能,就是在这些

Physical Channel

上收发数据,与此同时,不可避免的需要控制RF收发相关的参数。除此之外,还要做到:

  • Physical Layer仅仅提供了有限的40个Physical Channel,而BLE中参与通信的实体的数量,肯定不是这个数量级。Link Layer需要解决Physical Channel的共享问题
  • 通信是两个实体之间的事情,对这两个实体来说,它们希望看到一条为自己独享的传输通道(就是我们所熟悉的逻辑链路Logical Link)。这也是Link Layer需要解决的
  • Physical Channel是不可靠的,任何数据传输都可能由于干扰等问题而损毁、丢失,这对有些应用来说,是接受不了的。因此Link Layer需要提供校验、重传等机制,确保数据传输的可靠性;

img

7.2 状态(state)和角色(role)的定义

BLE协议在

Link Layer

层抽象出5种状态:

  • Standby State:待机状态,不发送数据,也不接收数据。该状态可以由任何状态进入,也可以切换到除Connection状态外的任意一种状态。
  • Advertising State:广播状态,可以发送,监听,响应广播通道包,由Standby状态进入。
  • Scanning State:扫描状态,能够监听广播设备发送的广播包,由Standby状态进入。
  • Initiating State:初始化状态,监听指定设备的广播通道包,并且响应广播包,并发送连接请求,以便和广播设备建立连接。当连接成功后,Initiater和对应的Advertiser都会切换到Connection状态。该状态由Standby状态进入。
  • Connection State:和某个实体建立了单独通道的状态,在通道建立之后,由 Initiating StateAdvertising State进入。通道断开后,会重新回到Standby状态。

image-20220614154315747

进入

Connect State

后,又定义了两种角色:

  • Master Role:由 Initiating State进入的Connect State,连接成功后,变成了Master Role
  • Slave Role:由 Advertising State进入的Connect State,连接成功后,变成了Slave Role

7.3 空中接口数据包

该章节官方文档定位:

Core5.0 P2562

状态和角色定义完成后,剩下的事情就简单了,主要包括两类:

  • 提供某一状态下,和其它实体对应状态之间的数据交换机制;
  • 根据上层实体的指令,以及当前的实际情况,负责状态之间的切换。
BLE

协议中,这些事情是由一个叫做空中接口数据包

(Air Interface Packets)

的家伙负责。

Air Interface Packets定义了一种包的格式,主要用于描述

LE Uncoded PHY

advertising channel

data channel

通信格式

包的格式如下

image-20220615113138249

7.3.1 Preamble字段

Preamble

前导码:是0和1的交替序列,当物理通道为

LE 1M PHY

时,前导码为

1Byte

;当前导码为

LE 2M PHY

时,前导码为

2Byte

格式如下

image-20220615141655627

7.3.2 Access Address字段

Access Address

:对于所有在广播通道发送的数据包,其值都为

0x8E89BED6

。一旦链路层处于Initiating State状态时,会生成一个新的

Access Address

用于连接。该

Access Address

为一个

4Byte

的值。

蓝牙使用

Access Address

来标识不同的设备,Access Address可以是一个公共的地址,也可以是一个随机的地址,无论是哪一种类型的地址,均为

48bits

长度。

  • 公共地址:官方定义的一些规范,通用的地址,这里不做解释。
  • 随机地址:可能是静态地址,或者是私有地址

7.3.2.1 静态地址

静态地址一般都是随机生成的,但是需要满足下面的几点规则:

  • 地址的两个最高有效位应该等于1
  • 随机地址部分,至少有一位为0
  • 随机地址部分,至少有一位为1

image-20220615101057288

大多数的设备(手机)都是在上电之后,初始化一次静态地址,一旦初始化后,静态地址就不变了;重新上电后,会生成新的静态地址。

7.3.2.2 私有地址

私有地址又分为:不可解析私有地址和可解析的私有地址。

① 不可解析的私有地址

不可解析私有地址,遵守以下生成规则:

  • 地址的两个最高有效位应该等于0
  • 随机地址部分,至少有一位为0
  • 随机地址部分,至少有一位为1
  • 不能与公共地址有冲突

image-20220615101813212

② 可解析的私有地址

可解析的私有地址,说直白点就是带加密算法所生成的。设备需要有

Local Identity Resolving Key (IRK)

或者

the Peer Identity Resolving Key (IRK)

这两个密钥,生成

24bit

的号码,

可解析的私有地址,遵守以下规则:

  • 地址的两个最高有效位为0和1
  • 随机地址部分,至少有一位为0
  • 随机地址部分,至少有一位为1

image-20220615112120527

总结:最高有效位的前两位,代表了设备地址的类型

7.3.3 PDU字段

Air Interface Packets

整体的包结构我们已经熟知,下面主要分析以下

PDU

字段。

PDU

:分为两种,广播通道上传输

Advertising Channel PDU

;数据通道上传输

Data Channel PDU

,长度为

2-257

字节

7.3.3.1 Advertising Channel PDU

**广播通道

PDU

,包括

Advertising PDU

Scanning PDU

Initiating PDU

三种类型。**

广播通道的

PDU

,由

16bit

的数据头和

1-255Byte

的可变大小数据组成。

image-20220615145215843

**

16bit

数据头组成如下**:

image-20220615145358790

  • PDU Type字段的类型有多种,如下

image-20220615145704203

PDU Type有多种,文章定位:

core 5.0 P2567

,可自行查阅。

  • ChSel:该位为1,支持LE Channel Selection Algorithm,即LE通道选择算法,反之,不支持。
  • TxAdd:该位为0,表明PayloadAdvA字段为公共的;该位为1,表明PayloadAdvA字段为随机的。
  • Length:该字段表明了Payload的长度

官方文档定位:

core 5.0 P2569

**常见的

Advertising PDU

有**:

  • ADV_IND:该PDU用于连接和扫描无定向的广播事件。

image-20220615151023353

  • ADV_DIRECT_IND:该PDU用于连接和扫描定向的广播事件。

image-20220629142104005

  • ADV_NONCONN_IND:该PDU用于不可连接和不可扫描的非定向广播事件

image-20220629142142991

**常见的

Scaning PDU

有**:

  • SCAN_REQ:该PDU为发送扫描请求

image-20220629142724738

  • SCAN_RSP:该PDU包括了广播者的地址和返回的扫描响应数据。

image-20220629143102110

**常见的

Initiating PDU

有**:

  • CONNECT_IND:该PDU用于建立连接

image-20220629143325051

image-20220629143809007

LLData

域有对应了一些链路层参数的设置,可以详细看

Core 5.0 P2578

**每一种

PDU Type

,都会定义自己的

Payload

组成。**

7.3.3.2 Data Channel PDU

数据通道PDU的格式,包括16bit的

Header

,可变大小的

Payload

,以及消息完整性检查

MIC

.

包的格式如下

image-20220629144449919

Header包括

image-20220629144521418

LLID

:该字段标识了这个包为

LL Data PDU

或者

LL Control PDU
NESN

:下次期望的序列号

image-20220629145217504

根据

LLID

字段,

Data Channel PDU

又分为

LL Data PDU

LL Control PDU

两种类型。

  • LL Data PDU:该PDU用于发送链路层的数据。

LLID

01b

时,并且

Length=0

时,表示一个

Empty PDU

LLID

10b

时,则Length不能设置为0。

  • LL Control PDU:该PDU用于控制链路层的连接。

image-20220629145700883

Opcode操作码也有多种:

image-20220629145740229

image-20220629145749688

每一种操作码对应不同的数据长度。详细可见

core5.0 P2589

7.3.4 CRC字段

CRC

字段:在链路层包的最后,校验所有的

PDU

数据,大小长度为

3Byte

如果PDU数据加密,则CRC将会计算加密后的PDU数据。

CRC算法采用多项式求和的形式进行,感兴趣的可以了解。

Core 5.0 P2601

image-20220630161953263

7.4 总结

本篇主要讲了

BLE

Link Layer

,包括链路层定义的角色和状态,空中接口数据包的通信格式以及各个字段的含义,方便我们去分析

LOG

和定位问题。

img


本文转载自: https://blog.csdn.net/dong__ge/article/details/125546196
版权归原作者 卐一十二画卐 所有, 如有侵权,请联系我们删除。

“【Bluetooth蓝牙开发】七、BLE协议之链路层”的评论:

还没有评论