ble 空口包格式
文章目錄
- 一、ble 空口包簡(jiǎn)介
- 二、Uncoded PHY 包格式(LE 1M 或 LE 2M PHY)
- 1. Preamble
- 2. Access Address
- 3. PDU
- 4. CRC
- 5. Constant Tone Extension
- 三、Coded PHY 包格式(LE 1M PHY)
- 四、Advertising Channels PDU
- 1. Header
- a. PDU Type
- b. ChSel
- c. TxAdd
- d. RxAdd
- e. Length
- 2. Payload
- a. Advertising PDU
- i. ADV_IND
- ii. ADV_DIRECT_IND
- iii. ADV_NONCONN_IND
- iv. ADV_SCAN_IND
- b. Scanning PDU
- i. SCAN_REQ
- ii. SCAN_RSP
- c. Initiating PDU
- i. CONNECT_IND
- 五、Date Channels PDU
- 1. Header
- 2. Payload
- a. LL Data PDU
- b. LL Control PDU
- i. 0x00 - LL_CONNECTION_UPDATE_IND
- ii. 0x01 - LL_CHANNEL_MAP_IND
- iii. 0x02 - LL_TERMINATE_IND
- iv. 0x03 - LL_ENC_REQ
- 0x04 - LL_ENC_RSP
- 0x05 - LL_START_ENC_REQ
- 0x06 - LL_START_ENC_RSP
- 0x0A - LL_PAUSE_ENC_REQ
- 0x0B - LL_PAUSE_ENC_RSP
- v. 0x07 - LL_UNKNOWN_RSP
- vi. 0x08 - LL_FEATURE_REQ
- 0x09 - LL_FEATURE_RSP
- 0x0E - LL_PERIPHERAL_FEATURE_REQ
- vii. 0x0C - LL_VERSION_IND
- viii. 0x0D - LL_REJECT_IND
- 0x11 - LL_REJECT_EXT_IND
- ix. 0x0F - LL_CONNECTION_PARAM_REQ
- 0x10 - LL_CONNECTION_PARAM_RSP
- x. 0x14 - LL_LENGTH_REQ
- 0x15 - LL_LENGTH_RSP
- xi. 0x16 - LL_PHY_REQ
- 0x17 - LL_PHY_RSP
- 0x18 - LL_PHY_UPDATE_IND
- xii. 0x19 - LL_MIN_USED_CHANNELS_IND
- 3. MIC
一、ble 空口包簡(jiǎn)介
BLE 工作在非授權(quán)的 2.4 GHz ISM 頻段,采用跳頻的方式來(lái)對(duì)抗干擾和衰落,定義了兩種調(diào)制方式:
- 強(qiáng)制調(diào)制方式:使用整形的二進(jìn)制頻率調(diào)制來(lái)最小化收發(fā)器的復(fù)雜性,符號(hào)率為 1 Msym/s,是設(shè)備必須支持的,支持兩種 PHY:
- LE 1M:Uncoded PHY,數(shù)據(jù)傳輸率為 1 Mb/s
- LE Coded:Coded PHY,Access Address、Coding Indicator、TERM1 數(shù)據(jù)傳輸率為 125 kb/s(S=8 coding),Payload 數(shù)據(jù)傳輸率為 125 kb/s(S=8 coding) 或 500 kb/s(S=2 coding),由于引入了 FEC 編解碼以及 Pattern Mapper 和 Demapper,雖然增加了接收機(jī)復(fù)雜度降低了傳輸速率,但使得藍(lán)牙設(shè)備能更遠(yuǎn)距離的傳輸數(shù)據(jù),從而更好地適應(yīng)物聯(lián)網(wǎng)應(yīng)用
- 可選調(diào)制方式:與強(qiáng)制調(diào)制方式類似,符號(hào)率為 2 Msym/s,是設(shè)備可選支持的,只支持一種 PHY:
- LE 2M,Uncoded PHY,數(shù)據(jù)傳輸率為 2 Mb/s
二、Uncoded PHY 包格式(LE 1M 或 LE 2M PHY)
1. Preamble
前導(dǎo)部分,是最先傳輸?shù)牟糠?#xff0c;用于接收方進(jìn)行頻率同步,符號(hào)時(shí)序評(píng)估和自動(dòng)增益控制訓(xùn)練,如果在 LE 1M PHY 上傳輸數(shù)據(jù)包長(zhǎng)度為 1B,在LE 2M PHY 上傳輸數(shù)據(jù)長(zhǎng)度為 2B
Preamble 是 1010 或者 0101 的序列,根據(jù) Access Address 的 LSB 來(lái)決定,LSB 是1,則前導(dǎo)是 1010,否則是 0101
2. Access Address
接入地址,空口包中標(biāo)識(shí)設(shè)備身份,根據(jù) Access Address 的不同,空口包分為兩種類型:
- advertising channels PDU:固定為 0x8E89BED6,ADV_IND, SCAN_REQ, SCAN_RESP, CONNECT_IND 只能在 37/38/39 信道上傳輸
- date channels PDU:一個(gè) 32bit 的隨機(jī)值,只在其余37個(gè)數(shù)據(jù)信道上傳輸,是連接成功后兩設(shè)備用于數(shù)據(jù)收發(fā)的
3. PDU
空口包數(shù)據(jù)部分,長(zhǎng)度 2 - 258 字節(jié),包括 advertising channels PDU 和 date channels PDU
4. CRC
包含 PDU 域的 CRC 24 的數(shù)據(jù)
5. Constant Tone Extension
這個(gè)域是 BLE 5.1 新增的,最主要的功能是 AoA/AoD (藍(lán)牙定位)的應(yīng)用,是一個(gè)可選的數(shù)據(jù)項(xiàng)
三、Coded PHY 包格式(LE 1M PHY)
preamble
不編碼,共 80 bits,(重復(fù) 10 次 00111100 )
CI(Coding Indicator)
PDU
同 Uncoded PHY,因 CI/TERM1/TERM2 占用了 1 個(gè)字節(jié),其長(zhǎng)度 2 - 257 字節(jié)
四、Advertising Channels PDU
使用廣播信道的包有多種,如 ADV_IND, SCAN_REQ, SCAN_RESP, CONNECT_IND, 其 AA 為特定值 0x8E89BED6,PDU 包括 Header 和 Payload
1. Header
a. PDU Type
b. ChSel
- 0 - 設(shè)備不支持信道選擇算法2
- 1 - 設(shè)備支持信道選擇算法2
c. TxAdd
- 0 - 設(shè)備地址是 public 類型
- 1 - 設(shè)備地址是 random 類型
d. RxAdd
- 0 - 對(duì)端設(shè)備地址是 public 類型
- 1 - 對(duì)端設(shè)備地址是 random 類型
e. Length
后面 Payload 的長(zhǎng)度,1 - 255 字節(jié)
2. Payload
a. Advertising PDU
i. ADV_IND
可連接的,可掃描的,不定向的廣播包,是經(jīng)典和常用的廣播包
可連接:其它設(shè)備可以發(fā)送 CONNECT_IND
可掃描:其它設(shè)備可以發(fā)送 SCAN_REQ,本設(shè)備也會(huì)回復(fù) SCAN_RSP
- AdvA:本機(jī)即廣播者設(shè)備地址,由 header 中的 TxAdd 指示類型
- AdvData:廣播數(shù)據(jù),0 - 31 字節(jié),可由本機(jī)即廣播者 Host 設(shè)置
ii. ADV_DIRECT_IND
可連接的,不可掃描的,定向的廣播包
定向的:廣播包是專門給某個(gè)指定設(shè)備用的,所以攜帶了對(duì)端的設(shè)備地址,因此也不再需要攜帶廣播數(shù)據(jù)
- AdvA:本機(jī)即廣播者設(shè)備地址,由 header 中的 TxAdd 指示類型
- TargetA:對(duì)端設(shè)備地址,由 header 中的 RxAdd 指示類型
iii. ADV_NONCONN_IND
不可連接,不可掃描,不定向的廣播包,沒(méi)有實(shí)際作用,只是在向空口發(fā)廣播包
- AdvA:本機(jī)即廣播者設(shè)備地址,由 header 中的 TxAdd 指示類型
- AdvData:廣播數(shù)據(jù),0 - 31 字節(jié),可由本機(jī)即廣播者 Host 設(shè)置
iv. ADV_SCAN_IND
不可連接,只可掃描,不定向的廣播包
- AdvA:本機(jī)即廣播者設(shè)備地址,由 header 中的 TxAdd 指示類型
- AdvData:廣播數(shù)據(jù),0 - 31 字節(jié),可由本機(jī)即廣播者 Host 設(shè)置
b. Scanning PDU
i. SCAN_REQ
當(dāng)掃描設(shè)備收到可掃描的廣播包后,掃描設(shè)備可發(fā)送 SCAN_REQ(active scanning 會(huì)發(fā)起掃描請(qǐng)求,passive scan 只接收廣播包不會(huì)發(fā)送掃描請(qǐng)求)
- ScanA:本機(jī)即掃描者設(shè)備地址,由 header 中的 TxAdd 指示類型
- AdvA:對(duì)端設(shè)備即廣播者設(shè)備地址,由 header 中的 RxAdd 指示類型
ii. SCAN_RSP
廣播設(shè)備收到 SCAN_REQ,則發(fā)送掃描響應(yīng) SCAN_RSP
- AdvA:本機(jī)即廣播者設(shè)備地址,由 header 中的 TxAdd 指示類型
- ScanRspData:掃描響應(yīng)數(shù)據(jù),0 - 31 字節(jié),可由本機(jī)即廣播者 Host 設(shè)置
c. Initiating PDU
i. CONNECT_IND
Initiating state 設(shè)備可以向 Advertising state 設(shè)備即廣播者發(fā)送 CONNECT_IND,然后進(jìn)入連接態(tài),成為 Central,廣播設(shè)備成為 Perpheral
-
InitA:本機(jī)即發(fā)起連接的設(shè)備地址,由 header 中的 TxAdd 指示類型
-
AdvA:對(duì)端設(shè)備即廣播者設(shè)備地址,由 header 中的 RxAdd 指示類型
-
LLData:建立連接的鏈路信息
- AA:ACL 連接的 Access Address,由 Master 生成,是一個(gè)隨機(jī)數(shù)
- CRCInit:ACL 連接的 CRC 計(jì)算初始值,由 Master 生成,是一個(gè)隨機(jī)數(shù)
- WinSize:用于計(jì)算 transmitWindowSize(WinSize * 1.25 ms)
- WinOffset:用于計(jì)算 transmitWindowOffset(WinOffset * 1.25 ms)
- Interval:用于計(jì)算 connInterval(Interval * 1.25 ms)
- Latency:用于計(jì)算 connPeripheralLatency(Latency)
- Timeout:用于計(jì)算 connSupervisionTimeout(Timeout * 10 ms)
- ChM:Channel Map,表示哪些 date channels(0 - 36)可用,bit 置 1 - 可用,bit 置 0 - 不可用
- Hop:hopIncrement,取值 5 - 16,為了連接的穩(wěn)定性,雙方需要不斷的切換信道進(jìn)行跳頻,下一次交互選擇哪個(gè)信道是由算法決定的,hopIncrement 即是算法的參數(shù)
- SCA:centralSCA,表示 Central 的時(shí)鐘精度
五、Date Channels PDU
1. Header
- LLID : 指示后面 payload 是數(shù)據(jù)面的還是控制面的,0b01 - 數(shù)據(jù)面,L2CAP后續(xù)分包,0b10 - 數(shù)據(jù)面,L2CAP 起始分包,0b11 - 控制面
- NESN:下一個(gè)期望的對(duì)端包的 Sequence Number
- SN:當(dāng)前包的 Sequence Number,與 NESN 一起決定了數(shù)據(jù)包是否傳輸 OK,進(jìn)行重傳和流控處理
- MD:More Data,表示后面是否跟有更多的數(shù)據(jù),有了這個(gè) MD 對(duì)端才會(huì)打開接收窗口繼續(xù)接收數(shù)據(jù)
- CP:CTEInfo Present,1 - 表示 PDU header 有 CTEInfo,packet 有 Constant Tone Extension,0 - 表示沒(méi)有
- Length:Playload + MIC 數(shù)據(jù)長(zhǎng)度,0 - 255(payload:0 - 251,MIC:4)
- CTEInfo:packet 中 Constant Tone Extension 的類型和長(zhǎng)度
2. Payload
a. LL Data PDU
數(shù)據(jù)面數(shù)據(jù)包,Header LLID 是 0b01 或 0b10,整個(gè) Payload 都是上層 L2CAP 數(shù)據(jù)
由于空口包中 Payload 最大長(zhǎng)度為 251,由此計(jì)算 ATT_MTU 最大值為 247(251 - L2CAP Header(4))
由 LE_Read_Buffer_Size 返回的 Link Layer acl buffer 大小為 251,由此計(jì)算 ATT_MTU 最大值為 247(251 - L2CAP Header(4))
因此,最終 ATT_MTU 值應(yīng)該為 min(Payload - 4, acl_buffer_size - 4),即兩者的較小值
b. LL Control PDU
控制面數(shù)據(jù)包,Header LLID 是 0b11。當(dāng) Connection 建立完成后,很多參數(shù)都固定下來(lái)了,如 transmitWindowSize,transmitWindowOffset,connInterval,connPeripheralLatency,connSupervisionTimeout 等,如何更改這些連接的參數(shù)呢,或者如何獲取對(duì)端設(shè)備的一些信息呢?
控制面包就是用于連接建立后進(jìn)行數(shù)據(jù)交互的,此時(shí) Payload 由 Opcode 和 CtrData 構(gòu)成
i. 0x00 - LL_CONNECTION_UPDATE_IND
更新已建立的連接的參數(shù),各字段值與 CONNECT_IND 中 LLDate 意義相同
ii. 0x01 - LL_CHANNEL_MAP_IND
更新已建立的連接的 Channel Map,即可用于數(shù)據(jù)傳輸?shù)男诺?#xff08;0 - 36)
- ChM: 1- 信道可用,0 - 信道不可用
- Instant:代表在多少個(gè) Event 的時(shí)候,雙方一起更新 Channel Map
iii. 0x02 - LL_TERMINATE_IND
向?qū)Χ嗽O(shè)備發(fā)出斷開連接請(qǐng)求
iv. 0x03 - LL_ENC_REQ
- Rand: 隨機(jī)數(shù),由 Host 生成
- EDIV: encrypted diversifier
- SKD_C: Central’s session key diversifier
- IV_C: Central’s initialization vector
0x04 - LL_ENC_RSP
- SKD_P: Peripheral’s session key diversifier
- IV_P: Peripheral’s initialization vector
0x05 - LL_START_ENC_REQ
0x06 - LL_START_ENC_RSP
0x0A - LL_PAUSE_ENC_REQ
0x0B - LL_PAUSE_ENC_RSP
沒(méi)有CtrData數(shù)據(jù)
v. 0x07 - LL_UNKNOWN_RSP
- UnknownType:收到的不能識(shí)別的 Opcode
vi. 0x08 - LL_FEATURE_REQ
- FeatureSet:Central Link Layer 支持的 features 集合
0x09 - LL_FEATURE_RSP
- FeatureSet:Peripheral Link Layer 支持的 features 集合
0x0E - LL_PERIPHERAL_FEATURE_REQ
- FeatureSet: Peripheral’s Link layer 支持的 features 集合
vii. 0x0C - LL_VERSION_IND
viii. 0x0D - LL_REJECT_IND
0x11 - LL_REJECT_EXT_IND
擴(kuò)展的 reject 命令,如果對(duì)端設(shè)備 link layer不支持該命令(feature set bit is 0), 則需要使用 LL_REJECT_IND
ix. 0x0F - LL_CONNECTION_PARAM_REQ
0x10 - LL_CONNECTION_PARAM_RSP
x. 0x14 - LL_LENGTH_REQ
0x15 - LL_LENGTH_RSP
- MaxRxOctets: 發(fā)送設(shè)備的 connMaxRxOctets,不小于 27B
- MaxRxTime: 發(fā)送設(shè)備的 connMaxRxTime,不小于 328us
- MaxTxOctets: 發(fā)送設(shè)備的 connMaxTxOctets,不小于 27B
- MaxTxTime: 發(fā)送設(shè)備的 connMaxTxTime,不小于 328us
xi. 0x16 - LL_PHY_REQ
0x17 - LL_PHY_RSP
- TX_PHYS:發(fā)送設(shè)備首選的發(fā)送 PHY
- RX_PHYS:發(fā)送設(shè)備首選的接收 PHY
0x18 - LL_PHY_UPDATE_IND
- PHY_C_TO_P:Central 向 Peripheral 發(fā)送數(shù)據(jù)包使用的 PHY
- PHY_P_TO_C:Peripheral 向 Central 發(fā)送數(shù)據(jù)包使用的 PHY
- Instant:代表在多少個(gè) Event 的時(shí)候,雙方一起更新 PHY
xii. 0x19 - LL_MIN_USED_CHANNELS_IND
- PHYS: Peripheral 使用的 PHYs
- MinUsedChannels:Peripheral 使用的 PHYs 最小信道個(gè)數(shù),取值 2 - 37
3. MIC
非加密的ACL連接,或者加密的ACL連接但payload長(zhǎng)度為0的時(shí)候,不包含該字段
總結(jié)
- 上一篇: 20个有用的iOS图标和应用模板资源
- 下一篇: 语文招教考试-古今中外神话故事汇总,教育