【轉】Nordic Ble 4.0爲什麼上層應用每次最多能透傳20Bytes的有效數據

1、BLE整個協議棧架構:

2、首先看一下 LL層數據包的結構

PDU即爲協議數據單元,長度爲2~39Bytes。

Ble 分爲廣播態和連接態,所以PDU幀格式就會有兩種:

廣播態下PDU格式如下:

    前2Bytes爲頭,既然是廣播態,廣播包中就會包含藍牙地址信息,所以Payload中的前6Bytes爲藍牙地址信息。

連接態下PDU格式如下:

前2Bytes爲頭,Payload中沒有藍牙地址信息,MIC 4個Bytes,只有在加密鏈路中才會存在。

LL層的Payload數據爲其上層L2CAP層協議的幀結構。

3. L2CAP協議層的數據幀結構如下:

L2CAP層幀結構:2Bytes的Len + 2Bytes的Ch ID + Information payload,同樣的道理 L2CAP 協議層Information payload

也是其上層ATT協議層的數據幀結構。

4、ATT協議層的數據幀結構如下:

如上,ATT協議幀結構包含1Bytes的Opcode+2Bytes的handle+(ATT_MTU-3)Bytes的真正有效數據。

Opcode用來指示write、notify或者indication的。即主機通過write將數據傳給從機,從機通過notify或者indication的方式將數據傳給主機。

handle爲具體哪個特徵值的句柄。

value爲真正有效的數據。

nordic的4.0協議棧中默認ATT_MTU只支持默認值即23。所以上層應用可發送的最大數據就是20Bytes了。

問題:這個23是怎麼來的呢?爲什麼LL層PDU最多支持39Bytes,到上層這裏就是20Bytes了呢?

計算方法:LL層PDU的39B - LL層PDU header 的2B - LL層Payload中廣播態中6B的ble address - LL層Payload中連接態中加密下的 4B的MIC - L2CAP層2B的Length - L2CAP層2B的Channel ID - ATT層1B的Opcode - ATT層2B的Handle = 20B

注意:這裏的計算一切都是最簡單的計算方法,比如同時減掉了LL層Payload中廣播態中6B的ble address 和 LL層Payload中連接態中加密下的 4B的MIC。

本文參考了 nRF52832 — 提高藍牙BLE的數據傳輸速率  這篇文章。非常感謝這位大神。

注:

GATT_Indication:從機通知主機後,主機需要調用simpleprofile_writeattrcb,讀取從機的數據。

GATT_Notification:從機直接發送給主機。

GATT_Indication和GATT_Notification的區別就在於主機是否回確認信息。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章