0. Overview
HCI主要完成两个任务:
- 发送命令给控制器 和 接收来自控制器的事件;
- 发送和接收来自对端设备的数据;
上面的两个任务可以进一步的解读为:
- 主机通过向控制器发送命令数据包来执行命令;
- 控制器发往主机的事件数据包主要用于发送信息和反馈之前输入的命令。
- 数据包指主机和控制器之间传输的应用数据。控制器接受来自主机的数据包,将其发给对端设备;对端设备收到数据包后,将其从控制器发送到主机。
其中,物理接口定义了这些数据包在主机和控制器之间是如何传输的;逻辑接口定义了命令,事件和数据的封包格式。
1. 物理接口
2. 逻辑接口
(1)HCI信道
一旦控制器与其他设备建立了连接,控制器的底层HCI接口就创建了一个HCI信道,我们使用一个连接句柄来标识这个HCI信道。连接句柄即用来标示主机交给控制器并准备发送给对端设备的数据,又用来标示控制器从对端设备收到的准备发送给主机的数据。
(2)命令数据包
主机通过向控制器发送命令数据包来执行命令;
BLE中,有三种基本类型的命令,分别实现如下功能:
- 配置控制器状态:如改变控制器的状态机(广播,扫描,待机,发起,连接等);
- 请求执行特定的操作:如要求控制器对文本加密;
- 管理连接:如获取当前连接的自适应跳频图。这列命令包含连接句柄。
(3)事件数据包
控制器发往主机的事件数据包主要用于发送信息和反馈之前输入的命令。
BLE主要有下列三种基本事件类型:
- 通用命令完成事件
当主机发送给控制器的命令执行完毕时,控制器立即返回一个通用命令完成事件。 - 通用命令状态事件
- 特定命令完成事件
一般LE Create Connection 这种用到无线传输操作的命令时,返回的是这两个事件类型。例如,LE Create Connection命令首先返回一个命令状态事件,随后等待连接事件的建立完成或者失败,在返回特定命令完成事件(如LE Connection Complete事件)。但是,命令是否执行完毕并不以收到了特定命令完成事件作为标志。
(4)数据包
数据包指主机和控制器之间传输的应用数据。控制器接受来自主机的数据包,将其发给对端设备;对端设备收到数据包后,将其从控制器发送到主机。
(5)流控
HCI层支持 命令流控 和 数据流控 两种方式,但没有 事件流控。
- 命令流控:控制器利用命令流控同时处理多个HCI命令。要是有它需要设置一些参数,如缓存的命令个数呀等等。
- 数据流控
两种:主机到控制器的数据流控 和 控制器到主机的流控;其中,控制器到主机的流控可以忽略,因为大部分的主机都可以接受从控制器发来的大量数据流,因此不必要特意设置。
3. 控制器配置
利用控制器与对端设备通信之前,主机可以先对控制器进行下列相关操作:重置控制器的状态,读取设备地址(BD_ADDR),设置事件掩码,读取控制器支持的功能列表,生成随机数,加密数据,设置随机地址以及配置白名单等。
其实就是主机发送相关命令数据包给控制器,控制器执行完毕返回事件数据包。
4. 广播和观察
主机 通过 发送与广播有关的命令数据包来配置控制器的广播参数,如LE Set Advertising Parameters命令,可以配置广播的最小间隔,最大间隔时间,设置地址类型;还可以通过其他命令获得广播的发射功率,设置广播数据包和扫描相应数据包的内容。
5. 发起连接
连接的对象可以是白名单,可以是指定的单一设备。在连接建立之前还可以取消连接。下面三张图解释这些过程。
6. 连接管理
连接建立之后,设备就可以对连接进行管理了,包括切换至低功耗模式,增加或减小间隔时间,设置加密或者终止连接等;
不多说,自己脑补。