ESP32 蓝牙开发资料,用于了解ESP32内部的蓝牙实现。

本⼿册为 ESP32 的蓝⽛架构简介,主要分三个章节介绍了蓝⽛、经典蓝⽛和蓝⽛低功耗

⽅⾯的整体架构。注意,本⼿册仅针对 ESP-IDF V2.1 及以下版本。

⽬录

1. 蓝⽛ 1 .........................................................................................................................................

1.1. 概述 ...............................

目录

1.蓝牙

………………………1

1.1.概述

1.1.1.蓝牙应用结构

日量B面1日

1.1.2.HC接口选择

重日日1BB1日1量

2

1.1.3.蓝牙运行环境

ME重自D量重口

3

1.2.框架

4

1.2.1.控制器.

.4

1.2.2. BLUEDROID

4

1.2.2.1.主机架构∴

1.222.0S相关适配

量日B

BIB.8.8

1.2.3.蓝牙目录

2.经典蓝牙

6699

2.1.概述

2.2.协议和规范

10

2.2.1.L2CAP

10

2.2.2.SDP

.10

2.2.3.GAP

10

22.4.A2DP和 AVRCP

日面11面面量里

11

3.蓝牙低功耗

14

3.1.GAP.

14

3.1.1.概述

.14

3.12.BLE设备角色转换状态图

15

3.1.3.BLE广播流程

量面11日1量量a1日11

6

3.1.31.使用 public地址进行广播

16

3.1.32.使用可解析地址进行广播

17

3.1.3.3.使用静态随机地址进行广播

3.1.4.BLE广播类型介绍

19

3.1.4.1.可连接可扫描非定向广播

19

3.1.42.高占空比定向广播和可连接低占空比定向广播

19

3.1.4.3.可扫描非定向广播.

20

3.1.4.4.不可连接非定向广播

.20

3.1.5.BLE广播过滤策略介绍

.20

3.1.6.BLE扫描流程

3.1.7. BLE GAP实现机制

21

3.2. GATT

21

32.1.ATT属性协议

21

322.GATT规范.

n23

323.基于ESP32|DF建立GATT服务(GAT服务器)…

25

3.2.4.基于ESP32IDF发现对方设备的服务信息(GATT客户端)…26

3. 3. SMP

27

3.3.1.概述.…

27

3.32.BLE安全管理控制器

27

3.3.2.1BLE加密流程…

.27

3.3.2.2.BLE绑定流程

3.3.3.BLE安全管理实现机制

30

1.蓝牙

1

蓝牙

本章节介绍了ESP32的基本蓝牙架构。

1.1.概述

1.1.1.蓝牙应用结构

蓝牙是一种短距通信系统,其关键特性包括鲁棒性、低功耗、低成本等。蓝牙系统分为两

