1. 蓝牙技术概述:从起源到HCI层的定位
大家好,我是你们这堂课的主讲人。做蓝牙驱动开发这么多年,我经常被问到同一个问题:「蓝牙这东西,到底是怎么工作的?」
嗯,要回答这个问题,咱们得先从它的「前世今生」聊起。你想想看,一个技术能活20多年,还不断进化,肯定有它的道理。
1.1 蓝牙发展史:一个「连接」的梦想
1994年,爱立信公司想解决一个很实际的问题:手机和耳机之间的线缆太烦人了。于是他们启动了一个研究项目,目标是用无线电波替代这些线缆。
这个项目以公元10世纪统一丹麦和挪威的国王——哈拉尔·蓝牙(Harald Bluetooth)命名。为什么?因为这位国王擅长「连接」各方势力,跟这项技术的初衷一模一样。
我个人觉得,这个名字起得真妙。一个技术,从诞生起就带着「连接」的基因。
- 1998年:爱立信、诺基亚、IBM、东芝、Intel 五家公司成立蓝牙特别兴趣小组(SIG)。
- 1999年:蓝牙 1.0 规范发布。说实话,那时候的兼容性惨不忍睹,我在早期项目中吃过不少苦头。
- 2004年:蓝牙 2.0 + EDR 发布,数据传输速率提升到 3 Mbps。嗯,终于能传点像样的文件了。
- 2009年:蓝牙 3.0 + HS 发布,引入了 802.11 高速传输。但这个版本说实话,用的人不多。
- 2010年:蓝牙 4.0 发布,这是革命性的一步——引入了低功耗蓝牙(BLE)。
- 2016年:蓝牙 5.0 发布,传输距离提升到 300米,广播容量翻了8倍。
- 2019年至今:蓝牙 5.1/5.2/5.3/5.4,加入了方向定位、LE Audio 等新特性。
关键转折点:蓝牙 4.0 引入 BLE,让蓝牙从「手机配件」变成了「物联网基石」。我在2012年做第一个 BLE 项目时,还觉得这东西太新、不稳定。现在回头看,真是错过了不少机会。
1.2 蓝牙版本演进:经典与低功耗的「双轨制」
很多人搞不清蓝牙版本之间的关系。说白了,从 4.0 开始,蓝牙实际上变成了「两种技术」:
| 特性 | 经典蓝牙(BR/EDR) | 低功耗蓝牙(BLE) |
|---|---|---|
| 设计目标 | 高吞吐量、音频流 | 低功耗、低延迟、小数据量 |
| 典型应用 | 蓝牙耳机、音箱、车载 | 智能穿戴、传感器、信标 |
| 功耗 | 较高(mA级) | 极低(μA级) |
| 数据速率 | 最高 3 Mbps(EDR) | 最高 2 Mbps(5.0+) |
| 拓扑结构 | 微微网(1主7从) | 广播、连接、Mesh |
为什么会这样?我给你们讲个故事。早期蓝牙的功耗太高,一颗纽扣电池撑不了几天。但物联网设备需要跑几个月甚至几年。所以 SIG 干脆重新设计了一套协议栈,从物理层到应用层全部优化。这就是 BLE 的由来。
我的建议:做驱动开发时,一定要先搞清楚你面对的是 BR/EDR 还是 BLE。两者的 HCI 命令虽然共用一套框架,但具体实现差异很大。我曾经在一个项目中把 BLE 的 HCI 命令用在经典蓝牙上,结果设备直接死机——嗯,教训深刻。
1.3 蓝牙架构体系:分层设计的智慧
蓝牙协议栈采用分层架构,每一层各司其职。这就像一家公司,有高层决策、中层管理、基层执行。你想想看,如果所有事情都堆在一起,那不乱套了?
从下往上,蓝牙架构大致分为:
- 物理层(PHY):负责无线电信号的收发。2.4GHz ISM 频段,79个信道(经典)或40个信道(BLE)。
- 链路层(LL):负责数据包的封装、解封装、重传、加密等。这是 BLE 的核心层。
- 主机控制器接口(HCI):这是今天的重点,稍后详细讲。
- 逻辑链路控制与适配协议(L2CAP):负责数据的分段重组、服务质量控制。
- 上层协议:包括 RFCOMM(串口仿真)、ATT(属性协议)、GATT(通用属性协议)、SDP(服务发现协议)等。
- 应用层:各种 Profile,比如 HFP(免提)、A2DP(音频流)、HID(人机交互)等。
注意:在嵌入式系统中,通常有一个「物理分割」——控制器(Controller)和主机(Host)。控制器包含 PHY 和 LL,通常集成在蓝牙芯片中。主机包含 L2CAP 及以上层,运行在应用处理器上。而 HCI 层,就是连接这两者的「桥梁」。
1.4 HCI层在蓝牙协议栈中的位置与作用
好了,终于到重点了。HCI 层,全称 Host Controller Interface,主机控制器接口。
它的位置很特殊——正好卡在主机和控制器之间。你可以把它想象成一个「翻译官」:主机听不懂控制器在说什么,控制器也听不懂主机的指令。HCI 就是那个两边都懂的人。
具体来说,HCI 层的作用包括:
- 命令发送:主机通过 HCI 命令控制控制器,比如「开始扫描」、「建立连接」、「设置发射功率」。
- 事件上报:控制器通过 HCI 事件通知主机,比如「扫描到设备」、「连接断开」、「数据到达」。
- 数据传输:主机和控制器之间的 ACL 数据(面向连接)和 SCO 数据(同步面向连接)传输。
我给你们画个简单的数据流:
应用层 → L2CAP → HCI(主机侧) → 传输层(UART/USB/SDIO) → HCI(控制器侧) → 链路层 → 物理层
在实际项目中,HCI 层最常见的传输方式就是 UART。为什么?因为 UART 接口简单、成本低、几乎所有 MCU 都支持。我在做智能手表的蓝牙驱动时,用的就是 HCI over UART。
避坑指南:我曾经在一个项目中,HCI 命令发送后一直收不到响应。查了三天,最后发现是 UART 的波特率不匹配。控制器默认 115200,但主机配置成了 9600。嗯,这种低级错误,犯过一次就再也不会忘了。
HCI 层的核心价值在于「解耦」。没有 HCI,主机和控制器就必须紧耦合——换一个蓝牙芯片,整个协议栈都得重写。有了 HCI,只要芯片支持标准的 HCI 命令,主机侧代码基本不用动。
这也是为什么我们这门课要重点讲 HCI 层。你掌握了 HCI,就等于掌握了蓝牙驱动的「通用语言」。不管换什么芯片,底层逻辑都是相通的。
1.5 小结
这一章我们聊了蓝牙的来龙去脉,从 1994 年的爱立信实验室,到今天的蓝牙 5.4。重点记住了:
- 蓝牙 4.0 之后分经典和低功耗两条线
- 蓝牙协议栈是分层架构,HCI 是主机和控制器之间的桥梁
- HCI 层负责命令、事件、数据的传输,是驱动开发的核心
下一章,我们会深入 HCI 的数据包格式,看看那些 0x01、0x02 到底代表什么意思。到时候我会拿一个真实的抓包数据来拆解,保证让你一看就懂。
好,今天就到这里。有什么问题,咱们课后交流。