ATT(Attribute Protocol,属性协议)和GATT(Generic Attribute Profile,通用属性规范)是蓝牙低功耗(BLE)技术中密切相关的两个核心协议,它们共同构成了BLE设备数据交换的基础。
1. ATT协议(Attribute Protocol)
基本概念
-
本质:底层传输协议
-
作用:定义客户端-服务器之间如何访问属性数据
-
特点:
-
轻量级设计(适合资源受限设备)
-
基于简单的请求-响应模型
-
使用16位句柄寻址属性
-
核心机制
-
属性结构:
-
句柄(Handle):0x0001-0xFFFF的唯一标识符
-
UUID(16位或128位):标识属性类型
-
值(Value):实际数据
-
权限(Permissions):控制访问方式
-
-
操作类型:
-
发现操作(Discover):查找属性
-
读取操作(Read):获取属性值
-
写入操作(Write):修改属性值
-
通知/指示(Notify/Indicate):服务器主动推送数据
-
2. GATT协议(Generic Attribute Profile)
基本概念
-
本质:建立在ATT之上的高级数据组织规范
-
作用:定义如何结构化地组织和使用ATT属性
-
特点:
-
定义了标准化的服务架构
-
提供预定义的服务和特征UUID
-
支持服务发现和特征配置
-
层次结构
GATT Profile ├── Service A (UUID) │ ├── Characteristic 1 (UUID) │ │ ├── Value │ │ ├── Descriptor (如CCC - Client Characteristic Configuration) │ ├── Characteristic 2 ├── Service B │ ├── Characteristic 3 ...
3. ATT与GATT的关系
对比维度 | ATT协议 | GATT协议 |
---|---|---|
协议层级 | 底层传输协议 | 上层应用规范 |
主要功能 | 提供基础属性访问机制 | 定义属性组织方式和标准服务 |
角色 | 只有Client/Server | 扩展为Client/Server/Publisher/Subscriber |
数据组织 | 扁平属性列表 | 层次化服务结构 |
UUID使用 | 仅作为属性类型标识 | 定义标准服务/特征UUID |
典型操作 | Read/Write/Notify基本操作 | 服务发现、特征配置等高级操作 |
4. 协同工作流程示例
以心率监测器为例:
-
服务发现(GATT层):
-
客户端发送
Primary Service Discovery
请求 -
服务器返回包含"心率服务"UUID的响应
-
-
特征发现(GATT层):
-
客户端在找到的服务中查找特征
-
发现"心率测量"特征及其属性句柄
-
-
启用通知(ATT层):
-
客户端写入CCC描述符(Client Characteristic Configuration)
-
使用ATT的
Write Request
操作
-
-
数据传输(ATT层):
-
服务器通过ATT
Handle Value Notification
推送心率数据 -
客户端接收并处理通知
-
5. 关键区别与联系
-
架构关系:
-
GATT完全构建在ATT之上
-
ATT是"如何传输",GATT是"传输什么及如何组织"
-
-
功能分工:
-
ATT负责:
-
属性寻址
-
基本CRUD操作
-
错误处理
-
-
GATT负责:
-
服务发现
-
特征属性解析
-
标准配置文件实现
-
-
-
实际应用:
-
开发者通常直接使用GATT API
-
ATT操作由协议栈内部处理
-
6. 典型应用场景
-
ATT直接使用场景:
-
自定义简单设备
-
需要极致精简协议栈的情况
-
私有数据交换
-
-
GATT标准应用场景:
-
健康设备(心率、血压)
-
智能家居设备
-
所有采用标准BLE服务的设备
-
7. 协议交互示例
ATT原始通信示例:
Client → Server: Read Request (Handle=0x0012) Server → Client: Read Response (Value=0x5A)
对应的GATT级操作:
// 应用层代码(如读取电池电量) ble_gattc_read(conn_handle, 0x0012, on_read_response);
ATT和GATT的组合实现了BLE设备间高效、灵活的数据交换,ATT提供了基础通信机制,而GATT在此基础上建立了标准化、可互操作的服务框架,二者协同工作使得BLE成为物联网应用的理想选择。