• BLE 5协议栈-主机控制接口(HCI)


     文章参考自:http://www.sunyouqun.com/2017/04/page/3/ 、https://www.cnblogs.com/yuqilihualuo/p/9790164.html

    BLE协议栈规定物理层、链路层和DTM层属于控制器,其他协议层属于主机,主机与控制器之间的通信是通过主机控制器接口传输层完成的。

    主机控制器接口常简称为HCI(Host Controller Interface)。

    HCI定义了一套“命令-事件”机制,主机向控制器发送HCI命令,控制器向主机返回命令执行结果。应用层的所有操作都会转换成HCI命令传给控制器。

    1. HCI通信

    HCI接口物理形式可以是串口、SPI、USB和三线串口。

    对于串口HCI,其通信模型如下:

    HCI_UART_Interface

    左侧蓝牙主机向右侧蓝牙控制器发送命令,控制器返回命令执行状态。当收到对端设备发送的消息,控制器会以事件形式发送给主机。

    HCI支持四种类型的包:

    • 命令包Command Packet
    • ACL数据包HCI ACL Data Packet
    • 同步数据包HCI Synchronous Data Packet
    • 事件包Event Packe

    包类型是在HCI分组之前的一个字节值。 数据包类型具有以下值:

                               

    Command

    1

    Asynchronous Data

    2

    Synchronous Data

    3

    Event

    4

    2. comamnd packet

    HCI命令包格式由三部分组成:用来确认发送命令的操作码(2字节)、参数长度(1字节)以及命令参数。每个命令都有自己一套独特的参数。

    BLE中有三种基本命令类型,分别实现如下功能:

    • 配置控制器状态
    • 请求执行特定的操作
    • 管理连接

    HCI_Command_Packet_Format

    2.1 OpCode

    OpCode参数分为两个字段,称为OpCode组域段(OGF,高6bit)和OpCode命令域段(OCF,低10bit),0x3F的OGF保留用于特定于供应商的调试命令

    参数最多255字节,不包括HCI命令包头

    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堆栈层指定供应商特定的命令。
    CSG Subgroup
    0 HCI
    1 L2CAP
    2 ATT
    3 GATT
    4 GAP
    5 UTIL
    6 Reserved
    7 User Profile
    • 对于命令子组0到6,其余7位Command为每个子组提供最多128个命令。
    • 对于子组7,剩余的7位指定128个配置文件中的一个,并指示后续字节将用作该特定配置文件的命令(即每个配置文件最多256个命令)。

    3. HCI ACL 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标记延续包。

    HCI_Data_Packet_Format

    • Handle:连接句柄。
    • FB Flag:数据边界标志(Packet Boundary Flag),表示当前数据包是一个完整数据包的开头片段或中间片段。
    • BC Flag:播报标志(Broadcast Flag),不用于BLE。
    • Data Total Length:数据总长度。
    • Data:有效数据。

    4. HCI Synchronous Data Packet

    通俗来讲,比较多的在HFP,HSP通话中传送这个data format
    data format如图所示:
     
    参数:
    Connection_Handle:LMP建立SCO link的时候的句柄
    Packet_Status_Flag (in packets sentby the Controller):
    Data_Total_Length:后续参数的长度

    5. Event Packe

    • HCI事件使用8位事件代码。
    • 所有事件代码对于BT和BLE都是唯一的。
    • 仅为供应商特定事件保留事件代码255。
    • 所有LE事件只有一个事件代码。

    HCI事件数据包由事件类型编码(1字节)、参数长度(1字节)以及命令参数。每个事件都有自己一套独特的参数。

    BLE有三种基本事件类型:

    • 通用命令完成事件(和无线传输无关的任务)
    • 通用命令状态事件
    • 特定命令完成事件

    HCI_Event_Packet_Format

    5.1 BLE事件及其事件代码和适用的子事件代码

    • HCI事件使用8位事件代码。
    • 所有事件代码对于BT和BLE都是唯一的。
    • 仅供应商特定事件保留事件代码255。
    • 所有LE事件只有一个事件代码。
    • 第一个事件参数用作子事件代码以区分LE事件类型。

    HCI事件包不强制要求流程控制,因为通常主机总是具有充足资源来处理控制器返回的事件。

    当连接断开时,主机默认所有命令都已经执行完毕,将不再接收任何事件。

    控制器收到不同的主机命令,可能返回以下类型事件:

    • 执行完毕事件
    • 状态信息事件

    对于不涉及连接的命令,可以立即得到执行结果,执行完毕事件报告该命令执行成功或失败。

    对于涉及连接的命令,无法立即得到执行结果,命令执行完毕后,先返回执行完毕事件,等命令最终结果产生,再返回新的执行完毕事件。比如LE Create Connection Command命令,执行命令时先返回执行完毕,表面链路层开始执行或加入执行队列,待两端设备建立连接,将返回连接完成事件。

    部分读命令,比如LE Read Advertising Channel Tx Power Command,执行完毕后将读取结果存放在状态信息事件中返回。

    HCI事件包括BLE专有事件和通用事件,通用事件适用于经典蓝牙和BLE。BLE专有事件称为“元事件(LE Meta Event)”,共有20个,它们的事件代码均为0x3E,事件参数的第一个字节为Subevent_code,用以区分不同的元事件。如下:

    事件Event CodeSubevent_Code描述
    LE Connection Complete Event 0x3E 0x01 建立连接完毕
    LE Advertising Report Event 0x3E 0x02 检测到广播数据或收到扫描响应数据
    LE Connection Update Complete Event 0x3E 0x03 连接参数更新完毕
    LE Read Remote Features Complete Event 0x3E 0x04 读取对端设备功能完毕
    LE Long Term Key Request Event 0x3E 0x05 控制器向主机发送LTK以加密链接
    LE Remote Connection Parameter Request Event 0x3E 0x06 对端设备发起更新连接参数请求
    LE Data Length Change Event 0x3E 0x07 控制器通知主机链路层数据长度发生了更新
    LE Read Local P-256 Public Key Complete Event 0x3E 0x08 控制器通知主机P-256密钥生成完毕
    LE Generate DHKey Complete Event 0x3E 0x09 控制器通知主机椭圆加密算法密钥生成完毕
    LE Enhanced Connection Complete Event 0x3E 0x0A 建立连接完毕(还支持扩展连接)
    LE Directed Advertising Report Event 0x3E 0x0B 检测到定向广播数据或扫描响应数据
    LE PHY Update Complete Event 0x3E 0x0C 物理层更新完毕
    LE Extended Advertising Report Event 0x3E 0x0D 检测到扩展广播数据或扫描响应数据
    LE Periodic Advertising Sync Established Event 0x3E 0x0E 建立周期广播同步完毕
    LE Periodic Advertising Report Event 0x3E 0x0F 检测到周期广播数据或扫描响应数据
    LE Periodic Advertising Sync Lost Event 0x3E 0x10 周期广播数据无法同步
    LE Scan Timeout Event 0x3E 0x11 扫描超时
    LE Advertising Set Terminated Event 0x3E 0x12 终止广播数据集事件
    LE Scan Request Received Event 0x3E 0x13 收到扫描请求
    LE Channel Selection Algorithm Event 0x3E 0x14 使用了信道选择算法

          

    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指示。
    • 供应商必须使用事件参数(在长度字节之后)来指定供应商特定事件。

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

  • 相关阅读:
    动态调用WCF服务
    矩阵的坐标变换(转)
    【.NET线程--进阶(一)】--线程方法详解
    [转] Location语法规则
    [转] 深入理解vue 一些底层原理
    [转] lodash常用方法
    [转] Vue 组件间通信六种方式(完整版)
    [转] vuejs组件通信精髓归纳
    [转] 浅谈移动端设备标识码:DeviceID、IMEI、IDFA、UDID和UUID
    [转] vue自定义组件中的v-model简单解释
  • 原文地址:https://www.cnblogs.com/yeshenmeng/p/10819036.html
Copyright © 2020-2023  润新知