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

                     

                     

           

               

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

                     

              


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM