在蓝牙低功耗(BLE)技术体系中,GATT(Generic Attribute Profile)扮演着数据通信"交通规则"的角色。它定义了设备间如何组织、发现和交换数据,是整个BLE应用开发的基石。理解GATT不仅需要掌握其技术规范,更要领会其背后的设计哲学。
在没有GATT的世界里,BLE设备间的通信就像两个没有共同语言的人尝试对话:
0xA1B2表示"请求温度"0x1E表示"当前30℃"GATT通过三层抽象解决了这些问题:
GATT构建在ATT(Attribute Protocol)协议之上,两者关系如下表所示:
| 层级 | 协议 | 职责 | 类比 |
|---|---|---|---|
| 应用层 | GATT | 定义数据组织方式和交互语义 | 图书馆分类法 |
| 传输层 | ATT | 提供属性查找和读写机制 | 图书借阅系统 |
ATT协议为GATT提供了四个基础操作原语:
GATT则在ATT基础上定义了:
这种分层设计使得:
服务是GATT数据库的最高层抽象,其设计遵循以下原则:
服务声明结构
cpp复制// 典型服务声明示例
typedef struct {
uint16_t start_handle; // 服务起始句柄
uint16_t end_handle; // 服务结束句柄
uuid_t uuid; // 服务UUID
} gatt_service_t;
服务类型对比
| 类型 | UUID长度 | 示例 | 特点 |
|---|---|---|---|
| 标准服务 | 16-bit | 0x180D(心率服务) | 蓝牙SIG定义,设备通用 |
| 厂商服务 | 128-bit | 类似UUID | 厂商自定义,需文档说明 |
服务设计最佳实践
特征值是实际数据交互的载体,其完整定义包含两部分:
特征值声明结构
cpp复制typedef struct {
uint8_t properties; // 属性位掩码
uint16_t value_handle; // 特征值数值句柄
uuid_t uuid; // 特征值UUID
} gatt_characteristic_t;
属性位掩码详解
特征值数值存储
描述符为特征值提供元数据和控制接口,最重要的两类描述符:
客户端特征配置描述符(CCCD)
特征值用户描述描述符
描述符访问控制
服务发现是GATT交互的第一步,完整流程如下:
初级发现:通过Discover All Primary Services请求获取所有主服务
{Opcode=0x10, StartHandle=0x0001, EndHandle=0xFFFF}{HandleRange=[0x0001-0x000A], UUID=0x180D}(心率服务)特征值发现:通过Discover All Characteristics获取服务内特征值
{Opcode=0x08, StartHandle=0x0001, EndHandle=0x000A}{Properties=0x10, ValueHandle=0x0003, UUID=0x2A37}描述符发现:通过Find Included Services和Discover All Descriptors获取完整结构
优化技巧
GATT支持多种数据交互模式,各有适用场景:
| 模式 | 触发方式 | 确认机制 | 功耗 | 适用场景 |
|---|---|---|---|---|
| 读取 | 客户端发起 | 需要响应 | 高 | 低频获取静态数据 |
| 写入 | 客户端发起 | 可选响应 | 中 | 配置参数修改 |
| 通知 | 服务器发起 | 无确认 | 低 | 高频传感器数据 |
| 指示 | 服务器发起 | 需要确认 | 中 | 关键事件通知 |
通知机制实现细节
WriteReq(0x2902, 0x0001))Handle Value NotificationGATT定义了完善的错误处理机制:
常见错误码
流控实现方案
资源受限设备优化
安全配置建议
高效发现策略
数据交互优化
常见问题诊断表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 无法发现服务 | 服务未正确注册 | 检查服务初始化代码 |
| 读取返回错误 | 特征值属性未设置可读 | 验证属性位掩码 |
| 通知不生效 | CCCD未正确写入 | 抓包检查CCCD写入流程 |
| 连接不稳定 | 参数配置不当 | 检查连接间隔和延迟 |
调试工具推荐
长特征值处理
Read Blob Request分片读取Prepare Write和Execute Write服务变更通知
特征值扩展属性
Characteristic Extended Properties描述符声明LE Coded PHY
2M PHY
LE Audio
复合设备模型
代理服务架构
面向服务架构(SOA)