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事件。

当发生监控超时或者MIC失效导致连接中断,主机也会受到Disconnect Complete事件。

                     

                     

           

               

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

              

原文地址:https://www.cnblogs.com/yuqilihualuo/p/9790164.html