dsads
1.概述
HCI支持四種類型的分組:
-
命令分組 Command Packet
-
異步數據分組 Asynchronous Data Packet
-
同步數據分組 Synchronous Data Packet
-
事件分組 Event Packe
分組類型是在HCI分組之前的一個字節值。 數據包類型具有以下值:
Packet |
Packet Type |
Command |
1 |
Asynchronous Data |
2 |
Synchronous Data |
3 |
Event |
4 |
HCI Packet Types
2.Command Packet
HCI命令包格式由三部分組成:用來確認發送命令的操作碼(2字節)、參數長度(1字節)以及命令參數。每個命令都有自己一套獨特的參數。
BLE中有三種基本命令類型,分別實現如下功能:
- 配置控制器狀態
- 請求執行特定的操作
- 管理連接
2.1 OpCode
OGF Range (6 bits): 0x00-0x3F (0x3F reserved for vendor-specific debug commands)
- 參數最多255字節,不包括HCI命令包頭。
- Opcode參數分為兩個字段,稱為OpCode組字段(OGF)和OpCode命令字段(OCF)
- 組域(OGF)(最高有效位6比特) 命令域(OCF)(最低有效位10比特)
- 0x3F的OGF保留用於特定於供應商的調試命令。
2.2 OGF
Link Control Commands: 1
Link Policy Commands: 2
Controller and Baseband Commands: 3
Informational Parameters: 4
Status Parameters: 5
Testing Commands: 6
LE Only Commands: 8
2.3 OGF 與OCF 組合
BT Commands for LE |
OGF |
OCF |
Opcode |
LE Set Event Mask |
8 |
1 |
0x2001 |
LE Read Buffer Size |
8 |
2 |
0x2002 |
LE Read Local Supported Features |
8 |
3 |
0x2003 |
LE Set Random Address |
8 |
5 |
0x2005 |
LE Set Advertising Parameters |
8 |
6 |
0x2006 |
LE Read Advertising Channel TX Power |
8 |
7 |
0x2007 |
LE Set Advertising Data |
8 |
8 |
0x2008 |
LE Set Scan Response Data |
8 |
9 |
0x2009 |
LE Set Advertise Enable |
8 |
10 |
0x200A |
LE Set Scan Parameters |
8 |
11 |
0x200B |
LE Set Scan Enable |
8 |
12 |
0x200C |
LE Create Connection |
8 |
13 |
0x200D |
LE Create Connection Cancel |
8 |
14 |
0x200E |
LE Read White List Size |
8 |
15 |
0x200F |
LE Clear White List |
8 |
16 |
0x2010 |
LE Add Device To White List |
8 |
17 |
0x2011 |
LE Remove Device From White List |
8 |
18 |
0x2012 |
LE Connection Update |
8 |
19 |
0x2013 |
LE Set Host Channel Classification |
8 |
20 |
0x2014 |
LE Read Channel Map |
8 |
21 |
0x2015 |
LE Read Remote Used Features |
8 |
22 |
0x2016 |
LE Encrypt |
8 |
23 |
0x2017 |
LE Rand |
8 |
24 |
0x2018 |
LE Start Encryption |
8 |
25 |
0x2019 |
LE Long Term Key Requested Reply |
8 |
26 |
0x201A |
LE Long Term Key Requested Negative Reply |
8 |
27 |
0x201B |
LE Read Supported States |
8 |
28 |
0x201C |
LE Receiver Test |
8 |
29 |
0x201D |
LE Transmitter Test (max TX power for CC2541 is 0 dBm) |
8 |
30 |
0x201E |
LE Test End Command |
8 |
31 |
0x201F |
LE Remote Connection Parameter Request Reply |
8 |
32 |
0x2020 |
LE Remote Connection Parameter Request Negative Reply |
8 |
33 |
0x20 |
Disconnect |
1 |
6 |
0x0406 |
Read Remote Version Information |
1 |
29 |
0x041D |
Set Event Mask |
3 |
1 |
0x0C01 |
Reset |
3 |
3 |
0x0C03 |
Read Transmit Power Level |
3 |
45 |
0x0C2D |
Set Controller To Host Flow Control (optional) |
3 |
49 |
0x0C31 |
Host Buffer Size (optional) |
3 |
51 |
0x0C33 |
Host Number Of Completed Packets (optional) |
3 |
53 |
0x0C35 |
Set Event Mask Page 2 |
3 |
63 |
0x0C63 |
Read Authenticated Payload Timeout |
4 |
123 |
0x0C7B |
Write Authenticated Payload Timeout |
4 |
124 |
0x0C7C |
Read Local Version Information |
4 |
1 |
0x1001 |
Read Local Supported Commands (optional) |
4 |
2 |
0x1002 |
Read Local Supported Features |
4 |
3 |
0x1003 |
Read BD_ADDR |
4 |
9 |
0x1009 |
Read RSSI |
5 |
5 |
0x1405 |
2.4 供應商特定的操作碼(TI)
- 供應商特定的操作碼由OGF值63 (0x3f)表示。
- 供應商可以根據需要使用剩余的10位(即OCF)。
- TI通過將10位細分為3bit MSB命令子組(CSG)和7bit LSB命令(CMD)來定義其供應商特定的OCF值。
- HCI使用CSG將命令路由到BLE堆棧內的指定子系統。
- 通過這種方式,可以為任何BLE堆棧層指定供應商特定的命令。
命令子組定義如下:
- 對於命令子組0到6,其余7位Command為每個子組提供最多128個命令。
- 對於子組7,剩余的7位指定128個配置文件中的一個,並指示后續字節將用作該特定配置文件的命令(即每個配置文件最多256個命令)。
HCI Extension Set Rx Gain |
63 |
0 |
0 |
0xFC00 |
HCI Extension Set Tx Power |
63 |
0 |
1 |
0xFC01 |
HCI Extension One Packet Per Event |
63 |
0 |
2 |
0xFC02 |
HCI Extension Clock Divide On Halt |
63 |
0 |
3 |
0xFC03 |
HCI Extension Declare NV Usage |
63 |
0 |
4 |
0xFC04 |
HCI Extension Decrypt |
63 |
0 |
5 |
0xFC05 |
HCI Extension Set Local Supported Features |
63 |
0 |
6 |
0xFC06 |
HCI Extension Set Fast Tx Response Time |
63 |
0 |
7 |
0xFC07 |
HCI Extension Modem Test Tx |
63 |
0 |
8 |
0xFC08 |
HCI Extension Modem Hop Test Tx |
63 |
0 |
9 |
0xFC09 |
HCI Extension Modem Test Rx |
63 |
0 |
10 |
0xFC0A |
HCI Extension End Modem Test |
63 |
0 |
11 |
0xFC0B |
HCI Extension Set BDADDR |
63 |
0 |
12 |
0xFC0C |
HCI Extension Set SCA |
63 |
0 |
13 |
0xFC0D |
HCI Extension Enable PTM1 |
63 |
0 |
14 |
0xFC0E |
HCI Extension Set Frequency Tuning |
63 |
0 |
15 |
0xFC0F |
HCI Extension Save Frequency Tuning |
63 |
0 |
16 |
0xFC10 |
HCI Extension Set Max DTM Tx Power |
63 |
0 |
17 |
0xFC11 |
HCI Extension Map PM IO Port |
63 |
0 |
18 |
0xFC12 |
HCI Extension Disconnect Immediate |
63 |
0 |
19 |
0xFC13 |
HCI Extension Packet Error Rate |
63 |
0 |
20 |
0xFC14 |
HCI Extension Packet Error Rate by Channel2 |
63 |
0 |
21 |
0xFC15 |
HCI Extension Extend RF Range |
63 |
0 |
22 |
0xFC16 |
HCI Extension Advertiser Event Notice2 |
63 |
0 |
23 |
0xFC17 |
HCI Extension Connection Event Notice2 |
63 |
0 |
24 |
0xFC18 |
HCI Extension Halt During RF |
63 |
0 |
25 |
0xFC19 |
HCI Extension Set Slave Latency Override |
63 |
0 |
26 |
0xFC1A |
HCI Extension Build Revision |
63 |
0 |
27 |
0xFC1B |
HCI Extension Delay Sleep |
63 |
0 |
28 |
0xFC1C |
HCI Extension Reset System |
63 |
0 |
29 |
0xFC1D |
HCI Extension Overlapped Processing |
63 |
0 |
30 |
0xFC1E |
HCI Extension Number Completed Packets Limit |
63 |
0 |
31 |
0xFC1F |
HCI Extension Get Connection Information |
63 |
0 |
32 |
0xFC20 |
L2CAP Disconnection Request |
63 |
1 |
6 |
0xFC86 |
L2CAP Connection Parameter Update Request |
63 |
1 |
18 |
0xFC92 |
L2CAP Connection Request |
63 |
1 |
20 |
0xFC94 |
L2CAP Connection Response |
63 |
1 |
21 |
0xFC95 |
L2CAP Flow Control Credit |
63 |
1 |
22 |
0xFC96 |
L2CAP Data |
63 |
1 |
112 |
0xFCF0 |
L2CAP Register PSM |
63 |
1 |
113 |
0xFCF1 |
L2CAP Deregister PSM |
63 |
1 |
114 |
0xFCF2 |
L2CAP PSM Info |
63 |
1 |
115 |
0xFCF3 |
L2CAP PSM Channels |
63 |
1 |
116 |
0xFCF4 |
L2CAP Channel Info |
63 |
1 |
117 |
0xFCF5 |
ATT Error Response |
63 |
2 |
1 |
0xFD01 |
ATT Exchange MTU Request |
63 |
2 |
2 |
0xFD02 |
ATT Exchange MTU Response |
63 |
2 |
3 |
0xFD03 |
ATT Find Information Request |
63 |
2 |
4 |
0xFD04 |
ATT Find Information Response |
63 |
2 |
5 |
0xFD05 |
ATT Find By Type Value Request |
63 |
2 |
6 |
0xFD06 |
ATT Find By Type Value Response |
63 |
2 |
7 |
0xFD07 |
ATT Read By Type Request |
63 |
2 |
8 |
0xFD08 |
ATT Read By Type Response |
63 |
2 |
9 |
0xFD09 |
ATT Read Request |
63 |
2 |
10 |
0xFD0A |
ATT Read Response |
63 |
2 |
11 |
0xFD0B |
ATT Read Blob Request |
63 |
2 |
12 |
0xFD0C |
ATT Read Blob Response |
63 |
2 |
13 |
0xFD0D |
ATT Read Multiple Request |
63 |
2 |
14 |
0xFD0E |
ATT Read Multiple Response |
63 |
2 |
15 |
0xFD0F |
ATT Read By Group Type Request |
63 |
2 |
16 |
0xFD10 |
ATT Read By Group Type Response |
63 |
2 |
17 |
0xFD11 |
ATT Write Request |
63 |
2 |
18 |
0xFD12 |
ATT Write Response |
63 |
2 |
19 |
0xFD13 |
ATT Prepare Write Request |
63 |
2 |
22 |
0xFD16 |
ATT Prepare Write Response |
63 |
2 |
23 |
0xFD17 |
ATT Execute Write Request |
63 |
2 |
24 |
0xFD18 |
ATT Execute Write Response |
63 |
2 |
25 |
0xFD19 |
ATT Handle Value Notification |
63 |
2 |
27 |
0xFD1B |
ATT Handle Value Indication |
63 |
2 |
29 |
0xFD1D |
ATT Handle Value Confirmation |
63 |
2 |
30 |
0xFD1E |
GATT Discover Characteristics By UUID |
63 |
3 |
8 |
0xFD88 |
GATT Write Long |
63 |
3 |
22 |
0xFD96 |
GAP Device Initialization |
63 |
4 |
0 |
0xFE00 |
GAP Configure Device Address |
63 |
4 |
3 |
0xFE03 |
GAP Device Discovery Request |
63 |
4 |
4 |
0xFE04 |
GAP Device Discovery Cancel |
63 |
4 |
5 |
0xFE05 |
GAP Make Discoverable |
63 |
4 |
6 |
0xFE06 |
GAP Update Advertising Data |
63 |
4 |
7 |
0xFE07 |
GAP End Discoverable |
63 |
4 |
8 |
0xFE08 |
GAP Establish Link Request |
63 |
4 |
9 |
0xFE09 |
GAP Terminate Link Request |
63 |
4 |
10 |
0xFE0A |
GAP Authenticate |
63 |
4 |
11 |
0xFE0B |
GAP Passkey Update |
63 |
4 |
12 |
0xFE0C |
GAP Slave Security Request |
63 |
4 |
13 |
0xFE0D |
GAP Signable |
63 |
4 |
14 |
0xFE0E |
GAP Bond |
63 |
4 |
15 |
0xFE0F |
GAP Terminate Auth |
63 |
4 |
16 |
0xFE10 |
GAP Update Link Parameter Request |
63 |
4 |
17 |
0xFE11 |
GAP Set Parameter |
63 |
4 |
48 |
0xFE30 |
GAP Get Parameter |
63 |
4 |
49 |
0xFE31 |
GAP Resolve Private Address |
63 |
4 |
50 |
0xFE32 |
GAP Set Advertisement Token |
63 |
4 |
51 |
0xFE33 |
GAP Remove Advertisement Token |
63 |
4 |
52 |
0xFE34 |
GAP Update Advertisement Tokens |
63 |
4 |
53 |
0xFE35 |
GAP Bond Set Parameter |
63 |
4 |
54 |
0xFE36 |
GAP Bond Get Parameter |
63 |
4 |
55 |
0xFE37 |
UTIL Reserved |
63 |
5 |
0 |
0xFE80 |
UTIL NV Read |
63 |
5 |
1 |
0xFE81 |
UTIL NV Write |
63 |
5 |
2 |
0xFE82 |
Reserved |
63 |
6 |
0 |
0xFF00 |
User Profiles |
63 |
7 |
0 |
0xFF80 |
1 Not supported by HCI; only direct function call is allowed. No event is returned.
2 Not supported by HCI; only direct function call is allowed. No event is returned.
3. Asynchronous Data Packet
- 通俗來講,上層協議的data(L2CAP,SDP,RFCOMM,AVDTP,AVCTP,HFP AT,A2DP,AVRCP,PBAP,MAP,BNEP,HID等)都是透過這個packets傳的
- 數據包是指主機和控制器之間傳輸的應用數據。
- 控制器接收來自主機的數據包,將其傳給對端設備。
- 對端設備收到數據之后,將其從控制器發往主機。
HCI數據包格式包含句柄/標記(2字節)、數據長度(1字節)以及數據。HCI數據包有兩種標記:數據包邊界標記和廣播標記。數據包邊界標記用來確認上層協議L2CAP的信息是一個開始數據包還是一個延續包。類似於鏈路層數據信道PDU中的LLID。
從主機發送到控制器的數據包,標記00標識開始包,01標識延續包;
從控制器發送到主機的數據包,標記10標識開始包,01標記延續包。
參數:
Handle:建立藍牙ACL連線后會有一個handle句柄
PB flag:一張圖就懂了
4. Synchronous Data Packet
This synchronous data packet is not used in BLE.
5. Event Packe
- HCI事件使用8位事件代碼。
- 所有事件代碼對於BT和BLE都是唯一的。
- 僅為供應商特定事件保留事件代碼255。
-
所有LE事件只有一個事件代碼。
HCI事件數據包由事件類型編碼(1字節)、參數長度(1字節)以及命令參數。每個時間都有自己一套獨特的參數。
BLE有三種基本事件類型:
- 通用命令完成事件:和無線傳輸無關的任務
- 通用命令狀態事件
- 特定命令完成事件
5.1 BLE事件及其事件代碼和適用的子事件代碼
- HCI事件使用8位事件代碼。
- 所有事件代碼對於BT和BLE都是唯一的。
- 僅供應商特定事件保留事件代碼255。
- 所有LE事件只有一個事件代碼。
- 第一個事件參數用作子事件代碼以區分LE事件類型。
下表列出了所有BLE事件及其事件代碼和適用的子事件代碼:
LE Events |
Event Code |
Subevent Code |
LE Connection Complete |
0x3E |
0x01 |
LE Advertising Report |
0x3E |
0x02 |
LE Connection Update Complete |
0x3E |
0x03 |
LE Read Remote Used Features Complete |
0x3E |
0x04 |
LE Long Term Key Requested |
0x3E |
0x05 |
LE Remote Connection Parameter Request |
0x3E |
0x06 |
BT Events |
Event Code |
Disconnection Complete |
0x05 |
Encryption Change |
0x08 |
Read Remote Version Information Complete |
0x0C |
Command Complete |
0x0E |
Command Status |
0x0F |
Hardware Error (optional) |
0x10 |
Number Of Completed Packets |
0x13 |
Data Buffer Overflow |
0x1A |
Encryption Key Refresh Complete |
0x30 |
Authenticated Payload Timeout Expired |
0x57 |
5.2 供應商特定的事件碼(TI)
- 特定於供應商的事件代碼由值255指示。
- 供應商必須使用事件參數(在長度字節之后)來指定供應商特定事件。
TI將以下兩個字節定義為事件操作碼。
選擇事件操作碼以通過將命令操作碼分成兩部分來鏡像命令操作碼:6比特事件操作碼組字段(EOGF)和10比特事件操作碼事件字段(EOEF)。
5.3 EOGF
- 事件的值不能小於0x400,因為前1024個值是保留的。 其原因與客戶端/服務器請求/響應隧道有關。
- 隧道需要在HCI事件中嵌入命令操作碼。 完成此操作后,EOGF為零,其余10位為命令操作碼。
- 為了防止命令和事件操作碼重疊,在事件操作碼空間中保留前1024個值。
- 事件代碼(EC)始終為0xFF,因為通常只有Controller事件通過HCI返回
LE Events |
0xFF |
EOGF |
ESG |
Event |
Opcode |
HCI Extension Set Rx Gain |
0xFF |
1 |
0 |
0 |
0x0400 |
HCI Extension Set Tx Power |
0xFF |
1 |
0 |
1 |
0x0401 |
HCI Extension One Packet Per Event |
0xFF |
1 |
0 |
2 |
0x0402 |
HCI Extension Clock Divide On Halt |
0xFF |
1 |
0 |
3 |
0x0403 |
HCI Extension Declare NV Usage |
0xFF |
1 |
0 |
4 |
0x0404 |
HCI Extension Decrypt |
0xFF |
1 |
0 |
5 |
0x0405 |
HCI Extension Set Local Supported Features |
0xFF |
1 |
0 |
6 |
0x0406 |
HCI Extension Set Fast Tx Response Time |
0xFF |
1 |
0 |
7 |
0x0407 |
HCI Extension Modem Test Tx |
0xFF |
1 |
0 |
8 |
0x0408 |
HCI Extension Modem Hop Test Tx |
0xFF |
1 |
0 |
9 |
0x0409 |
HCI Extension Modem Test Rx |
0xFF |
1 |
0 |
10 |
0x040A |
HCI Extension End Modem Test |
0xFF |
1 |
0 |
11 |
0x040B |
HCI Extension Set BDADDR |
0xFF |
1 |
0 |
12 |
0x040C |
HCI Extension Set SCA |
0xFF |
1 |
0 |
13 |
0x040D |
HCI Extension Enable PTM3 |
0xFF |
1 |
0 |
14 |
0x040E |
HCI Extension Set Frequency Tuning |
0xFF |
1 |
0 |
15 |
0x040F |
HCI Extension Save Frequency Tuning |
0xFF |
1 |
0 |
16 |
0x0410 |
HCI Extension Set Max DTM Tx Power |
0xFF |
1 |
0 |
17 |
0x0411 |
HCI Extension Map PM IO Port |
0xFF |
1 |
0 |
18 |
0x0412 |
HCI Extension Disconnect Immediate |
0xFF |
1 |
0 |
19 |
0x0413 |
HCI Extension Packet Error Rate |
0xFF |
1 |
0 |
20 |
0x0414 |
HCI Extension Packet Error Rate by Channel3 |
0xFF |
1 |
0 |
21 |
0x0415 |
HCI Extension Extend RF Range |
0xFF |
1 |
0 |
22 |
0x0416 |
HCI Extension Advertiser Event Notice3 |
0xFF |
1 |
0 |
23 |
0x0417 |
HCI Extension Connection Event Notice3 |
0xFF |
1 |
0 |
24 |
0x0418 |
HCI Extension Halt During RF |
0xFF |
1 |
0 |
25 |
0x0419 |
HCI Extension Set Slave Latency Override |
0xFF |
1 |
0 |
26 |
0x041A |
HCI Extension Build Revision |
0xFF |
1 |
0 |
27 |
0x041B |
HCI Extension Delay Sleep |
0xFF |
1 |
0 |
28 |
0x041C |
HCI Extension Reset System |
0xFF |
1 |
0 |
29 |
0x041D |
HCI Extension Overlapped Processing |
0xFF |
1 |
0 |
30 |
0x041E |
HCI Extension Number Completed Packets Limit |
0xFF |
1 |
0 |
31 |
0x041F |
HCI Extension Get Connection Information |
0xFF |
1 |
0 |
32 |
0x0420 |
L2CAP Command Reject |
0xFF |
1 |
1 |
1 |
0x0481 |
L2CAP Connection Parameter Update Response |
0xFF |
1 |
1 |
19 |
0x0493 |
L2CAP Connection Request |
0xFF |
1 |
1 |
20 |
0x0494 |
L2CAP Channel Established |
0xFF |
1 |
1 |
96 |
0x04E0 |
L2CAP Channel Terminated |
0xFF |
1 |
1 |
97 |
0x04E1 |
L2CAP Out Of Credit |
0xFF |
1 |
1 |
98 |
0x04E2 |
L2CAP Peer Credit Threshold |
0xFF |
1 |
1 |
99 |
0x04E3 |
L2CAP Send SDU Done |
0xFF |
1 |
1 |
100 |
0x04E4 |
L2CAP Data |
0xFF |
1 |
1 |
112 |
0x04F0 |
ATT Error Response |
0xFF |
1 |
2 |
1 |
0x0501 |
ATT Exchange MTU Request |
0xFF |
1 |
2 |
2 |
0x0502 |
ATT Exchange MTU Response |
0xFF |
1 |
2 |
3 |
0x0503 |
ATT Find Information Request |
0xFF |
1 |
2 |
4 |
0x0504 |
ATT Find Information Request |
0xFF |
1 |
2 |
5 |
0x0505 |
ATT Find By Type Value Request |
0xFF |
1 |
2 |
6 |
0x0506 |
ATT Find By Type Value Response |
0xFF |
1 |
2 |
7 |
0x0507 |
ATT Read By Type Request |
0xFF |
1 |
2 |
8 |
0x0508 |
ATT Read By Type Response |
0xFF |
1 |
2 |
9 |
0x0509 |
ATT Read Request |
0xFF |
1 |
2 |
10 |
0x050A |
ATT Read Response |
0xFF |
1 |
2 |
11 |
0x050B |
ATT Read Blob Request |
0xFF |
1 |
2 |
12 |
0x050C |
ATT Read Blob Response |
0xFF |
1 |
2 |
13 |
0x050D |
ATT Read Multiple Request |
0xFF |
1 |
2 |
14 |
0x050E |
ATT Read Multiple Response |
0xFF |
1 |
2 |
15 |
0x050F |
ATT Read By Group Type Request |
0xFF |
1 |
2 |
16 |
0x0510 |
ATT Read By Group Type Response |
0xFF |
1 |
2 |
17 |
0x0511 |
ATT Write Request |
0xFF |
1 |
2 |
18 |
0x0512 |
ATT Write Response |
0xFF |
1 |
2 |
19 |
0x0513 |
ATT Prepare Write Request |
0xFF |
1 |
2 |
22 |
0x0516 |
ATT Prepare Write Response |
0xFF |
1 |
2 |
23 |
0x0517 |
ATT Execute Write Request |
0xFF |
1 |
2 |
24 |
0x0518 |
ATT Execute Write Response |
0xFF |
1 |
2 |
25 |
0x0519 |
ATT Handle Value Notification |
0xFF |
1 |
2 |
27 |
0x051B |
ATT Handle Value Indication |
0xFF |
1 |
2 |
29 |
0x051D |
ATT Handle Value Confirmation |
0xFF |
1 |
2 |
30 |
0x051E |
GAP Device Init Done |
0xFF |
1 |
4 |
0 |
0x0600 |
GAP Device Discovery |
0xFF |
1 |
4 |
1 |
0x0601 |
GAP Advert Data Update Done |
0xFF |
1 |
4 |
2 |
0x0602 |
GAP Make Discoverable Done |
0xFF |
1 |
4 |
3 |
0x0603 |
GAP End Discoverable Done |
0xFF |
1 |
4 |
4 |
0x0604 |
GAP Link Established |
0xFF |
1 |
4 |
5 |
0x0605 |
GAP Link Terminated |
0xFF |
1 |
4 |
6 |
0x0606 |
GAP Link Parameter Update |
0xFF |
1 |
4 |
7 |
0x0607 |
GAP Random Address Changed |
0xFF |
1 |
4 |
8 |
0x0608 |
GAP Signature Updated |
0xFF |
1 |
4 |
9 |
0x0609 |
GAP Authentication Complete |
0xFF |
1 |
4 |
10 |
0x060A |
GAP Passkey Needed |
0xFF |
1 |
4 |
11 |
0x060B |
GAP Slave Requested Security |
0xFF |
1 |
4 |
12 |
0x060C |
GAP Device Information |
0xFF |
1 |
4 |
13 |
0x060D |
GAP Bond Complete |
0xFF |
1 |
4 |
14 |
0x060E |
GAP Pairing Requested |
0xFF |
1 |
4 |
15 |
0x060F |
Command Status |
0xFF |
1 |
4 |
127 |
0x067F |
- 您會注意到Profiles有兩個EOGF值。
- 目前,沒有足夠的配置文件定義到此處進行記錄。
- 這些值的定義不僅需要大量的配置文件及其命令,還需要在嵌入HCI命令或事件時需要命令行進的方向。
- 您可以看到ATT沒有此問題,因為已經使用命令的偶數值和事件的奇數值定義了這些命令,因此方向是可區分的。
- 對於配置文件,尚不知道如何定義命令和事件。
6.命令流控
- HCI接口有兩種流控形式:命令流控和數據流控。
- 控制器使用命令流控同時處理多個HCI命令。因為控制器內部擁有足夠的緩存,能夠存儲一定數量的命令;
- 主機可以通過控制器來獲知緩沖區的長度,從而得知可以同時發送的命令的最大數量。
- HCI接口不支持事件流控,因為事件的數量受限於可處理命令的數量,另外主機比控制器擁有更多的資源,能夠順序地緩沖和處理這些事件。
7. 數據流控
- 一共有兩種數據流:主機到控制器以及控制器到主機。
- 主機到控制器的數據流控是必須的,而控制器到主機的數據流控可以忽略。
- 對於主機到控制器的數據流控,控制器擁有一定數量的緩沖區,每個緩沖區存放一個數據包。
- 每次控制器都從一個緩沖區提取數據包來發送給對端設備,一旦數據包發送成功,控制器釋放該緩沖區,一邊裝填主機發送給控制器的新數據包。
8. 控制器配置
8.1 重置控制器為已知狀態
- 由於控制器可能正在執行其他操作,或者主機傳輸才剛剛建立。在這種情況下,可以把控制器重置為就緒態,這樣會把所有可配置參數恢復為默認值。
- 主機通過重置Reset命令來重置控制器。控制器一旦重置,將向主機返回命令完成Command Complete事件。
- 重置命令不會重置物理鏈路,如果要重置物理鏈路,需要執行另外的鏈路重置操作。
- 雖然主機可以發送多條命令給控制器,如果控制器正在執行重置,也不能接受其他命令。
- 重置命令可以搶占其他命令的執行。
8.2 讀取設備地址
- 主機通過向控制器發送Read BD_ADDR命令來讀取設備地址。
- 后者返回一個含有固定設備地址的Command Complete事件。
- 如果控制器沒有固定地址,則返回全零地址00:00:00:00:00:00。此時,主機需要為控制器生成一個隨機地址,否則無法進行數據傳輸。
8.3 設置事件掩碼
- 通過設置事件掩碼,主機告訴控制器哪些事件能被接收,哪些不能接收。這樣控制器只會發那些能被接收的事件。
- Set Event Mask命令曾用於經典藍牙設置各類事件,由於其中的"meta-event"事件仍然適用於低功耗藍牙,主機可以使用該命令來啟動或屏蔽meta-event。
- 另外LE Set Event Mask命令用來啟動或屏蔽相關的低功耗藍牙事件。
8.4 讀取緩沖區大小
LE Read Buffer Size
Read Buffer Size
8.5 讀取控制器支持的功能
- 確保主機和控制器兼容的另一個辦法是,主機向控制器發送命令之前首先確認控制器支持的功能。
- 主機通過發送LE Read Supported Features 命令來獲得控制器所支持的功能列表。
- 在控制器返回的Command Complete 實踐中包含了此功能列表。
- 一般來說,主機在發送和功能有關的命令之前,應該首先發送LE Read Supported Features命令。
8.6 讀取控制器支持的狀態
- 控制器的設計可以非常簡單,也可以非常復雜。主機必須知道控制器支持哪些狀態及其組合,以免因設置了無效的狀態而導致錯誤。
- 主機發送LE Read Supported States命令后,控制器返回帶有支持的狀態列表的Command Complete事件。
控制器可以支持如下的狀態:
- 不可連接廣播
- 可掃描廣播
- 可連接廣播
- 定向廣播
- 被動掃描
- 主動掃描
- 發起連接成為主設備
- 連接成為從設備
另外,還可以通過讀取一些標志位來了解控制器支持哪些組合狀態,例如:
- 同時處於不可連接廣播狀態和被動掃描狀態
- 同時處於不可連接廣播狀態和連接成為從設備狀態
利用這些狀態支持信息,主機可以知道控制器能否成功執行廣播、掃描或發起連接等命令。
8.7 隨機數
- 控制器可以方便產生隨機數,這些隨機數通常源於設備自身的物理特性。
- 主機發送LE Rand命令來讓控制器為其生成隨機數。隨機數包含在返回的Command Complete事件中。
8.8 加密數據
- 主機可以使用BLE的AES-128加密引擎來加密數據。
- 主機發送LE Encrypt命令來進行數據加密。此命令中包含了需要加密的數據和加密密鑰。
- 控制器使用AES-128加密算法進行加密,並在返回的Command Complete事件中包含已加密數據。
- 在BLE中沒有解密命令,主機只能檢查相同的明文在變成密文后是否一致,但不能使用密鑰將密文恢復為明文。
8.9 設置隨機地址
- 如果控制器沒有固定地址,或者主機希望使用私有地址來替代固定地址,那么主機必須為控制器設置一個隨機地址,以便用於廣播、主動掃描和發起連接等操作。
- 主機首先使用LE Rand命令來生成一個隨機數。
- 接下來,此隨機數和IRK(Identity Resolving Key,身份解析密鑰)分別作為明文和加密密鑰執行LE Encrypt命令。
- 主機獲得了返回值后將其作為隨機地址,使用LE Set Random Address命令對控制器進行設置。
- 在收到了地址設置的Command Complete事件之后,該隨機地址才能用於其他命令。
8.10 白名單
- 控制器里面存儲着一個設備地址列表,稱為白名單。
- 白名單在充滿廣播報文的密集環境中可用來搜索已知設備。
- 不過由於白名單的容量有限,在使用之前首先要確定其容量的大小。
- 主機可以通過命令對白名單進行添加、刪除以及重置等操作.
- 控制器可以根據白名單來過濾廣播數據包。
- 主機使用LE Read White List Size命令來讀取白名單的容量大小
- 控制器在返回的Command Complete 事件中包含了最多能容納的條目數量。
- 在管理白名單方面,可以用LE Clear White List命令來清空列表,
- 要從列表中添加和刪除條目則應該使用LE Add Device To White List命令和LE Remove Device From White List命令。
- 當控制器正在使用白名單的時候不能改變其列表內容。
9.廣播和觀察
兩個BLE設備之間最基本的通信模型就是廣播(broadcasting)和觀察(observing)模型。兩者通過廣播和掃描來傳輸數據。
9.1 廣播
控制器有兩類數據可以通過廣播發送:廣播數據和掃描響應數據。另外,控制器還有一系列的參數,用來設置如何發送以及何時發送廣播報文。
主機使用LE Set Advertising Parameters 命令來設置廣播參數。配置參數包括廣播的最小間隔時間和最大間隔時間,范圍從20ms~10.24s。另外,廣播類型一共有四種,分別是:
- 可連接的非定向廣播:這是一種常用的廣播類型,包括廣播數據和掃描響應數據,它表示當前設備可以接受其他任何設備的連接請求;
- 可連接的定向廣播:表示設備僅僅能接收某一特定設備的連接請求,不過不包括廣播數據;
- 可掃描的非定向廣播:發送廣播數據和掃描響應數據,用來激活掃描者;
- 不可連接的非定向廣播:僅僅發送廣播數據。
LE Set Advertising Parameters命令還可以用來設置地址類型,或者為固定設備地址,或者為隨機地址。如果當前的廣播類型為定向廣播,那么在廣播數據包中應含有對端設備的地址。另外,還有兩個參數可以配置,分別是廣播信道映射和廣播過濾策略。廣播信道映射用來決定使用哪三個廣播信道,而過濾策略則用來過濾不符合規則的廣播數據包,過濾策略可以設置為如下規則之一:
- 接受任何設備的掃描請求和連接請求
- 僅僅接受白名單中特定設備的掃描請求,但接受任何設備的連接請求
- 僅僅接收白名單中特定設備的連接請求,但接受任何設備的掃描請求
- 僅僅接受白名單中特定設備的連接請求和掃描請求。
如果想獲得廣播時的發射功率,那么可以使用LE Read Advertising Channel TX Power 命令。另外,還將發射功率的值放在廣播數據包中或者掃描響應數據包中,從而實現靠近配對,或者供用戶界面根據路徑損耗對設備進行排序。
要設置廣播數據包和掃描響應數據包的內容,主機分別使用LE Set Advertising Data 命令和LE Set Scan Response Data命令實現。
當一切配置就緒,可以使用LE Set Advertising Enabled 來啟動或關閉廣播。廣播一旦啟動,控制器將使用配置好的參數進行廣播。
9.2 被動掃描
使用LE Set Scan Parameters命令來進行設置控制器的掃描參數,可配置的參數如下:
- 掃描類型——可設置為被動掃描或主動掃描
- 掃描間隔——控制器間隔多長時間掃描一次
- 掃描窗口——每一次掃描的持續時間
- 掃描策略——接受任何的廣播數據包或者僅僅接受白名單設備的廣播數據包。
如果定向廣播數據包中的目的地址並非自己,及時廣播數據包的發送者在自己的白名單中也要將給數據包拋棄。
一旦掃描參數設置完畢,主機就可以啟用LE Set Scan Enabled 命令啟動掃描。掃描過程中,如果控制器接收到的符合過濾策略和其他規則的廣播數據包,則發送一個LE Advertising Report 事件給主機。除了廣播者的設備地址外,廣播報告事件還包含了廣播數據包中的數據,以及接收廣播數據包時的信號接收強度。可以利用該信號強度以及位於廣播數據包中的發射功率,共同確定信號的路徑損失,從而給出大致的范圍。
主機如果想停止掃描,還是使用LE Set Scan Enable 命令,只是參數應設置為"停止掃描"。
9.3 主動掃描
主動掃描不僅可以捕獲到對端設備的廣播數據包,還可以捕獲可能的掃描響應包。
在參數配置和啟動掃描方面,主動掃描和被動掃描使用的命令完全一樣。不過,因為控制器要發送SCAN_REQ數據包給對端設備,以便獲取掃描響應數據包,而這些數據包需要包含發送地址,因此在使用LE Set Scan Parameters命令時需要配置一個額外參數,決定鏈路層的數據包適用固定地址亦或是隨機地址。HCI主動掃描過程如下所示:
控制器收到SCAN_RSP數據包后向主機發送一個LE Advertising Report事件。該事件同樣包括了鏈路層數據包的廣播類型。因此主機能夠判斷對端設備是否可以連接或掃描,從而區分出廣播數據包和掃描響應數據包。
10.發起連接
廣播和掃描僅僅是藍牙功能的一部分,要實現更多的應用功能必須依靠兩個設備之間的連接。要建立連接,其中一個藍牙設備應該處於可連接的廣播狀態,由另一個設備發起連接。當然,連接的對象既可以是一個白名單,也可以是指定的單一設備。建立連接需要耗費一定的時間,如果用戶或者應用程序不再需要連接時,可以在連接未建立之前取消。
10.1 與白名單設備發起連接
最常用的連接方式是主機先將對端設備添加到白名單中,然后再與白名單中的設備進行連接。通過這種方式,控制器可以同一時間與多個設備發起連接。實際上,這能讓主機請求控制器同時與A、B、C、D、E、F等設備發起連接。HCI與白名單中的設備發起連接的過程如下:
要與一個或多個設備發起連接,白名單必須包含這些設備。主機使用LE Add Device To White List以及其他白名單管理命令實現該功能。一旦主機打算與白名單中的設備連接,則向控制器發送LE Create Connection命令。
LE Create Connection命令可配置如下參數:
- 掃描間隔和掃描窗口——與主動掃描參數共同決定控制器偵聽廣播的頻率
- 發起者過濾策略——可設置為"使用白名單",表示僅與白名單中的設備發起連接
- 發起者地址類型——該參數設置CONNECT_REQ數據包的地址類型是固定地址抑或是隨機地址
- 發起連接參數——該參數用於設置主設備傳輸數據給從設備的頻率、從設備可以忽略主設備的等待時間、監控超時以及每個連接中發往從設備或來自從設備的預期的數據傳輸質量
發起連接參數對白名單的所有設備是完全相同的。如果控制器收到白名單中某一設備的可連接廣播數據包,則向對端設備發送CONNECT_REQ數據包,其中含有所有連接所需的信息。另外,控制器還向主機發送LE Connection Complete事件。如果對端設備接收到 CONNECT_REQ數據包,它也會向主機發送LE Connection Complete事件。
該LE Connection Complete事件包含連接句柄,用於標記主機和控制器之間傳輸的數據包。該事件還包含當前控制器的角色信息(主從設備),以及從設備的地址、間隔時間、等待時間、監控超時和主設備的時鍾精度等。從設備需要利用時鍾精度來決定其窗口擴展,而該參數提供給主機當做信息參考之用。
當連接已經建立並且發送了LE Connection Complete事件,所有的廣播或者其他的發起連接請求都將自動停止,如果主機想繼續廣播或與其他設備進行連接,則必須再次執行響應的命令。
10.2 與單一設備發起連接
與單一設備進行連接,主機同樣使用LE Create Connection命令。區別在於,發起者的過濾策略將設置為"忽略白名單",另外還需要設置對端設備的地址等相關參數。
10.3 取消連接請求
連接請求的接收方長時間沒有響應,此時主機可以取消此連接請求,轉而執行其他任務。取消連接請求過程如下所示:
這里可能會出現競態條件,當發送LE Create Connection Cancel命令同時,可能連接尚未完成。但在返回命令完成的過程中,連接完成。這是返回的可能是連接完成的回復,也可能是連接建立取消的回復。
11. 連接管理
11.1 更新連接
主設備使用LE Connection Update命令修改連接參數。連接參數包括新的連接間隔時間、等待時間、監控超時以及連接事件長度。控制器收到命令之后先返回Command Status事件,隨后才發送鏈路更新請求數據包給對端設備(LL中的10.1)。瞬時時刻到來時,從設備更新連接參數,隨后控制器返回LE Connection Update Complete事件表示連接參數已經更新。
11.2 更新信道映射圖
BLE不能直接向對端設備發送請求以設置鏈路層信道圖。但主機可以使用LE Set Host Channel Classification命令來達到相同的目的。主機無法知道某個信道好不好,但控制器可以通過檢測信道中數據包的錯誤率來判斷哪些未知信道不好。
LE Set Host Channel Classification命令將返回Command Complete事件。控制器可以在任何時候啟動鏈路層控制規程修改信道映射圖。另外,主機也可以使用LE Read Channel Map命令獲得當前信道映射圖,該命令的返回時間包含了每個鏈路層數據信道的使用情況。
11.3 交換功能列表
當再次執行LE Read Remote Version Information命令時,雖然仍然返回相同的事件,但控制器並不會執行相關的鏈路層規程。這是因為版本信息會被當做一種靜態信息緩存在控制器中。
11.5 加密連接
之后補充
11.6 重啟連接
之后補充
11.7 終止連接
如果不再需要發送數據,或者維持連接比斷開后重連需要更多的能量時,主機可以終止連接。
主機向鏈路層發送Disconnect命令終止連接,隨后鏈路層返回Command Status事件並嘗試終止連接。如果連接成功終止,控制器將返回Disconnect Complete事件。
當發生監控超時或者MIC失效導致連接中斷,主機也會受到Disconnect Complete事件。
