ESP32 IDF开发 应用篇㉒ 蓝牙BLE GAP和GATT协议专题讲解

本文介绍了ESP32IDF开发中蓝牙低功耗(BLE)的GAP和GATT协议,详细阐述了连接过程、角色、广播与扫描机制,以及GATT服务和特征的工作原理,为开发者理解和应用这些协议提供了指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP32 IDF开发 应用篇㉒ 蓝牙BLE GAP和GATT协议专题讲解


别迷路-导航栏
快速导航找到你想要的(文章目录)

此篇文章如果对你有用,请点赞收藏,您的支持就是博主坚持的动力。

1、博主写这篇技术文章的目的:

(1)、了解蓝牙协议;
(2)、了解GAP和GATT协议;

2、BLE协议简介

蓝牙协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据
发射和接收。

在这里插入图片描述
协议栈包括两个部分:控制器和主机。任何配置文件和应用程序都是建立在 GAP 和GATT 协议层上。
· GAP 层:直接与应用程序或配置文件(profiles)通信的接口,处理设
备发现和连接相关服务。另外还处理安全特性的初始化。
· GATT 层:定义了使用 ATT 的服务框架和配置文件(profiles)的结构。
BLE 中所有的数据通信都需要经过 GATT。
所以这种主要介绍GAP个GATT协议。
Ble耳机与手机的连接过程就是GAP,听音乐的数据传输过程就是GATT。

3、GAP

先来看看连接过程所需要的过程。
现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。
详细介绍 GATT 之前,需要了解 GAP(Generic Access Profile),它在用来控制设备连接和广播。GAP 使你的设备可以被其他设备发现,并决定了你的设备是否可以或者怎样与其他设备进行交互。蓝牙耳机、小米手环等设备属于外围从机设备就可以与中央主设备连接。
(1)、设备角色:
GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。
·广播者 (Broadcaster):处于这种⻆色的设备通过发送广播 (Advertising) 让接收者发现自己。这种角色只能发广播,不能被连接。
· 观察者 (Observer):处于这种角色的设备通过接收⼴广播事件并发送扫描 (Scan) 请求。这种角色只能发送扫描请求,不能被连接。
·外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
·中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。

在这里插入图片描述
(2)、数据的广播和扫描
在 GAP 中外围设备通过两种方式向外广播数据: Advertising Data Payload(广播数据)和 Scan Response Data Payload(扫描回复),每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复。
GAP 的广播工作流程如下图所示
在这里插入图片描述

外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太容易扫描到。
大部分情况下,外设通过广播自己来让中心设备发现自己,并建立 GATT 连接,从而进行更多的数据交换。

4、GATT

GATT 的全名是 Generic Attribute Profile,它定义两个 BLE 设备通过叫做 Service 和 Characteristic 的东西进行通信。一旦两个设备建立起了连接,GATT 就开始起作用了,这也意味着,你必需完成前面的 GAP 协议。这里需要说明的是,GATT 连接,必需先经过 GAP 协议。
GATT 连接需要特别注意的是:GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
中心设备和外设需要双向通信的话,唯一的方式就是建立 GATT 连接。
(1)、GATT 通信事务
GATT 通信的双方是 C/S 关系。外设作为 GATT 服务端(Server),它维持了 ATT 的查找表以及 service 和 characteristic 的定义。中心设备是 GATT 客户端(Client),它向 Server 发起请求。需要注意的是,所有的通信事件,都是由客户端(也叫主设备,Master)发起,并且接收服务端(也叫从设备,Slave)的响应。
一旦连接建立,外设将会给中心设备建议一个连接间隔(Connection Interval),这样,中心设备就会在每个连接间隔尝试去重新连接,检查是否有新的数据。但是,这个连接间隔只是一个建议,你的中心设备可能并不会严格按照这个间隔来执行,例如你的中心设备正在忙于连接其他的外设,或者中心设备资源太忙。
下图展示一个外设(GATT 服务端)和中心设备(GATT 客户端)之间的数据交换流程,可以看到的是,每次都是主设备发起请求:
在这里插入图片描述
(2)、GATT 结构

GATT 事务是建立在嵌套的Profiles, services 和 Characteristics之上的的,如下图所示:

在这里插入图片描述

Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。
Service 是把数据分成一个个的独立逻辑项,它包含一个或者多个 Characteristic。每个 Service 有一个 UUID 唯一标识。 UUID 有 16 bit 的,或者 128 bit 的。16 bit 的 UUID 是官方通过认证的,需要花钱购买,128 bit 是自定义的,这个就可以自己随便设置。
官方通过了一些标准 Service,完整列表在这里。以 Heart Rate Service为例,可以看到它的官方通过 16 bit UUID 是 0x180D,包含 3 个 Characteristic:Heart Rate Measurement, Body sensor Location 和 Heart Rate Control Point,并且定义了只有第一个是必须的,它是可选实现的。
Characteristic在 GATT 事务中的最低界别的是 Characteristic,Characteristic 是最小的逻辑数据单元,当然它可能包含一个组关联的数据,例如加速度计的 X/Y/Z 三轴值。与 Service 类似,每个 Characteristic 用 16 bit 或者 128 bit 的 UUID 唯一标识。你可以免费使用 Bluetooth SIG 官方定义的标准 Characteristic,使用官方定义的,可以确保 BLE 的软件和硬件能相互理解。当然,你可以自定义 Characteristic,这样的话,就只有你自己的软件和外设能够相互理解。

在这里插入图片描述

所有文章源代码:https://download.csdn.net/download/lu330274924/88518092

### 关于 ESP32 IDF 蓝牙网关 #### 配置环境与工具链 为了开发基于 ESP-IDF蓝牙网关项目,需先设置好开发环境。这包括安装必要的工具链并配置目标平台: ```bash idf.py set-target esp32 ``` 此命令会将当前项目的编译目标设定为 ESP32 平台[^2]。 #### 创建新项目 创建一个新的 ESP-IDF 项目用于实现蓝牙网关功能,并初始化所需的文件结构。可以通过复制官方提供的模板来快速启动项目: ```bash mkdir bluetooth_gateway && cd bluetooth_gateway cp -r $IDF_PATH/examples/bluetooth/gatt_server . cd gatt_server ``` 上述操作假设 `$IDF_PATH` 已经被正确设置了指向 ESP-IDF 安装目录的位置[^1]。 #### 修改 `menuconfig` 设置 进入菜单配置界面调整默认参数以适应特定需求: ```bash idf.py menuconfig ``` 在此处可以选择启用 Bluetooth Mesh 功能以及其他相关选项,比如设备名称、广播间隔等。 #### 编写示例代码 下面是一个简化版的 C 文件片段展示如何建立基本的 GATT Server 来作为蓝牙网关的一部分: ```c #include "nvs_flash.h" #include "esp_bt.h" #include "esp_gatts_api.h" static void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param){ // 处理 GAP 层事件... } void app_main(void){ nvs_flash_init(); esp_bluedroid_enable(); esp_ble_gap_register_callback(gap_event_handler); } ``` 这段程序展示了初始化 NVS (Non-Volatile Storage),使能 BlueTooth 协议栈,并注册了一个处理 GAP (通用访问层)事件回调函数的例子。 #### 构建与烧录固件 完成源码编写之后就可以通过如下指令来进行编译链接工作并将生成好的二进制映像上传到硬件板子上了: ```bash idf.py build idf.py -p /dev/ttyUSB0 flash monitor ``` 这里 `/dev/ttyUSB0` 应替换为实际连接电脑串口的具体路径名。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值