1. BLE 基础概念与协议栈架构
各位做嵌入式开发的朋友,咱们今天聊聊 BLE 的基础。很多工程师一上来就啃协议栈源码,结果越看越懵。我个人习惯是,先搞清楚 BLE 到底是个什么东西,它跟经典蓝牙有什么不同,然后再去看协议栈的分层结构。这样上手会快很多。
1.1 BLE 与经典蓝牙的区别
说白了,BLE 和经典蓝牙虽然都叫蓝牙,但设计思路完全不一样。经典蓝牙是为了持续传输音频、文件这类大数据流设计的,功耗高、连接建立慢。而 BLE 从一开始就是为低功耗、小数据量、间歇性通信场景设计的。
我举个例子你就明白了。经典蓝牙就像一辆大卡车,能拉很多货,但启动慢、油耗高。BLE 就像一辆小电驴,拉不了多少东西,但随叫随走、省电。你想想看,一个智能灯泡需要传什么数据?无非就是开、关、调色这几个命令,用 BLE 再合适不过了。
| 对比项 | 经典蓝牙 (BR/EDR) | BLE |
|---|---|---|
| 设计目标 | 持续流式数据传输 | 低功耗间歇性通信 |
| 功耗 | 高(mA 级持续) | 低(μA 级待机) |
| 连接建立时间 | 数秒 | 3-5 ms |
| 数据传输速率 | 1-3 Mbps | 125 Kbps - 2 Mbps |
| 典型应用 | 蓝牙耳机、音箱、文件传输 | 传感器、穿戴设备、Beacon |
| 网络拓扑 | 点对点、微微网 | 点对点、广播、Mesh |
关键点:BLE 不是经典蓝牙的升级版,而是针对特定场景重新设计的协议。选型时一定要想清楚你的产品到底需要什么。
1.2 BLE 协议栈分层架构
BLE 协议栈分三层:Controller、Host、Application。每一层各司其职,层与层之间通过标准接口通信。我记得刚接触 BLE 时,总觉得分层太多、太复杂。后来做项目多了才明白,这种分层设计恰恰是 BLE 灵活性的来源。
Controller(控制器层)
这一层负责最底层的射频收发。PHY 处理 2.4GHz 频段的模拟信号,Link Layer 负责数据包的组装、拆解、时序控制。嗯,这里要注意:Link Layer 是 BLE 低功耗的关键,它定义了 37 个数据信道和 3 个广播信道,通过跳频机制避免干扰。
我的经验:调试射频问题时,先确认 Controller 层是否正常工作。我曾经遇到一个项目,手机死活搜不到设备,最后发现是 Link Layer 的广播间隔配置错了,导致广播包被其他信号淹没。
Host(主机层)
Host 层是协议栈的核心,包含多个子层:
- L2CAP:负责数据的分段重组,把上层的大数据包切成适合 Link Layer 传输的小包。
- ATT:属性协议,定义了设备之间如何读写数据。说白了就是客户端-服务器模型,服务器暴露属性,客户端来读写。
- GATT:基于 ATT 的通用属性规范,定义了 Profile 和 Service 的组织方式。你平时看到的 Service UUID、Characteristic,都是 GATT 层面的概念。
- GAP:通用访问规范,负责设备的发现、连接建立、广播配置。
- SMP:安全管理协议,负责配对和加密。
- HCI:主机控制器接口,是 Host 和 Controller 之间的通信桥梁。如果 Host 和 Controller 是分开的芯片,HCI 就走 UART、USB 等物理接口。
避坑指南:我曾经在 HCI 接口上吃过亏。当时用 UART 连接 Host 和 Controller,波特率设得太高,导致丢包严重。后来降到 115200 才稳定。如果你遇到连接不稳定、数据丢包,先检查 HCI 接口的配置。
Application(应用层)
这一层就是咱们写业务逻辑的地方。你定义自己的 Profile,比如一个温湿度传感器,就创建一个 Service,里面包含温度 Characteristic 和湿度 Characteristic。应用层不关心底层怎么收发数据,只管调用 Host 层提供的 API。
1.3 BLE 核心角色
BLE 定义了四种角色,每种角色对应不同的通信模式。我刚开始做 BLE 时,经常把 Peripheral 和 Central 搞混。后来用一句话就记住了:Peripheral 是发广播的,Central 是扫描广播的。
| 角色 | 方向 | 典型设备 | 主要行为 |
|---|---|---|---|
| Broadcaster | 只发送 | Beacon、信标 | 周期性广播数据,不建立连接 |
| Observer | 只接收 | 扫描器、网关 | 扫描广播包,不发起连接 |
| Peripheral | 可连接 | 传感器、手环 | 广播自身,等待 Central 连接 |
| Central | 主动连接 | 手机、平板 | 扫描并主动发起连接 |
你想想看,一个智能门锁是什么角色?它平时处于广播状态,等待手机(Central)来连接。门锁就是 Peripheral。那一个商场里的 Beacon 呢?它只发广播,告诉手机「我在这里」,不建立连接,所以是 Broadcaster。
重要提醒:一个设备可以同时支持多种角色。比如手机既是 Central(连接手环),也可以是 Peripheral(被其他设备连接)。但实际产品中,为了简化设计和降低功耗,通常只实现一种角色。
我记得有一次做智能家居项目,客户要求网关同时扫描 50 个传感器。我一开始用 Peripheral 模式去处理,结果发现根本忙不过来。后来改成 Observer 模式,只收不连,用广播方式传数据,问题就解决了。所以角色选型一定要根据实际场景来定。
1.4 本章小结
这一章咱们把 BLE 的基础概念理清楚了。经典蓝牙和 BLE 的区别,说白了就是「大而全」和「小而精」的区别。协议栈的三层架构——Controller、Host、Application——各司其职,分层设计让开发更灵活。四种核心角色——Broadcaster、Observer、Peripheral、Central——对应不同的通信模式,选对角色能让你的产品事半功倍。
这些概念是后续所有章节的基础。后面我们会深入每个模块的细节,包括广播配置、连接参数优化、功耗管理等等。先把基础打牢,后面才能走得稳。