Bluetooth HCI介绍
HCI, 主机控制接口(Host Controller Interface), 是蓝牙协议栈的重要部分, 相应的规范位于Core Version 4.1的vol 2:Part E和vol 4
HCI提供了对控制器的统一接口,用来沟通Host和Control,如下图所示
在规范中对HCI分为两个部分介绍
~1 沟通Host和Control的接口(vol 2:Part E)
~2 HCI传输层(vol 4)
1. HCI功能
HCI可分为三个部分,前两个即对应于上面的~1
~ 位于Control中的HCI Firmware
~ 位于Host的HCI Driver
~ 位于Host 和Control的HCI 传输层

HCI Firmware实现了访问蓝牙设备的HCI Commands(Baseband/Link Manager Command, status/control/event registers)
HCI Driver接收并处理HCI events(传递给High Lawyer)
HCI 传输层在HCI Firmware和HCI Driver之间进行HCI Packet的传输, Spec V4.1中定义了四种: UART/USB/Secure Digital/Three-wire UART
2. HCI Packet
HCI Packet在Host和Control之间进行传输,通常有三种类型Command,Event,Data(ACL和SCO/eSCO)
其中Data是双向的, Command只能从Host发往Control, Event始终是Control发向Host的
1. HCI Command
HCI Command包格式如下图所示

(OCF=OpCode Command Field, OGF=OpCode Group Field)
OpCode 用以区分不同的命令,OCF占用10bits(0x0000~0x03FF),OGF占用6个bits(0x00~0x3F)
Parameter_Total_length 参数的长度(以字节为单位)
Parameter 0~N 参数列表
Command分为六种类型(case OGF)
~0x01 链路控制命令(Link Control Commands)
~0x02 链路政策命令(Link Policy Commands)
~0x03 控制和基带命令(Control & Baseband Commands)
~0x04 信息命令(Informational Parameters)
~0x05 状态命令(Status Parameters)
~0x06 测试命令(Testing Commands)
~0x3F 厂商调试命令(Reserved)
tip: Host发出的大多数Command都会触发Control产生相应的Event作为响应
2. HCI Event
HCI Event包格式如下图所示
Event Code 用以区分不同的事件(0x00~0xFF)
Parameter_Total_length 参数的长度(以字节为单位)
Event Parameter 0~N 参数列表
3. HCI Data
ACL(Asynchronous Connection Less)
Handle 连接句柄(0x000~0xEFF)
Packet_Boundary_Flag 包分界标志(2bits)
Data_Total_length 数据的长度(以字节为单位)
Data 数据
SCO(Synchronous Connection Oriented)
Connection_Handle 连接句柄(0x0000~0x0EFF)
Data_Total_length 数据的长度(以字节为单位)
Data 数据
参考: <LIST of HCI cmd>
3. HCI传输层
Spec V4.1中定义了四种HCI 传输层:
UART/USB/Secure Digital/Three-wire UART
Bluetooth HCI介绍的更多相关文章
- Bluetooth GATT介绍
目录 1. 介绍 2 内容 2.1 Configured Broadcast 2.2 GATT Profile Hierarchy 3 Service Interoperability Require ...
- Android Bluetooth hci 命令分析
Android在连接BLE设备的时候,遇到连接没多久就自动断开的情况.通过HCI来分析一下. BLE设备发送连接参数更新请求 3909 15:53:01.224737 TexasIns_f0:d3:4 ...
- 蓝牙学习(3) Linux kernel部分Bluetooth HCI分析
在上文,https://blog.csdn.net/feiwatson/article/details/81712933中主要理解了在Kernel中USB adapter是如何实现USB设备驱动,以及 ...
- Bluetooth GAP介绍
目录 1 GAP协议栈 2 Profile Role 3 用户接口 4 模式 5 安全 5.1 认证(Authentication) 5.2 安全模式 6 Idle Mode Procedures 7 ...
- Bluetooth ATT介绍
目录 1 介绍 2 详细内容 2.1 Attribute Type 2.2 Attribute Handle 2.3 Attribute Handle Grouping 2.4 Attribute V ...
- Bluetooth LMP介绍
目录 1. 介绍 2. 数据包格式(Packet Format) 3. Procedure Rules 4. 通用回应消息(General Response Messages) 5. 设备特性(Dev ...
- Bluetooth Baseband介绍
目录 1. 概述 1.1 Clock(时钟) 1.2 寻址方式 2. 物理信道(Physical Channels) 3. 物理链路(Physical Links) 4. 逻辑传输层(Logical ...
- Bluetooth HFP介绍
目录 1. 介绍 1.1 目的 1.2 使用场景 1.3 依赖关系 1.4 协议栈 1.5 角色 2. 应用层 3. 空白章节 4. 互操作性要求 4.1 介绍 4.2 Service Level C ...
- Bluetooth RFCOMM介绍
目录 1. 介绍 2. 服务概述 2.1 RS-232控制信号 2.2 Null Modem Emulation 2.3 多串口仿真 3. 服务接口描述 4. RFCOMM帧类型 5. RFCOMM帧 ...
随机推荐
- Android 生成和Pull解析xml
一.单个对象生成xml 生成以下xml,该怎么生成呢? <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <accou ...
- 在VMware Workstation上安装Kali Linux
在VMware Workstation上安装Kali Linux VMware Workstation是一款功能强大的桌面虚拟计算机软件.该软件允许用户在单一的桌面上同时运行不同的操作系统,并且可以进 ...
- http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
- POJ2112 Optimal Milking(最大流)
先Floyd求牛到机器最短距离,然后二分枚举最长的边. #include<cstdio> #include<cstring> #include<queue> #in ...
- cocos3 singleton
class TestSingleton : public CCLayer { public: static TestSingleton* getInstance();//创建一个全局访问点,例如我们常 ...
- BZOJ3619 : [Zjoi2014]璀灿光华
终于把省选时的遗憾补上了… 对于构造立方体: 首先BFS构出底层,然后再逐层构造立方体 对于计算: $O(n^6)$爆搜即可. #include<cstdio> #include<c ...
- Hadoop虽然强大,但不是万能的(CSDN)
Hadoop很强大,但企业在使用Hadoop或者大数据之前,首先要明确自己的目标,再确定是否选对了工具,毕竟Hadoop不是万能的!本文中列举了几种不适合使用Hadoop的场景. 随着 Hadoop ...
- 【BZOJ】1069: [SCOI2007]最大土地面积(凸包+旋转卡壳)
http://www.lydsy.com/JudgeOnline/problem.php?id=1069 显然这四个点在凸包上,然后枚举两个点找上下最大的三角形即可. 找三角形表示只想到三分QAQ.. ...
- Shell之sed用法 转滴
通过例子学习sed的用法 1,sed介绍 sed可删除(delete).改变(change).添加(append).插入(insert).合.交换文件中的资料行,或读入其它档的资料到 文> ...
- Qt5 和 Qt4 的一些改动和不同
Qt5从Qt4升级后,很多原来Qt4中定义的函数或者变量由于种种原因在Qt5中被遗弃,所以用Qt5来编译Qt4的一些工程项目时,难以避免的会需要修改一些地方,下面就罗列一些我遇到的一些需要修改的地方: ...