1. 程式人生 > >[BLE--Link Layer]空中包格式(待續)

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

簡述

Link Layer的空中包格式,應當是所有基於BLE Link Layer上的其他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機制

這裡寫圖片描述
主要包括Access Address和CRC兩部分的檢查,這兩者剛好在PDU的一前一後哦。

CRC值的得到

先上圖,看下BLE使用的LFSR電路來產生CRC值(線性反饋移位暫存器):
LFSR CRC
這裡寫圖片描述
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演算法實現這篇文章有硬體和軟體的實現方式介紹。

上面在介紹空中包的PDU部分時,提到其是分為Advertise Channel PDU和Data Channel PDU的,這裡就先來看看Advertise Channel PDU這種咯。
首先也看下圖:
這裡寫圖片描述
分為Header和Payload兩部分,Header呢,應當是將這個Advertise Channel PDU分成了很多種類,便於不同的需求使來使用,而Payload應當就是對應於Header中某個型別的具體內容咯。

看圖先:
這裡寫圖片描述
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到底有哪些呢?請看下面的這個表咯。
這裡寫圖片描述
其實通過Advertise Channel PDU送的資料,都是在連線還沒建立之前咯,連線建立之後,就叫Data Channel PDU了,因此這裡的8種Advertise Channel PDU就可能是Advertiser/Scanner/Initiator打出的咯,關於這些角色不太清楚的話,可以看下這篇Link Layer狀態及其之間的切換就明白了。
由於Advertise Channel PDU不一定是Advertiser打出的咯,所以針對於Advertise Channel PDU的不同種類的說明,也分相應角色說下。

Payload

Advertiser打的