蓝牙相关学习:4.2.BLE空口包结构 - PDU
PDU
- PDU 基本數(shù)據(jù)結(jié)構(gòu)
- LL Header
- 廣播包(廣播報(bào)文)
- Advertising Header
- PDU Type
- Advertising PDU
- Scanning PDU
- Initialing PDU
- Payload length
- Payload (有效數(shù)據(jù)包)
- Advertising Address
- Advertising Data
- 完整數(shù)據(jù)包
- 數(shù)據(jù)包(數(shù)據(jù)報(bào)文)
- Data Header
- LL DATA PDU
- LL Control PDU
- Payload Length
- Payload
- LL DATA PDU
- L2CAP PDU Length
- L2CAP Channel ID (L2CAP CID)
- LL Control PDU
- Opcode
- CtrData
- 參考地址
BLE 4.0 - BLE 5.0 ,BLE 5.1 的部分內(nèi)容沒(méi)有加入到里面,待添加
PDU 基本數(shù)據(jù)結(jié)構(gòu)
PDU(protocol data unit,協(xié)議數(shù)據(jù)單元,BLE 數(shù)據(jù)傳送的基本單元)前兩個(gè)字節(jié)固定為L(zhǎng)L header(1個(gè)字節(jié)長(zhǎng))和 payload length(1個(gè)字節(jié)長(zhǎng),又稱data length),即可以展開為:
協(xié)議數(shù)據(jù)單元,又分為廣播通道PDU和數(shù)據(jù)通道PDU
LL Header
長(zhǎng)度為一個(gè)字節(jié)。
在廣播包里他是 Advertising Header;在數(shù)據(jù)包里他是 data header
廣播包(廣播報(bào)文)
Advertising Header
PDU Type:標(biāo)識(shí)ADV
RFU : 預(yù)留
ChSel:如果本機(jī)支持跳頻(Hopping)算法 #2,這設(shè)置成為 1
TxAdd:如果為 0 代表 ADV 是 public 類型的 Address,否則為 1,是 random 類型的 Address
RxAdd:如果為 0 代表期望的對(duì)端地址類型為 public,否則為1,代表期望對(duì)端的 Target Address 為 random(在指向性廣播中使用,因?yàn)橹赶蛐詮V播,攜帶了對(duì)端地址,其他類型廣播,這個(gè) bit 沒(méi)用)
PDU Type
Advertising PDU
| ADC_IND(通用廣播) | Advertiser發(fā)送的、可被連接的、無(wú)方向的廣播數(shù)據(jù)(connectable undirected advertising event) | |
| ADV_DIRECT_IND(定向廣播) | Advertiser發(fā)送的、可被連接的、單向廣播數(shù)據(jù)(connectable directed advertising event) | |
| ADV_NONCONN_IND(不可連接廣播) | Advertiser發(fā)送的、不可被連接的、無(wú)方向的廣播數(shù)據(jù)(non-connectable undirected advertising event) | |
| ADV_SCAN_IND(可掃描廣播) | Advertiser發(fā)送的、可接受SCAN_REQ請(qǐng)求的、無(wú)方向的廣播數(shù)據(jù)(scannable undirected advertising event) |
Scanning PDU
| SCAN_REQ(掃描請(qǐng)求) | Scanner發(fā)送的、向Advertiser請(qǐng)求額外信息的數(shù)據(jù)包(一般需要在收到ADV_SCAN_IND后才可發(fā)送) | |
| SCAN_RSP(掃描響應(yīng)) | Advertiser發(fā)送的、響應(yīng)SCAN_REQ請(qǐng)求的數(shù)據(jù)包 |
Initialing PDU
| CONNECT_REQ(連接請(qǐng)求) | Initiater 發(fā)起的、請(qǐng)求建立連接的數(shù)據(jù)包 | |
| CONNECT_IND(5.1) |
根據(jù)藍(lán)牙spec規(guī)定,advertiser發(fā)送完一個(gè)廣播包之后150us(T_IFS),advertiser必須開啟一段時(shí)間的射頻Rx窗口,以接收來(lái)自observer的數(shù)據(jù)包。Observer就可以在這段時(shí)間里給advertiser發(fā)送連接請(qǐng)求。如下圖所示,手機(jī)在第三個(gè)廣播事件的時(shí)候掃到了設(shè)備B,并發(fā)出了連接請(qǐng)求CONN_REQ(CONN_REQ又稱為CONNECT_IND)。
轉(zhuǎn):詳解BLE連接建立過(guò)程:https://www.cnblogs.com/iini/p/8972635.html
Payload length
數(shù)據(jù)包:長(zhǎng)度域包含5個(gè)比特,有效值的范圍是0~31。(原BLE4.0 4.1中 規(guī)定數(shù)據(jù)長(zhǎng)度5個(gè)比特)
廣播包:長(zhǎng)度域包含6個(gè)比特,有效值的范圍是6~37。
廣播包和和數(shù)據(jù)包的長(zhǎng)度域有所不同,主要原因是:廣播包除了最多31個(gè)字節(jié)的數(shù)據(jù)之外,還必須要包含6個(gè)字節(jié)的廣播設(shè)備地址。6+31=37,所以需要6比特的長(zhǎng)度域。
轉(zhuǎn) :https://www.cnblogs.com/debugdabiaoge/p/15772546.html
Payload (有效數(shù)據(jù)包)
在廣播包中,Payload由兩部分組成,Advertising Address 和 Advertising Data組成,如下:
Advertising Address
Device Address,廣播包中的強(qiáng)制字段(數(shù)據(jù)包里沒(méi)有),俗稱藍(lán)牙MAC地址。
如果是廣播包,則是advertiser的MAC地址;如果是scan包或者連接請(qǐng)求包,則是scanner的MAC地址。
藍(lán)牙device address為6個(gè)字節(jié),這樣Advertising data最長(zhǎng)為:37-6 = 31B,這就是廣播包數(shù)據(jù)最長(zhǎng)只能31個(gè)字節(jié)的由來(lái)(1M PHY)。
分類:
藍(lán)牙協(xié)議分析(6)_BLE地址類型:http://www.wowotech.net/bluetooth/ble_address_type.html
一個(gè)BLE設(shè)備兩種地址都可以使用(Public Device Address和Random Device Address)
Public Device Address
需要向IEEE購(gòu)買;管理申請(qǐng)繁瑣;不安全
Advertising Data
轉(zhuǎn):藍(lán)牙協(xié)議分析(5)_BLE廣播通信相關(guān)的技術(shù)分析 http://www.wowotech.net/bluetooth/ble_broadcast.html
廣播數(shù)據(jù)(或者掃描應(yīng)答數(shù)據(jù))由一個(gè)一個(gè)的AD Structure組成,對(duì)于未滿31bytes的其它數(shù)據(jù),則填充為0(無(wú)效數(shù)據(jù));
每個(gè)AD Structure由兩部分組成:1byte的長(zhǎng)度信息(Data的長(zhǎng)度),和剩余的Data信息;
Data信息又由兩部分組成:AD Type(長(zhǎng)度不定)指示該AD Structure的類型,以及具體的AD Data。
無(wú)效數(shù)據(jù)部分
廣播包的長(zhǎng)度必須是 31 個(gè) byte,如果有效數(shù)據(jù)部分不到 31 自己,剩下的就用 0 補(bǔ)全。這部分的數(shù)據(jù)是無(wú)效的。
最關(guān)鍵的還是AD Type,BLE協(xié)議根據(jù)實(shí)際的應(yīng)用場(chǎng)景,定義了各種各樣的AD type,以及相應(yīng)的數(shù)據(jù)格式,例如
參考地址:
https://www.pianshen.com/article/7755244605/
https://www.jianshu.com/p/7d814c22a085
| Flags | 0x01 | 標(biāo)注藍(lán)牙特性 | |
| Service UUIDs | 0x02 | 標(biāo)注服務(wù)UUID | 非完整的16 bit UUID列表 |
| Service UUIDs | 0x03 | 標(biāo)注服務(wù)UUID | 完整的16 bit UUID列表 |
| Service UUIDs | 0x04 | 標(biāo)注服務(wù)UUID | 非完整的32 bit UUID列表 |
| Service UUIDs | 0x05 | 標(biāo)注服務(wù)UUID | 完整的32 bit UUID列表 |
| Service UUIDs | 0x06 | 標(biāo)注服務(wù)UUID | 非完整的128 bit UUID列表 |
| Service UUIDs | 0x07 | 標(biāo)注服務(wù)UUID | 完整的128 bit UUID列表 |
| Local Name | 0x08 | 標(biāo)注名稱 | 設(shè)備簡(jiǎn)稱 |
| Local Name | 0x09 | 標(biāo)注名稱 | 設(shè)備全名 |
| TX Power Level | 0x0A | 標(biāo)注射頻發(fā)射功率 | 表示設(shè)備發(fā)送廣播包的信號(hào)強(qiáng)度 |
| Simple Pairing Option OOB Tags | 0x0D | 標(biāo)注安全管理帶我外標(biāo)簽 | 設(shè)備類別 |
| Simple Pairing Option OOB Tags | 0x0E | 標(biāo)注安全管理帶我外標(biāo)簽 | 設(shè)備配對(duì)的Hash值 |
| Simple Pairing Option OOB Tags | 0x0F | 標(biāo)注安全管理帶我外標(biāo)簽 | 設(shè)備配對(duì)的隨機(jī)值 |
| Security Manager TK Value | 0x10 | 標(biāo)注 帶外方式配對(duì)綁定時(shí)的TK | TK安全管理 |
| Security Manager Out of Band | 0x011 | 標(biāo)注帶外特性標(biāo)志 | 帶外安全管理 |
| Slave Connection Interval Range | 0x012 | 標(biāo)注連接參數(shù)范圍 | 外設(shè)(Slave)連接間隔范圍 |
| List of 16-bit Service Solicitation UUIDs | 0x014 | 標(biāo)注主機(jī)特定服務(wù) | 服務(wù)搜尋16 bit UUID列表 |
| List of 128-bit Service Solicitation UUIDs | 0x015 | 標(biāo)注主機(jī)特定服務(wù) | 服務(wù)搜尋128 bit UUID列表 |
| Service Data | 0x016 | 服務(wù)數(shù)據(jù) | 16 bit UUID Service,前兩個(gè)字節(jié)是UUID,后面是Service的數(shù)據(jù) |
| Public Target Address | 0x17 | 公開目標(biāo)地址,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了公開地址 | |
| Random Target Address | 0x18 | :隨機(jī)目標(biāo)地址,表示希望這個(gè)廣播包被指定的目標(biāo)設(shè)備處理,此設(shè)備綁定了隨機(jī)地址 | |
| Appearance | 0x19 | 表示設(shè)備的外觀 | |
| Advertising Interval | 0x1A | 廣播區(qū)間 | |
| LE Bluetooth Device Address | 0x1B | LE設(shè)備地址 | |
| LE Role | 0x1C | LE設(shè)備角色 | |
| Simple Pairing Hash C-256 | 0x1D | 256位設(shè)備配對(duì)的Hash值 | |
| Simple Pairing Randomizer R-256 | 0x1E | 256位設(shè)備配對(duì)的隨機(jī)值 | |
| Service Data - 32-bit UUID | 0x20 | 32 bit UUID Service,前4個(gè)字節(jié)是UUID,后面是Service的數(shù)據(jù) | |
| Service Data - 128-bit UUID | 0x21 | 128 bit UUID Service,前16個(gè)字節(jié)是UUID,后面是Service的數(shù)據(jù) | |
| 3D Information Data | 0x3D | 3D信息數(shù)據(jù) | |
| Manufacturer Specific Data | 0xFF | 廠商信息 | 廠商自定義數(shù)據(jù),廠商自定義的數(shù)據(jù)中,前兩個(gè)字節(jié)表示廠商ID,剩下的是廠商自己按照需求添加,里面的數(shù)據(jù)內(nèi)容自己定義。 |
Flags
bit 0: LE有限發(fā)現(xiàn)模式
bit 1: LE普通發(fā)現(xiàn)模式
bit 2: 不支持BR/EDR
bit 3: 對(duì)Same Device Capable(Controller)同時(shí)支持BLE和BR/EDR
bit 4: 對(duì)Same Device Capable(Host)同時(shí)支持BLE和BR/EDR
bit 5…7: 預(yù)留
Security Manager Out of Band
bit 0: OOB Flag,0-表示沒(méi)有OOB數(shù)據(jù),1-表示有
bit 1: 支持LE
bit 2: 對(duì)Same Device Capable(Host)同時(shí)支持BLE和BR/EDR
bit 3: 地址類型,0-表示公開地址,1-表示隨機(jī)地址
完整數(shù)據(jù)包
0d 03 4e 00 00 80 03 26 aa d6 be 89 8e 00 24 40 9c d0 38 c1 a4 02 01 06 03 03 1a 18 09 ff 5a a5 a4 c1 38 d0 9c 40 0c 09 44 46 53 4b 30 34 2d 39 43 34 30 93 52 e4
我們傳輸?shù)臄?shù)據(jù)結(jié)構(gòu):
aa d6 be 89 8e 00 24 40 9c d0 38 c1 a4 02 01 06 03 03 1a 18 09 ff 5a a5 a4 c1 38 d0 9c 40 0c 09 44 46 53 4b 30 34 2d 39 43 34 30 93 52 e4
aa – 前導(dǎo)幀(preamble)
d6 be 89 8e (0x8E89BED6) – 訪問(wèn)地址(access address)
00 – LL幀頭字段(LL header)
24 – 有效數(shù)據(jù)包長(zhǎng)度(payload length)
40 9c d0 38 c1 a4 (0xA4C138D09C40)– 廣播者設(shè)備地址(advertiser address)
02 01 06 03 03 1a 18 09 ff 5a a5 a4 c1 38 d0 9c 40 0c 09 44 46 53 4b 30 34 2d 39 43 34 30 – 廣播數(shù)據(jù)
93 52 e4 – CRC24值
數(shù)據(jù)包(數(shù)據(jù)報(bào)文)
Data Header
轉(zhuǎn):BLE(8)—— 連接態(tài)數(shù)據(jù)包組成( Connection Packets PDUs)https://stephenzhou.blog.csdn.net/article/details/95938674
LLID : 用于區(qū)分這個(gè) Connection 的包是普通的數(shù)據(jù)包(L2CAP 的起始/連續(xù)/空包),還是 Control PDU
NESN:下一個(gè)期望的對(duì)端包的 Sequence Number
NESN 和 SN 來(lái)決定了數(shù)據(jù)包是否傳輸 OK,也就是是否需要重傳
SN:當(dāng)前包的 Sequence Number
NESN 和 SN 來(lái)決定了數(shù)據(jù)包是否傳輸 OK,也就是是否需要重傳
MD:是否有 More Data
MD 決定了后面是否跟有更多的數(shù)據(jù)。有了這個(gè) MD,對(duì)端才會(huì)開窗繼續(xù)來(lái)收數(shù)據(jù)。
RFU:預(yù)留
LL DATA PDU
當(dāng) Connection 的包體中 LLID 是 01’b 或者 10’b 的時(shí)候,說(shuō)明這個(gè)是個(gè)數(shù)據(jù)包(L2CAP的)
如下,是01的時(shí)候,是數(shù)據(jù)包
如下,是10的時(shí)候,是數(shù)據(jù)包
如上,01的時(shí)候數(shù)據(jù)包是空包,10的時(shí)候數(shù)據(jù)包是普通數(shù)據(jù)包
LL Control PDU
當(dāng) Connection 的包體中 LLID 是 11’b 的時(shí)候,說(shuō)明這個(gè)是個(gè)控制包(LL Control PDU)
如下,11的時(shí)候是控制包
Payload Length
數(shù)據(jù)包:長(zhǎng)度域包含5個(gè)比特,有效值的范圍是0~31。
原BLE4.0 4.1中 規(guī)定數(shù)據(jù)長(zhǎng)度5個(gè)比特。BLE4.2以后可以修改。
Payload
LL DATA PDU
LL DATA PDU數(shù)據(jù)包就是 L2CAP的數(shù)據(jù)包。
如果包含MIC部分
mic是消息完整性檢查分場(chǎng)景的(如果payload 為空或者該linklayer 沒(méi)有加密可以不添加mic部分,反之添加mic部分)
L2CAP PDU Length
表示后面information payload的長(zhǎng)度,information payload最大長(zhǎng)度除了受這個(gè)L2CAP length字段約束,同時(shí)還受MTU的限制。
MTU,Maximum Transmission Unit,是ATT層與L2CAP層可以交互的最大數(shù)據(jù)長(zhǎng)度,或者說(shuō)是Client與Server可以交互的最大長(zhǎng)度。
總結(jié)一下,藍(lán)牙spec里面定義了2個(gè)長(zhǎng)度字段:
LL data length和L2CAP length,同時(shí)ATT層還定義了一個(gè)MTU,以限制ATT PDU最大長(zhǎng)度。
LL data length可以通過(guò)LL_LENGTH_REQ和LL_LENGTH_RSP來(lái)動(dòng)態(tài)改變,MTU size則可以通過(guò)后面要講到的Exchange MTU Request和Exchange MTU Response來(lái)改變,而L2CAP length無(wú)法動(dòng)態(tài)改變,也就是說(shuō)不能超過(guò)65535。
L2CAP Channel ID (L2CAP CID)
邏輯通道的ID,BLE使用固定的通道編號(hào),也就是說(shuō)雖然藍(lán)牙spec里面也允許BLE使用connection oriented channel,但大部分BLE協(xié)議棧實(shí)現(xiàn)的時(shí)候都是使用固定的通道編號(hào),通道編號(hào)定義如下所示:
| 0x0004 | 用于ATT協(xié)議 | |
| 0x0005 | 用于L2CAP信令 | |
| 0x0006 | 用于安全管理 |
待續(xù),先這樣吧
LL Control PDU
連接建立之后,Master或者Slave可以借助Link Layer Control Protocol (LLCP),通過(guò)LL Control PDU,對(duì)連接進(jìn)行管理控制
數(shù)據(jù)格式如下:
LL Control PDU是在Link layer層直接進(jìn)行交互的,他們不會(huì)經(jīng)過(guò)后面的L2CAP層。
Opcode
| 0x00 | LL_CONNECTION_UPDATE_IND | 更新鏈接參數(shù) |
| 0x01 | LL_CHANNEL_MAP_REQ(4.2) | 更新鏈接的 Channel Map |
| 0x01 | LL_CHANNEL_MAP_IND(5.1) | 更新鏈接的 Channel Map |
| 0x02 | LL_TERMINATE_IND | 斷開連接請(qǐng)求 |
| 0x03 | LL_ENC_REQ | 加密流程相關(guān)交互 |
| 0x04 | LL_ENC_RSP | 加密流程相關(guān)交互 |
| 0x05 | LL_START_ENC_REQ | 加密流程相關(guān)交互 |
| 0x06 | LL_START_ENC_RSP | 加密流程相關(guān)交互 |
| 0x07 | LL_UNKNOWN_RSP | 收到未知的 LLCP 后的回復(fù) |
| 0x08 | LL_FEATURE_REQ | 請(qǐng)求交換 Feature 的交互,藍(lán)牙設(shè)備連接后用于數(shù)據(jù) |
| 0x09 | LL_FEATURE_RSP | 請(qǐng)求交換 Feature 的交互 |
| 0x0A | LL_PAUSE_ENC_REQ | 重啟加密流程相關(guān)交互 |
| 0x0B | LL_PAUSE_ENC_RSP | 重啟加密流程相關(guān)交互 |
| 0x0C | LL_VERSION_IND | 交換藍(lán)牙協(xié)議版本 |
| 0x0D | LL_REJECT_IND | 拒絕請(qǐng)求 |
| 0x0E | LL_SLAVE_FEATURE_REQ | Slave 請(qǐng)求 Feature |
| 0x0F | LL_CONNECTION_PARAM_REQ | 更新鏈接參數(shù) |
| 0x10 | LL_CONNECTION_PARAM_RSP | 更新鏈接參數(shù) |
| 0x11 | LL_REJECT_EXT_IND | 擴(kuò)展類型的拒絕請(qǐng)求 |
| 0x12 | LL_PING_REQ | 加密后的 PING 流程交互 |
| 0x13 | LL_PING_RSP | 加密后的 PING 流程交互 |
| 0x14 | LL_LENGTH_REQ | 更新空口數(shù)據(jù)長(zhǎng)度 |
| 0x15 | LL_LENGTH_RSP | 更新空口數(shù)據(jù)長(zhǎng)度 |
| 0x16 | LL_PHY_REQ | PHY 更新相關(guān)交互 |
| 0x17 | LL_PHY_RSP | PHY 更新相關(guān)交互 |
| 0x18 | LL_PHY_UPDATE_IND | PHY 更新相關(guān)交互 |
| 0x19 | LL_MIN_USED_CHANNELS_IND | Channels 相關(guān)的配置 |
| All other values | Reserved for Future | Use 預(yù)留 |
CtrData
待續(xù),先這樣吧
參考地址
抄的大佬,做的學(xué)習(xí)筆記。
轉(zhuǎn) :BLE(3)—— 空口數(shù)據(jù)包組成 :https://stephenzhou.blog.csdn.net/article/details/94676596
轉(zhuǎn):詳解BLE空口包格式—兼BLE Link layer協(xié)議解析 https://www.cnblogs.com/iini/p/8977806.html
蝸窩科技:http://www.wowotech.net/sort/bluetooth
BLE:https://blog.csdn.net/zhoutaopower/category_9083143.html
https://blog.csdn.net/freemote/article/details/120165736
總結(jié)
以上是生活随笔為你收集整理的蓝牙相关学习:4.2.BLE空口包结构 - PDU的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux系统怎么装锐捷,Linux锐捷
- 下一篇: imvu为什么显示无法连接服务器,IMV