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 灵活性的来源。

BLE 协议栈分层架构 Application(应用层) 用户自定义 Profile、业务逻辑 Host(主机层) GATT / GAP ATT / SMP L2CAP HCI(Host 侧) Controller(控制器层) Link Layer(链路层) PHY(物理层)

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——对应不同的通信模式,选对角色能让你的产品事半功倍。

这些概念是后续所有章节的基础。后面我们会深入每个模块的细节,包括广播配置、连接参数优化、功耗管理等等。先把基础打牢,后面才能走得稳。