13.BLE---HCI
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事件。