ble协议栈从零开始四(linklayer 细致分析中)

SIG BLE MESH 视频 教程https://edu.csdn.net/course/detail/27321​​​​​​​

1、前言:

本章节主要从linklayer层的设备地址,空中报文格式,以及数据流的接收和发送

2、SPEC的参考章节

 

ble协议栈从零开始四(linklayer 细致分析中)_第1张图片

在SPEC core_4.2表红圈的地方介绍了本章节的内容。

3、ble设备地址

少废话先看东西

ble协议栈从零开始四(linklayer 细致分析中)_第2张图片

从这张图我们可以看到出,ble的地址分为 public device address 和 random device address二大类。random device address 分为 static device address 和 private device address。 private device address 有分为 no-resolvable 和 resolvable。ble 分为这么多地址,干什么呢?其实都是为了应用不同场合的,后面会分析。

注意一点:ble设备至少需要包含上述的一种数据报文,如果一个设备使用了resolvable address,那么必须还要有一个identify address(public or static address)。

3.1、public device address

全球合法且独一无二的标识,这个就是电脑的MAC一样。缺点:要钱要钱,要钱去申请。

ble协议栈从零开始四(linklayer 细致分析中)_第3张图片

如上图,public device address 由48 bit组成。高24为表示公司的id(这个需要申请),低24bit由公司自己分配。

 

 

3.2、static device address

这个地址属于random地址,它的出现是因为public地址存在一些问题。第一个问题是public地址要钱,要申请。第二个问题是public的地址是固定的,很容易遭到窃取信息(比如这个设备在adv,我们只要知道这个设备的地址就能找到对应的adv的信息)。如果这个设备的在初始化随机生成地址呢?

ble协议栈从零开始四(linklayer 细致分析中)_第4张图片

static 的特征是:

1)上电初始化的时候随机生成

2)断电的时候地址丢失,不是强制的,如果地址丢失原先保存的peer的信息也会丢失

3)最高2bit为1

 

3.3、resolvable device address

这个地址比较有用,主要用在privacy上面。privacy会在后面的章节介绍。它是通过随机书prand和IRK生成的,IRK是Identity Resolving Key 的缩写,意思就是对方设备需要保存一个相同的IRK,才能解析我的地址,进而才能进行扫描和连接等操作。
ble协议栈从零开始四(linklayer 细致分析中)_第5张图片

 

1)最高2bit是1和0,剩下的22bit随机生成

 

2)最低24bit,使用rk和prand进行哈希算法生成哈希值

3)对方设备通过接受到你的prand,使用本地的irk,运用ah(local_irk,peer_prand)算出 hash与peer hash进行比较,如果相等表示解析成功

4)运用在privacy的策略上,后续文章会详细介绍

 

3.4、non resolvable device address

ble协议栈从零开始四(linklayer 细致分析中)_第6张图片

 

这个格式如上,不可解析(暂时还不知道它的应用场景,后续发现了会补上)

 

4、air packet format

ble协议栈从零开始四(linklayer 细致分析中)_第7张图片

上图展示是一个空中报文的格式,preamble , access address 的作用已经在前面的physical layer详细说明了。本章节主要主要分析PDU的部分。

PDU 分为 advertising channel PDUS 和data channel PUDS。

4.1 advertising channel PDUS

ble协议栈从零开始四(linklayer 细致分析中)_第8张图片

header:是16bit的头,这个头决定了这个报文的类型以及报文的长度,以及报文的设备的地址类型

ble协议栈从零开始四(linklayer 细致分析中)_第9张图片

PUD type:如下图,决定了报文的类型

ble协议栈从零开始四(linklayer 细致分析中)_第10张图片

length:的长度是6到37个字节,其中前6个字节是必须标识发送广播的源设备地址,后面的31个字节是用户数据,在HOST层的GAP便对这个31个字节数据进行格式的封装

txadd:发送报文的地址类型,0表示public地址,1表示random地址

rxadd:表示接收方设备地址类型,0表示public地址,1表示random地址

4.1.1、ADV_IND

ble协议栈从零开始四(linklayer 细致分析中)_第11张图片

一般通用的广播,支持scan和connect,可以额外携带31个字节的用户数据

 

4.1.2、ADV_DIRECT_IND

ble协议栈从零开始四(linklayer 细致分析中)_第12张图片

直接连接的广播,分为high duty 和 low duty 2中,这个报文是直接连接的报文,一般被连接方先扫描

 

4.1.2、ADV_NONCONN_IND 

ble协议栈从零开始四(linklayer 细致分析中)_第13张图片

 

不可连接和scan的广播,蓝牙的mesh的组网就是发送这种广播

 

 

4.1.3、ADV_SCAN_IND

ble协议栈从零开始四(linklayer 细致分析中)_第14张图片

 

这种广播可以被SCAN,但是不能连接

 

 

4.1.4、SCAN_REQ 

ble协议栈从零开始四(linklayer 细致分析中)_第15张图片

当advertising发送可以被scan的adv的时候,initiating 可以发送 scan request 报文 

 

4.1.4、SCAN_RSP

ble协议栈从零开始四(linklayer 细致分析中)_第16张图片

当advertising发送可以被scan的adv的时候,initiating 可以发送 scan request 报文 ,advertising 需要回复 scan rsp给

initiating。

 

4.2 data channel PDUS

ble协议栈从零开始四(linklayer 细致分析中)_第17张图片

header 携带了很多控制信息,例如 data的类型,payload 是有效载荷,mic是消息完整性检查分场景的(如果payload 为空或者该linklayer 没有加密可以不添加mic部分,反之添加mic部分)

 

4.2.1 header 分析

ble协议栈从零开始四(linklayer 细致分析中)_第18张图片

    ble协议栈从零开始四(linklayer 细致分析中)_第19张图片

大家自己看图吧,每个为都解释很清楚,如果不明白请查看我上一篇的文章。

data channel pdus 分为 ll data pdu和 ll control pdu。

 

 

4.2.2 ll control pdu

ble协议栈从零开始四(linklayer 细致分析中)_第20张图片

这个主要建立连接过后,发送一些控制命令进行交互,比如更新连接参数,交换feature(发送很多命令之前,都会先发送以便确认对方支不支持这个命令),下图列举了部分命令。不一一进行解释了

ble协议栈从零开始四(linklayer 细致分析中)_第21张图片

4.2.3 data control pdu

在header中LLID位如果是01表示是一个分段的数据,10表示是一个完整的数据报文。理论上一次connection event我们只能发20个有效的用户数据,大于20个有效数据就会分段进行发送,接受方通过判断这个位可以把分段的数据进行重组。

 

 

 

 

 

你可能感兴趣的:(ble,ble协议栈从零开始)