天天看点

[BLE--Link Layer]空中包格式(待续)

简述

Link Layer的空中包格式,应当是所有基于BLE Link Layer上的其他layer的包的基本单位了,因此对其有个了解是很有必要的,也是了解其余层的包,通过空中包分析蓝牙协议的基础。

空中包格式

首先看下图:

[BLE--Link Layer]空中包格式(待续)

这就是蓝牙BLE的空中包总体格式了。

Preamble

报头,用来表示frequency synchronization,symbol timing estimation和

Automatic Gain Control (AGC) training,即频率同步,定时建立,自动增益控制等,对于ADV Pkt,报头始终为10101010b。对于DATA Pkt,可能为10101010b (Access Address最低位bit为0),也可能为01010101b(Access Address最低位bit为1)。

Access Address

其意义这里不再多说,对于ADV Pkt,始终为0x8E89BED6。

PDU

这里就是BLE传输数据主题部分咯,虽然上面还会有l2cap, ATT, GATT等各层,这里从总体上有这个PDU印象就好。在Link Layer的Physical Channel有提到BLE分为Advertise Channel和Data Channel两种,因此PDU也是分为这两种了,Advertise Channel PDU和Data Channel PDU咯。

CRC

最后是3个byte的CRC,24 bits,通过一个CRC多项式来计算PDU,得到该值。

先看下空中包整体的Err Check机制

[BLE--Link Layer]空中包格式(待续)

主要包括Access Address和CRC两部分的检查,这两者刚好在PDU的一前一后哦。

CRC值的得到

先上图,看下BLE使用的LFSR电路来产生CRC值(线性反馈移位寄存器):

[BLE--Link Layer]空中包格式(待续)
[BLE--Link Layer]空中包格式(待续)

CRC值的得到需要有初始的输入数:

- 对Data Channel PDU,使用CONNECT_REQ PDU中的CRC init数值;

- 对Adv Channel PDU,都使用数值0x555555。

从LFSR CRC图可看到使用3个byte一共24bit,上面的初始值就是在进行CRC前3个byte初始化为该初始值,bit 0放到图中的Position 0,bit 23放到Position 23。

PDU的每个bit,最先传输的那个bit开始,一个bit一个bit从上图的Position 23进入开始计算,直到所有PDU的bit都过完一遍,就得到一个3byte的CRC计算结果了。关于如何实现CRC算法,CRC算法实现这篇文章有硬件和软件的实现方式介绍。

Advertise Channel PDU

上面在介绍空中包的PDU部分时,提到其是分为Advertise Channel PDU和Data Channel PDU的,这里就先来看看Advertise Channel PDU这种咯。

首先也看下图:

[BLE--Link Layer]空中包格式(待续)

分为Header和Payload两部分,Header呢,应当是将这个Advertise Channel PDU分成了很多种类,便于不同的需求使来使用,而Payload应当就是对应于Header中某个类型的具体内容咯。

Header

看图先:

[BLE--Link Layer]空中包格式(待续)

16bit的Header部分的内容也分了好几个部分:

- TxAdd和RxAdd:应当是某些种类的Advertise Channel PDU会用到;

- Length:就是后面跟着的Payload部分的长度咯,6到37字节;

- PDU Type:表示不同的Advertise Channel PDU类型咯,有些PDU可能会包含一些Advertising Data,这个可以看看小弟这篇​​Advertising中信息的传递​​。Advertise Channel PDU的PDU Type到底有哪些呢?请看下面的这个表咯。

[BLE--Link Layer]空中包格式(待续)

Payload

Advertiser打的

继续阅读