本文主要是介绍蓝牙HCI协议,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
HCI 层位于蓝牙高层协议和低层协议之间,提供了对基带控制器和链路管理器的命令以及访问蓝牙硬件的统一接口,它是我们实现自己的蓝牙设备要接触的第一个蓝牙协议,起着承上启下的作用。
HCI通过包的方式来传送数据、命令和事件的,所有在主机和主机控制器之间的通信都以包的形式进行。包括每个命令的返回参数都通过特定的事件包来传输。HCI有数据、命令和事件三种包,其中数据包是双向的,命令包只能从主机发往主机控制器,而事件包始终是主机控制器发向主机的。主机发出的大多数命令包都会触发主机控制器产生相应的事件包作为响应。
HCI 传输层
《core4.0》V4-2017 传输层协议
目前,HCI 的传输层主要有三种:USB,UART,三线串口、SD接口。
不同传输层对HCI 事件处理没有影响。
(1)USB 传输层在蓝牙硬件上使用USB 硬件接口(该硬件接口有两种嵌入方式:一种是作为USB 加/ 解密芯片,另一种是集成到PC 机主板上)[6]。这一种类编码要求不管使用哪一厂商生产的设备,都能加载 合适的驱动程序栈;同时它还保证了通过控制终端的HCI 指令和USB 指令有所区别。其缺点是软件协议复 杂,软件开销巨大。
不同的事件分组通过不同的接口和端点进行区分。
(2)UART 传输层跟RS-232 传输层类似,也是采用一个UART 的串行通信方式在主控制器与主机之间 进行数据传输。应用环境主要是针对主控制器和主机位于同一个电路板上,传输层假定UART 通信无线性错误。UART传输层方式比较灵活,其应用环境决定其连接错误相对较少,可以采用简单的复位恢复机制实现失步时的复步。由于主机和主控制器都处于同一块电路板上,因而传输层不需要规定电气信号,可以直接采用TTL、LV-CMOS 等IC端电压,应用较多。UART 传输层避开了RS-232 传输层要求的较繁琐的协商和同步机制。UART性能和数据吞吐率水平与USB接口相当,而传输协议却较为简单, 减少了软件开销,是一种更为经济高效的全硬件解决方案。
同RS232一样,HCI不提供区分四种HCI包类型的能力。因此,如果经由公共物理接口(HCI)发送HCI分组必须根据下面的表添加分组指示符。
HCI packet type | HCI packet indicator |
---|---|
HCI Command Packet | 0x01 |
HCI ACL Data Packet | 0x02 |
HCI Synchronous Data Packet | 0x03 |
HCI Event Packet | 0x04 |
所有四种HCI分组具有长度字段,其用于确定对于HCI分组预期多少字节。当已经接收到整个HCI分组时,期望下一个HCI分组指示符用于下一个HCI分组。
RTS / CTS流控制用于防止临时UART缓冲区溢出。
它不应该用于HCI的流量控制,因为HCI有自己的HCI命令、事件和数据的流量控制机制。
如果CTS为1,则允许主机/主机控制器发送。
如果CTS为0,则不允许主机/主机控制器发送
如果主机或主机控制器在通信中失去同步则需要复位。丢失同步标志是已检测到不正确的HCI包指示符,或者检测到的长度字段超出HCI数据包超出范围。
在主机到主机控制器方向同步丢失后,主机控制器将发送一个硬件错误事件(HardwareErrorEvent)来告诉主机。然后主机控制器将等待主机发送(HCI_Reset_Command)以便执行复位。
如果在主机控制器到主机方向发生同步丢失,则主机必须发送HCI_Reset 命令才能复位主机控制器。主机通过检查HCI复位命令的命令完成事件来重新同步。
HCI分组格式
- 指令分组(Command Packer)
Host -> Slave, - 事件分组(Event Packet)
Slave -> Host,响应主机命令的事件 - 数据分组(Data Packet)
Host <–> Slave,异步无连接(ACL),同步面向连接(SCO)数据分组
分组参数原则
《core4.0》V2-E5.2-671
- 除非另有说明,否则所有值均为二进制和十六进制小端格式
- 负值为2进制的补码
- 数组参数使用以下符号指定:ParameterA [i]。如果指定了多于一组的数组参数(例如ParameterA[i],ParameterB [i]),则参数的顺序如下:ParameterA [0],ParameterB [0],ParameterA [1],ParameterB [ 1],ParameterA [2],ParameterB [2],…ParameterA [n],ParameterB [n]
- 除非另有说明,否则以Little Endian格式发送和接收所有参数值(即,对于多个八位字节参数,首先发送最右侧)
- 在指定字符串下,低位是右边,例如。 0是’10’中的低位。
- 标记为未来使用保留的值或参数应设置为0,除非在传输时另有明确说明,并在接收时被忽略。实现不知道如何解释的参数值或操作码将被忽略,并且正在尝试的操作将使用正确的信令完成。由于接收到保留值,主机或控制器不应停止工作
指令分组格式
《core4.0》V2PE5-674
- 最大包长255,不含头部
- OCF(6 bits):命令字段, 0x00-0x3F (0x3F reserved for vendor-specific debug commands)
- OGF(10 bits): 组字段,0x0000-0x03FF。
- Parameter Total Length:后续参数的长度
事件分组格式
《core4.0》V2PE5-680
- Event Code(8bit): 0x00-0xFF,0xFF为事件代码保留
用于供应商特定的调试事件。
数据分组格式
ACL分组
《core4.0》V2PE5-675
- Handle:范围:0x000-0xEFF(0xF00 - 0xFFF留作将来使用)
Packet_Boundary_Flag(PB):
Broadcast_Flag(BC):
SCO分组
- Connection_Handle:用于传输同步数据分组或段。范围:0x0000-0x0EFF(0x0F00-0x0FFF保留供将来使用)
HCI 命令和事件
具体命令参数含义和返回事件请查看,《core4.0》V2PE7-700
HCI命令分类
HCI命令分为几大类
指令类型 | OGF |
---|---|
链路控制指令(Link Control commands) | 0x01 |
链路策略指令(Link Policy Commands) | 0x02 |
主机控制器与基带指令(HCI Control and Baseband Commands) | 0x03 |
信息参数指令(INFORMATIONAL PARAMETERS) | 0x04 |
状态指令参数(STATUS PARAMETERS) | 0x05 |
测试指令(TESTING COMMANDS) | 0x06 |
LE CONTROLLER COMMANDS | 0x08 |
HCI事件分类
具体返回事件参数含义和请查看,《core4.0》V2PE7.7-961
错误代码
具体错误代码请查看,《core4.0》V2PD-589
在返回事件中如果带有staus代码,这时候就可以返回错误代码,表面命令执行失败的原因。
HCI流控制
参考网站:
http://blog.sina.com.cn/s/blog_4c02ba150101r23p.html
http://blog.csdn.net/android_huber/article/details/7727512
这篇关于蓝牙HCI协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!