GATT协议简介(转)

本文深入解析蓝牙低功耗(BLE)技术中的GATT(通用属性配置文件)和GAP(通用接入配置文件),阐述了外围设备与中心设备的角色,以及广播数据和扫描回复的工作原理。此外,还介绍了如何通过Characteristic实现数据读写,实现双向通信。

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

调试蓝牙,看到一篇介绍很详细的文章,转过来学习一下,顺便感谢一下作者及翻译.

一、 引言

现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

二、 GAP

详细介绍 GATT 之前,需要了解 GAP(Generic Access Profile),它在用来控制设备连接和广播。GAP 使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。例如 Beacon 设备就只是向外广播,不支持连接,小米手环就等设备就可以与中心设备连接。

1. 设备角色

GAP 给设备定义了若干角色,其中主要的两个是:外围设备(Peripheral)和中心设备(Central)。

  • 外围设备:这一般就是非常小或者简单的低功耗设备,用来提供数据,并连接到一个更加相对强大的中心设备。例如小米手环。
  • 中心设备:中心设备相对比较强大,用来连接其他外围设备。例如手机等。

 

2. 广播数据

在 GAP 中外围设备通过两种方式向外广播数据: Advertising Data Payload

(广播数据)和 Scan Response Data Payload(扫描回复),每种数据最长可以包含 31 byte。这里广播数据是必需的,因为外设必需不停的向外广播,让中心设备知道它的存在。扫描回复是可选的,中心设备可以向外设请求扫描回复,这里包含一些设备额外的信息,例如设备的名字。(广播的数据格式我将另外专门写一个篇博客来讲。)

3. 广播流程

GAP 的广播工作流程如下图所示。 从图中我们可以清晰看出广播数据和扫描回复数据是怎么工作的。外围设备会设定一个广播间隔,每个广播间隔中,它会重新发送自己的广播数据。广播间隔越长,越省电,同时也不太容易扫描到。

  • Profile

 Profile 并不是实际存在于 BLE 外设上的,它只是一个被 Bluetooth SIG 或者外设设计者预先定义的 Service 的集合。例如心率Profile(Heart Rate Profile)就是结合了 Heart Rate Service 和 Device Information Service。所有官方通过 GATT Profile 的列表可以从这里找到。

  • Service

 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 MeasurementBody 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,这样的话,就只有你自己的软件和外设能够相互理解。

举个例子, Heart Rate Measurement Characteristic

,这是上面提到的 Heart Rate Service 必需实现的 Characteristic,它的 UUID 是 0x2A37。它的数据结构是,开始 8 bit 定义心率数据格式(是UINT8 还是 UINT16?),接下来就是对应格式的实际心率数据。

实际上,和 BLE 外设打交道,主要是通过 Characteristic。你可以从 Characteristic 读取数据,也可以往 Characteristic 写数据。这样就实现了双向的通信。所以你可以自己实现一个类似串口(UART)的 Sevice,这个 Service 中包含两个 Characteristic,一个被配置只读的通道(RX),另一个配置为只写的通道(TX)。

### RTOS环境下GATT协议的相关信息 在实时操作系统(RTOS)环境中实现GATT协议通常涉及配置BLE堆栈并管理服务和特征的注册与交互。以下是有关如何在RTOS下实现GATT协议的一些关键点: #### 1. GATT协议基础 GATT(Generic Attribute Profile)基于ATT(Attribute Protocol),用于定义两个BLE设备之间的数据交换方式。GATT通过Service和Characteristic来组织数据[^1]。每个Service可以包含多个Characteristics,而这些Characteristics则存储具体的数据。 #### 2. 查找表结构 ATT协议维护了一个查找表,其中包含了所有的Services、Characteristics及其关联的数据。该查找表中的每一项都由一个唯一的16位ID索引来标识。这种设计使得客户端能够高效地访问服务器上的资源。 #### 3. 配置GATT Server 为了实现在RTOS环境下的GATT功能,开发者需要完成以下工作: - **初始化BLE控制器**:启动硬件模块并与主机建立连接。 - **创建GATT数据库**:定义所需的Services和Characteristics,并将其添加到ATT查找表中。 - **处理事件回调**:当有来自远程设备的操作请求时,调用相应的函数响应读写操作或其他动作。 下面是一个简单的伪代码示例展示如何设置基本的服务和特性: ```c #include "ble_gatt.h" // 定义UUIDs (这里简化为常量字符串表示) #define SERVICE_UUID "0000180F" #define CHARACTERISTIC_UUID "00002A19" void setup_gatt_server(void){ uint16_t service_handle; ble_gatts_add_service(SERVICE_UUID, &service_handle); // 添加服务 ble_gatts_add_characteristic(service_handle, CHARACTERISTIC_UUID, BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_WRITE); } ``` 此片段展示了向系统增加一个新的自定义服务以及其内的单一可读写的属性的过程。 #### 4. RFCOMM与其他高层应用的关系 值得注意的是,在某些情况下,如果应用程序涉及到更复杂的通信需求,则可能还会依赖其他类型的协议如RFCOMM来进行串口模拟传输等功能支持[^2]。不过这通常是针对经典蓝牙而非低功耗蓝牙而言的情况。 #### 5. NimBLE移植至ESP32平台说明 对于特定芯片组比如Espressif Systems推出的ESP32系列微控制器来说,官方提供了详细的文档指导用户如何将Mynewt项目里的NimBLE组件成功迁移到目标平台上运行[^3]。这对于希望利用开源解决方案快速构建产品的工程师们非常有用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值