mirror of
https://github.com/espressif/esp-idf.git
synced 2025-08-12 05:17:38 +00:00
175 lines
6.4 KiB
ReStructuredText
175 lines
6.4 KiB
ReStructuredText
概述
|
||
======
|
||
|
||
: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} 蓝牙主机与控制器的关系结构图
|
||
|
||
|
||
- **场景 1(ESP-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 文件。
|