蓝牙HCI协议

2023-10-10 17:40
文章标签 协议 蓝牙 hci

本文主要是介绍蓝牙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 typeHCI packet indicator
HCI Command Packet0x01
HCI ACL Data Packet0x02
HCI Synchronous Data Packet0x03
HCI Event Packet0x04

所有四种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 COMMANDS0x08

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协议的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/182033

相关文章

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有