蓝牙传输层HCI工作原理是什么?
摘要:liwen01 2025.10.03 前言 在《蓝牙基础(二):蓝牙核心系统架构》中,我们有介绍到蓝牙分层架构设计的核心是:Host(主机)、Controller(控制器)与 HCI(Host Controller Interface,主机
liwen01 2025.10.03
前言
在《蓝牙基础(二):蓝牙核心系统架构》中,我们有介绍到蓝牙分层架构设计的核心是:Host(主机)、Controller(控制器)与 HCI(Host Controller Interface,主机控制器接口)。
它们之间的关系、可以简单理解为:Host 是大脑,Controller 是身体,HCI 是它们之间的通信通道。
(一)HCI 简介
(1)蓝牙协议栈中的 HCI
Host(主机):运行在主处理器上(如 MCU、Linux、Windows 等),主要负责上层协议和应用逻辑。
Controller(控制器):Controller 通常集成在一个蓝牙芯片中(有时称为 Bluetooth SoC),负责底层无线通信功能。
HCI(Host Controller Interface):HCI 是 Host 和 Controller 之间的标准接口协议,它定义了两者如何交换命令、事件和数据。通信方式主要有:UART、USB、SPI、SDIO 等
以 USB 蓝牙适配器为例,插入电脑的那个 USB 蓝牙适配器是 Controller,PC 机系统是 Host,它们通过 USB HCI 协议进行数据通信。
它们对应的软件层次结构图如下:
这里的物理总线,除了 USB 总线,还可以是 SDIO、UART、SPI 等等。
这些总线对 HCI 数据包是透明的传输,也就是说,它不用理解 HCI 的语义,仅仅负责 HCI 包的传输。
这样就可以保证不同硬件接口、不同厂商的模块能共用主机栈,而不必改写高层协议
(2) 蓝牙数据流
要将一个用户数据,从一个蓝牙设备发送到另外一个蓝牙设备,数据从应用层用户数据开始,经过主机(Host)、控制器(Controller),最终经由射频(RF)模块发射出去,另一端再反向流回。
Host 负责逻辑和协议(决定发什么数据、什么时候发)。
Controller 负责时序和无线电(怎么发、用哪个信道、怎么跳频)。
HCI 是桥梁(命令/事件/数据的标准接口)。
Physical Bus 是管道(USB、UART、SDIO等传输媒介)。
它的完整数据流如下:
如果要对它们进行简化,可以简化成如下流程:
Host Side (PC)
──────────────────────────────────────────
L2CAP / RFCOMM
↓
HCI Library
↓
USB Stack → USB Host Controller →───┐
│
Controller Side (Bluetooth USB Device)
──────────────────────────────────────────
USB Device Controller ← Bluetooth USB Firmware
↓
Bluetooth LM / LC
↓
Bluetooth Radio → Over-the-air → Other Device
可以看到,数据数从 host 到 controller,必须经过 USB 协议栈。当然,如果是使用其它的通信总线,那就是其它总线对应的驱动。
(3) HCI 数据包
HCI 在协议中的位置如下:
通过 USB适配器 + Wireshark 抓取 蓝牙 HCI 数据包,信息如下:
通过 Wireshark 抓取到的蓝牙 HCI 的数据包,我们可以看到有抓到 USB、HCI_USB、HCI_CMD、HCI_EVT.. 这些协议的数据。
USB:这是最底层的总线协议,表示所有通过 USB 物理链路 传输的数据包。
HCI_USB:这是 Wireshark 的 USB-HCI 解码层。用于承接 USB 层和HCI 层之间的数据。它不是新的协议,而是 Wireshark 把 USB 层数据识别为 蓝牙 HCI over USB 的结果。
HCI_CMD、HCI_EVT:通过 HCI_USB 解析出来的真实的蓝牙HCI 数据包
截图最开始的一串USB数据包,是一个USB枚举流程,以便 Wireshark 识别所有的 USB 设备。
(二) HCI 数据类型
主机与控制器之间通过 HCI 传输层的数据主要有:HCI 命令包、HCI 事件包、HCI 数据包(ACL/ISO/SCO)。
