zoukankan      html  css  js  c++  java
  • 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事件。

                         

                         

               

                   

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                         

                  

  • 相关阅读:
    如何通过logcat查看系统程序的意图
    jmeter测试本地myeclips调试状态下的tomcat程序死锁
    利用开源项目使discus论坛与java应用同步登录和注册
    hibernate映射文件基础
    长沙理工大学校园网客户端无法卸载解决办法
    26个Jquery使用小技巧
    eclipse 书签
    Notepad++ 书签
    【转】不提拔你,就因为你只想把工作做好
    自己开发开源jquery插件--给jquery.treeview加上checkbox
  • 原文地址:https://www.cnblogs.com/yuqilihualuo/p/9790164.html
Copyright © 2011-2022 走看看