Files
esp-idf/docs/zh_CN/api-guides/bt-architecture/overview.rst

175 lines
6.4 KiB
ReStructuredText
Raw Normal View History

概述
======
:link_to_translation:`en:[English]`
蓝牙\ :sup:`®` 无线技术是一种短距离通信标准,具备高可靠性、低功耗和低成本等特点。主要分为两种类型:
- **经典蓝牙:** 优化用于连续的高吞吐量数据流,适用于音频传输等应用。
- **低功耗蓝牙 (Bluetooth LE):** 针对低功耗间歇性数据传输设计,适合用于传感器和可穿戴设备等。
.. only:: esp32
{IDF_TARGET_NAME} 支持双模蓝牙,即同时支持经典蓝牙和低功耗蓝牙。
蓝牙协议栈
============
蓝牙协议栈是一种分层通信架构,定义了蓝牙设备如何发现彼此、建立连接、交换数据,并确保通信安全可靠。如图 :ref:`bluetooth-core-system-architecture` 所示协议栈主要分为控制器Controller和主机Host两大部分两者通过 HCI 接口进行通信。
.. _bluetooth-core-system-architecture:
.. figure:: ../../../_static/bluetooth-core-system-architecture.png
:align: center
:width: 80%
:alt: 蓝牙核心系统架构
蓝牙核心系统架构(来源:蓝牙核心规范)
**控制器**
控制器负责硬件层面的操作和底层链路控制,包含:
- **PHY (物理层):** 处理 2.4 GHz ISM 频段的蓝牙信号收发。
- **基带 (Baseband):** 管理底层时序和控制功能,包括跳频、数据包格式化和纠错。
- **链路控制器 (Link Controller):** 处理设备连接/断开的链路状态机、流控和重传机制。
- **链路管理器 (Link Manager):** 管理链路设置、身份验证、加密和功率控制。
- **设备管理器 (Device Manager):** 管理设备状态,处理寻呼/查询流程,存储安全密钥。
**主机**
主机实现应用交互所需的高层协议,包含:
- **L2CAP (逻辑链路控制与适配协议):** 处理数据分段、重组和复用。
- **SMP (安全管理协议):** 管理身份验证、加密和安全配对。
- **GAP (通用访问规范):** 管理设备发现、连接建立,并定义蓝牙设备的角色和模式。
- **ATT/GATT (属性协议/通用属性规范):** 通过服务和特征实现基于属性的数据交换,主要用于低功耗蓝牙。
- **SDP (服务发现协议):** 允许设备广播和发现可用服务,主要用于经典蓝牙。
.. only:: esp32
蓝牙主机和控制器可以集成在同一设备上,也可以在不同设备上实现。{IDF_TARGET_NAME} 可以支持上述两种方式,下图 :ref:`bt-host-controller-structure` 展示了典型的应用结构:
.. _bt-host-controller-structure:
.. figure:: ../../../_static/bt-host-controller-structure.png
:align: center
:width: 70%
:alt: {IDF_TARGET_NAME} 蓝牙主机与控制器的关系结构图
{IDF_TARGET_NAME} 蓝牙主机与控制器的关系结构图
- **场景 1ESP-IDF 默认设置)**
使用 Bluedroid 作为蓝牙主机,通过 VHCI软件实现的虚拟 HCI实现主机与控制器之间的通信。Bluedroid 和控制器运行在同一设备上(即 {IDF_TARGET_NAME} 芯片),无需外部主机设备。
- **场景 2仅控制器模式**
{IDF_TARGET_NAME} 仅作为蓝牙控制器。外部主机设备(如运行 BlueZ 的 Linux PC 或运行 Bluedroid 的 Android 设备)负责蓝牙操作。
- **场景 3测试/认证)**
类似于场景 2但用于蓝牙认证机构BQB控制器测试或认证。{IDF_TARGET_NAME} 芯片通过 UART 连接到测试工具。
蓝牙运行环境
=============
ESP-IDF 蓝牙协议栈运行在 FreeRTOS 环境中,蓝牙任务根据功能和优先级进行分配。由于实时性要求,控制器任务具有最高优先级(部分跨核通信 IPC 任务除外)。
.. only:: esp32
{IDF_TARGET_NAME} 的运行环境为双核 FreeRTOS控制器任务的优先级最高仅次于用于双核 CPU 之间通信的 IPC 任务。默认的蓝牙主机 Bluedroid 包含三个任务BTC、BTU 和 HCI。
Bluedroid
============
ESP-Bluedroid 是基于 Android 蓝牙协议栈 Bluedroid 的修改版, 支持经典蓝牙和低功耗蓝牙。由两层组成:
- **蓝牙上层 (BTU):** 实现核心协议L2CAP、GATT、SMP 等)。
- **蓝牙传输控制器层 (BTC):** 提供应用层 API 并管理配置文件。
**使用场景:** 推荐用于同时需要经典蓝牙和蓝牙低能耗的应用。
操作系统适配
--------------
Bluedroid 通过适配系统相关功能与 FreeRTOS 集成:
- **Timer (Alarm):** FreeRTOS 的 Timer 封装成 Alarm⽤于启动定时器触发某些特定任务。
- **Task (Thread):** FreeRTOS 的 Task 取代 POSIX Thread并使用 FreeRTOS 的 Queue 来触发任务的运行(唤醒)。
- **Future Await/Ready (Semaphore):** ``xSemaphoreTake`` 封装成 ``future_await````xSemphoreGive`` 封装成 ``future_ready````future_await````future_ready`` 不能在同一任务中调用。
- **Allocator (malloc/free):** 标准库中的 ``malloc/free`` 被封装为 ``Allocator``,用于分配 (malloc) 或释放 (free) 内存。
Bluedroid 目录结构
--------------------
ESP-IDF 目录 *component/bt/host/bluedroid* 包含如下子文件夹:
.. code-block:: text
├── api
├── bta
├── btc
├── common/include/common
├── config
├── device
├── external/sbc
├── hci
├── main
├── stack
└── Kconfig.in
子文件夹的具体说明见下表:
.. list-table:: ESP-IDF *component/bt/host/bluedroid* 目录描述
:header-rows: 1
:widths: 20 80
* - **子文件夹**
- **说明**
* - *api*
- API 目录,所有的 API除 Controller 相关)都在此目录下。
* - *bta*
- 蓝牙适配层,适配一些主机底层协议的接口。
* - *btc*
- 蓝牙控制层,控制主机上层协议(包括规范)以及杂项的处理。
* - *common*
- 协议栈的通用头文件。
* - *config*
- 为协议栈配置一些参数。
* - *device*
- 与控制器设备控制相关的,如控制器基本设置的 HCI CMD 流程等。
* - *external*
- 与蓝⽛⾃身⽆关,但⼜要使⽤的代码,如 SBC codec 软件程序等。
* - *hci*
- HCI 层协议。
* - *main*
- 主程序⽬录(主要为启动、关闭流程)。
* - *stack*
- 主机底层协议栈GAP/ ATT/ GATT/ SDP/ SMP 等)。
* - *Kconfig.in*
- Menuconfig 文件。