天天看點

[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打的

繼續閱讀