一、HCI介绍
很多人接触蓝牙,是从HCI开始,因为HCI是主机控制接口协议(Host Controller Interface),蓝牙命令通过HCI来发送到Controller;
如下图,HCI通过物理接口(USB、UART等)或虚拟接口,传递数据到Controller,Controller也通过同样的接口发送接收数据,这里注意到HCI层是在L2CAP层之下,LMP层之上;
HCI的主要作用就是透传,它不依赖于传输技术;
二、HCI协议格式
1、概述
HCI包含非常多的命令,它们完成时间是不确定的;所以大部分的HCI命令在命令完成后都会生成一个命令完成事件,命令发送端会开启一个定时器,若超时会上报错误;
所有HCI数据包均采用小端模式;
The Host Controller Transport Layer为HCI提供传输机制,使HCi可以传输HCI command,ACL data和同步数据,也可以接收事件,ACL data和同步数据;
2、句柄
HCI分为三种句柄,分别为Connection Handles, Logical Link Handles,and Physical Link Handles;
3、HCI数据包格式
这里只是以UART为例说明,其他类似
4、HCI packet type
5、HCI Command Packet
如下图所示
a、HCI command packet用于从host发送命令道contrlloer;
b、去掉包头可以包含255字节数据;
c、OpCode用来区别不同命令,它由两部分组成,OCF(10bits)和OGF(6bits),OpCode可以和下面的命令介绍联系起来;
6、HCI ACL Data Packets
如下图所示:
a、HCI ACL Data Packets用于host与contrller交换信息;
b、分为两种数据包,自动刷新包和非自动刷新包;
c、不同的数据包需要不同的handle类型,具体见下图说明;
d、关于PB Flag(the Packet_Boundary_Flag,bit4&bit5)和BC Flag(Broadcast_Flag,bit6&bit7),详细说明见下图;
7、HCI Synchronous Data Packets
数据格式如下图所示:
a、HCI同步数据包用来在host和contrller之间交换同步数据(SCO & eSCO);
8、HCI Event Packet
数据包格式如下图所示:
a、HCI事件包是Controller用来通知Host事件,出去包头最大可以为255字节;
三、HCI命令列表
下面只是命令列表(部分),具体请查看spec;
四、HCI FLOW CONTROL
我们来看下HCI的流控制;
HCI流控制是数据流,避免数据溢出;
有两种流控制类型:'packet-based' flow control 和'data-block-based' flow control;
五、实例
上面看了这么多协议,我们看一个实际的HCI包,这里以inquiry过程为例说明;
1、inquiry流程
参照http://blog.csdn.net/u010657219/article/details/42192481
坤之前给我的设备可以显示HCI数据包;