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

175 lines
6.4 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

概述
======
: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 文件。