种不同的技术:经典蓝牙( Classic bluetooth)和蓝牙低功耗( Bluetooth Low Energy。

ESP32支持双模蓝牙,即同时支持经典蓝牙和蓝牙低功耗

从整体结构上,蓝牙可分为控制器( ontroller)和主机(Host两大部分:控制器包括了

PHY、 Baseband、 Link controller、 Link Manager、 Device Manager、H等模块,用于硬

件接口管理、链路管理等等;主机则包括了L2CAP、SMP、SDP、A∏、GAT、GAP以

及各种规范,构建了向应用层提供接□的基础,方便应用层对蓝牙系统的访问。主机可以

与控制器运行在同一个宿主上,也可以分布在不同的宿主上。ESP32可以支持上述两种方

式,下图罗列了几种典型应用结构

ESP32

PC/Phone/Pad

Bluedroid

LinUx/android

UART/SDIO

PC

Bluetooth

Controller

i Test Tool(BQB)

UART

图1-1.ESP32蓝牙主机与控制器的关系结构图

场景一(ESP-DF默认):在ESP32的系统上,选择 BLUEDROID为蓝牙主机,并

通过ⅦHC丨(软件实现的虚拟HC接口)接口,访问控制器。此场景下,

BLUEDROID和控制器都运行在同一宿主上(即ESP32芯片),不需要额外连接运

行蓝牙主机的PC或其它主机设备。

2017.11

1.蓝牙

场景二:在ESP32上运行控制器(此时设备将单纯作为蓝牙控制器使用),外接一

个运行蓝牙主机的设备(如运行Bez的 Linux PC、运行 BLUEDROID的 Android

等)。此场景下,控制器和主机运行在不同宿主上,与手机、PAD、PG的使用方式

比较类似

场景三:此场景与场景二类似,特别之处在于,在BQB(或其它认证)的控制器测

试下,可以将ESP32作为DUT,用∪ART作为|O接口,接上认证测试的PC机,

即可完成认证

1.1.2.HCI接口选择

ESP32上,HO只能同时使用一个⑩O接口,即如使用∪ART,则放弃HC、SDO等其

他O接口。在ESP-DF(V2.1以后)中,可以在 menuconfig中将蓝牙的HC接口方

式配置为ⅥHC|或∪ART,如下图

Bluetooth

BLuedroid Bluetooth stack enabLed

[1 HCI use UART as IO (NEW)

图1-2.HC||O接口方式配置

若选中 Bluedroid bluetooth stack enabled,则表示便用∨HC作为|O方式,那么HC

use Uart as /0(NEW选项会消失;若选中Hc/ use UART as /O(NEW),则表示使用

∪ART作为0方式;目前,ESP-DF暂时不支持其他|O,如需使用其他方式(如SP

等),则需开发SP-ⅦⅥHC的 bridge模块。

选项

进入 Bluedroid bluetooth stack enabled选项时,可以看到如下配置。

H- Bluedroid BLuetooth stack enabled

(3072) BLuetooth event (callback to application) task stack size

[I BLuedroid memory debug

CLassic bluetooth

Release dram from classic bt controller

[* IncLude gATT server module(gatts)

IncLude GATT CLient module (gatto)

Include BLE security module(SMp)

L Close the bluedroid bt stack Log print

(4) BT/BLE MAX ACL CONNECTIONS(17)

图1-3.VHGI配置

Espressif

2017.11

1.蓝牙

如上图所示,用户可在此界面配置

Bluetooth event(ca∥ back to application) task stack size( BTC Task大小);

Bluedroid memory debug( BLUEDROID内存调试);

Classic Bluetooth(使能经典蓝牙

Release DRAM from Classic BT Contro∥ler(从经典蓝牙控制器中释放DRAM);

nclude GATT server module(GATTS)(包括GATS模块)

Include GATT client module( GATTC)(包括G^TTC模块);

Include bLe security module SM)(包括SMP模块);

C/ ose the b/ uedroid bt stack log print(关闭 BLUEDROID打印)

BT/ BLE MAX ACL CONNECT/ONS(1~7)(最大ACL连接数)等。

选项二

进入HC/ use UART as /o选项时,可以看到如下配置

HCI use UART as I0

(1) UART Number for HCI (NEW)

(921600) uART Baudrate for HCI (NEW)

图1-4.UART配置

用户可在此界面配置 UART Number for hc/NEW(UART端口号),以及UART

Baudrate for hcl(Nw(UAR端口的波特率)。其中,∪ART模式必须支持硬件流控

(CTS/RTS)。

1.1.3.蓝牙运行环境

FSP-DF的默认运行环境为双核 FreeRTOS,ESP32的蓝牙可按照功能分为多个任务

ask)运行,不同任务的优先级也有不同,其中优先级最高的为运行控制器的任务。控制

器任务对实时性的要求较高,在 FreeRTOS系统中的优先级仅次于卩C任务(PC任务用

于双核C門U的进程间通信)。 BLUEDROID(ES卩DF默认蓝牙主机)共包含4个任务,

分别运行BTC、BTU、HC| UPWARD,及HC| DOWNWARD。

2017.11

1.蓝牙

1.2.框架

1.2.1.控制器

ESP32的控制器同时支持 Classic bl和BLE,支持的蓝牙版本为4.2。控制器中主要集成

了H4协议、HC|、 Link Manager、 Link Controller、 Device Manager、 HW Interface等功

能。这些功能都以库的形式提供给开发者,并做了一些AP丨用来访问控制器,具体请见

readthedocs。

C/E

SCO)

ACL

c爬E

CE

ACL

Link

Manager

Manager

Device

Manager

resource Manager

Link Controller

Link

Controller

BREDR Radio and LE Radio(PHy)

BREDR Controller

LE Controller

图1-5. Classic Bt&BLE控制器架构(摘自S| G BT CORE42)

1.22. BLUEDROID

1.221.主机架构

在 ESP-IDF中,使用经过大量修改后的 BLUEDROID作为蓝牙主机 Classic bt+BLE

BLUEDR○D拥有较为完善的功能,支持常用的规范和架构设计,同时也较为复杂。经过

大量修改后, BLUEDROID保留了大多数BTA层以下的代码,几乎完全删去了BTF层的

代码,使用了较为精简的BTC层作为内置规范及Misc控制层。修改后的 BLUEDROID及

其与控制器之间的关系如下图

4/31

2017.11

1.蓝牙

TASK

USER APP

PFOCEDURE

ESP_ API|匚 GATT CAP SDP

PROF‖LEs

PROFILES

BTC

BLE PROFILE

OFILE

mn[工可[

BTU

blE Bt

BLE LOW-LAYER

W-LAYER

STACK

PROFILE

ROFILE

GLOwPa1

A2DP RFCOMM

/ATT

SDP

GAP

H4 HCI TRANSPCRT LAYER (nclude HCI Task

VHCL API

VCI

Controller

LM/LC

HV

图1-6.ESP32 BLUEDROID层次关系图

国说明:

此架构图主要描述架构层次,部分细节(如 HC/ TASK)已舍去。下文会较为具体地介绍各层次的内容

2017.11

1.蓝牙

从上图可以看到, BLUEDROID内部大致分为2层:BTU层和BTC层(除去HC),每

个层都有对应的任务来处理。BTU层主要负责蓝牙主机底层协议栈的处理,包括

2CAP、 GATT/ATT、SMP、GAP以及部分规范等,并向上提供以“ba”为前缀的接口

BTC层主要负责向应用层提供接口支持、处理基于GAT的规范、处理杂项等,并向应用

层提供以esp”为前缀的接囗。所有的AP都在 ESP AP层,开发者应当使用esp”为前缀

的蓝牙AP(特殊的除外)

上图并未详细描述HC|部分,而事实上,HC具有2个任务(至少在 ESP-IDF V2.1以

前),分别处理 Downward和 Upward的数据。

此框架的其中一条设计思路是尽量将蓝牙相关的任务交给BTG来处理,从而避免和降低

用户任务 User Task)的负载,也使结构上更加简洁。

由于历史原因和实际需求,经典蓝牙的部分规范,如 RFCOMM、A2DP等,中层次偏协

议偏底层的部分运行在BTU层,偏控制流程的以及需要提供ES尸-A的运行在BTC层

蓝牙低功耗的部分规范或偏底层的功能,如6 LOWPan或 Dynamic L2 CAP Channe的功

能,将运行在BTU层,再通过BTC向应用层提供 ESP-AP

1222.0s相关适配

BLUEDR○D中有部分与系统相关的接口需要进行OS适配,涉及到的功能包括 Timer

( Alarm)、Task( hread)、 Future Await./ Ready( semphore)、 Allocator/GKl(malloc/ree)等。

BLUEDROID中将 FreeRTOS的 Timer封装成Aam,用于启动定时器,触发某些特定任

BLUEDRO|D将原先的 Linux下的 Thread部分重新替换成 FreeRTOS的任务,并使用

FreeRTOS的 Queue来触发任务的运行(唤醒)

BLUEDROID使用 Future Await/ Ready功能来实现阻塞,「 Iture Lock将 FreeRTOS的

XSemphore Take包装成 future_ awant函数,并将 XSemphoreGive包装成 future_ready

函数。值得注意的是, future await和 future_ ready不能在同一任务中调用。

BLUEDR○D将标准库中的 malloc/free封装成 Allocator的申请/释放内存的函数,GK功

能也同样使用ma| loc/free来作为 GKl_getout/ GKI freebuf的核心函数。

1.23.蓝牙目录

进入ESP-DF的 component/bt目录,可以看到有如下子目录和子文件

2017.11

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