BLE 协议栈:ATT 协议详解
- 前言
- 一、定义
-
- [1、ATT 协议概述](#1、ATT 协议概述)
- [二、ATT 协议架构](#二、ATT 协议架构)
-
- 1、协议栈位置
- [2、ATT 协议组成](#2、ATT 协议组成)
- 三、客户端/服务器模型
- 四、属性数据库
- [五、ATT PDU 类型](#五、ATT PDU 类型)
-
- [1、PDU 分类](#1、PDU 分类)
- [2、请求 PDU](#2、请求 PDU)
- [3、响应 PDU](#3、响应 PDU)
- [4、命令 PDU](#4、命令 PDU)
- [5、通知/指示 PDU](#5、通知/指示 PDU)
- 6、错误响应
- 六、事务处理
- 七、命令队列
-
- 1、队列规则
- [2、Prepare Write 队列](#2、Prepare Write 队列)
- [八、MTU 交换](#八、MTU 交换)
-
- [1、MTU 交换流程](#1、MTU 交换流程)
- [2、MTU 参数](#2、MTU 参数)
- 九、权限检查
- 十、数据格式
-
- [1、ATT PDU 通用格式](#1、ATT PDU 通用格式)
- [2、Opcode 结构](#2、Opcode 结构)
- [十一、PDU 详解](#十一、PDU 详解)
- 十二、状态机
-
- [1、ATT 服务器状态机](#1、ATT 服务器状态机)
前言
ATT(Attribute Protocol,属性协议)是蓝牙核心规范中定义的核心协议之一,位于协议栈的「GATT」层之下、「L2CAP」层之上,专门负责属性数据的传输与管理。它采用经典的「客户端/服务器」模型,为蓝牙设备间的数据交互提供了规范化的操作框架,是低功耗蓝牙(BLE)数据交换不可或缺的基础协议。
一、定义
1、ATT 协议概述
中文名称:属性协议
英文名称:Attribute Protocol (ATT)
规范位置:Bluetooth Core Specification v5.2, Vol 3, Part F, Section 3
核心职责:
- 定义属性数据的传输机制,确保数据在客户端与服务器间可靠交换;
- 提供客户端/服务器交互模型,规范双方的角色与行为;
- 管理属性数据库的发现、读取、写入等操作,支持完整的服务发现流程;
- 支持通知和指示功能,实现服务器向客户端的异步数据推送。
前提条件:
- ATT 连接已建立(两端设备已建立蓝牙连接);
- L2CAP 通道已配置(逻辑通道已就绪);
- MTU 已交换(双方已协商最大传输单元)。
依赖关系:
- L2CAP 协议(Vol 3, Part A)------ 提供可靠的数据传输通道;
- GATT 配置文件(Vol 3, Part G)------ 基于 ATT 构建的上层应用框架。
二、ATT 协议架构
1、协议栈位置
ATT 在蓝牙协议栈中的位置如下所示:
Bluetooth 协议栈
应用层
GATT/应用
ATT
L2CAP
Link Layer
2、ATT 协议组成
ATT 协议由三大核心组件构成,各自承担不同职责,协同完成属性数据的传输与管理:
┌─────────────────────────────────────────────────────────────┐
│ ATT 协议架构 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 属性数据库 │ │
│ │ - Handle │ │
│ │ - Type (UUID) │ │
│ │ - Value │ │
│ │ - Permissions │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ATT 操作 │ │
│ │ - 请求/响应 │ │
│ │ - 命令 │ │
│ │ - 通知/指示 │ │
│ │ - 确认 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 事务管理 │ │
│ │ - 命令排队 │ │
│ │ - 超时处理 │ │
│ │ - 错误处理 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
三、客户端/服务器模型
1、角色定义
ATT 协议采用经典的「客户端/服务器」架构,双方职责明确:
| 角色 | 英文 | 职责 |
|---|---|---|
| ATT 服务器 | ATT Server | 存储和管理属性数据库,响应客户端请求 |
| ATT 客户端 | ATT Client | 访问和操作属性数据库,发起各类请求 |
2、角色与连接
ATT 请求
ATT 响应
通知
订阅
ATT Client
ATT Server
GATT Client
3、角色转换
在不同的连接阶段,设备的角色可能发生转换:
| 连接阶段 | GATT 客户端 | GATT 服务器 |
|---|---|---|
| 连接建立 | 发起方 | 接受方 |
| 服务发现 | 客户端 | 服务器 |
| 数据交换 | 双方均可 | 双方均可 |
| 断开连接 | 任意一方 | 任意一方 |
四、属性数据库
1、属性结构
ATT 服务器中的每一个属性由四个核心字段组成:
┌─────────────────────────────────────────────────────────────┐
│ 属性 (Attribute) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Handle (句柄) │ │
│ │ - 长度: 2 字节 │ │
│ │ - 范围: 0x0001-0xFFFF │ │
│ │ - 说明: 属性的唯一标识 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Type (类型) │ │
│ │ - 长度: 2 或 16 字节 │ │
│ │ - 格式: UUID-16 或 UUID-128 │ │
│ │ - 说明: 标识属性的语义 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Value (值) │ │
│ │ - 长度: 0-512 字节 (取决于 MTU) │ │
│ │ - 说明: 属性的实际数据 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Permissions (权限) │ │
│ │ - 访问权限 │ │
│ │ - 认证要求 │ │
│ │ - 授权要求 │ │
│ │ - 加密要求 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2、句柄 (Handle)
句柄是属性在服务器数据库中的唯一标识符:
| 属性 | 说明 |
|---|---|
| 句柄范围 | 0x0001 - 0xFFFF |
| 句柄 0x0000 | 无效句柄 |
| 句柄递增 | 句柄按顺序递增 |
| 句柄间隙 | 可能存在未使用的句柄 |
3、类型 (Type/UUID)
| UUID 类型 | 长度 | 说明 |
|---|---|---|
| UUID-16 | 2 字节 | 蓝牙 SIG 定义的标准 UUID |
| UUID-128 | 16 字节 | 厂商自定义 UUID |
4、权限类型
| 权限类型 | 说明 |
|---|---|
| 可读 | Read Permission |
| 可写 | Write Permission |
| 认证 | Authentication Required |
| 授权 | Authorization Required |
| 加密 | Encryption Required |
| 最小密钥长度 | Minimum Encryption Key Size |
五、ATT PDU 类型
1、PDU 分类
ATT PDU 按照功能和传输方向可分为五大类:
ATT PDU
请求/响应
命令
通知/指示
错误响应
Exchange MTU
发现类
读取类
写入类
Write Command
Signed Write
Notification
Indication
Error Response
2、请求 PDU
| Opcode | 请求名称 | 说明 |
|---|---|---|
| 0x02 | Exchange MTU Request | 交换 MTU |
| 0x04 | Find Information Request | 查找信息 |
| 0x06 | Find By Type Value Request | 按类型值查找 |
| 0x08 | Read By Type Request | 按类型读取 |
| 0x0A | Read Request | 读取 |
| 0x0C | Read Blob Request | 读取部分 |
| 0x0E | Read Multiple Request | 读取多个 |
| 0x10 | Read By Group Type Request | 按组读取 |
| 0x12 | Write Request | 写入 |
| 0x16 | Prepare Write Request | 准备写入 |
| 0x18 | Execute Write Request | 执行写入 |
3、响应 PDU
| Opcode | 响应名称 | 对应请求 |
|---|---|---|
| 0x03 | Exchange MTU Response | Exchange MTU Request |
| 0x05 | Find Information Response | Find Information Request |
| 0x07 | Find By Type Value Response | Find By Type Value Request |
| 0x09 | Read By Type Response | Read By Type Request |
| 0x0B | Read Response | Read Request |
| 0x0D | Read Blob Response | Read Blob Request |
| 0x0F | Read Multiple Response | Read Multiple Request |
| 0x11 | Read By Group Type Response | Read By Group Type Request |
| 0x13 | Write Response | Write Request |
| 0x17 | Prepare Write Response | Prepare Write Request |
| 0x19 | Execute Write Response | Execute Write Request |
4、命令 PDU
| Opcode | 命令名称 | 说明 |
|---|---|---|
| 0x52 | Write Command | 无响应写入 |
| 0xD2 | Signed Write Command | 签名写入 |
5、通知/指示 PDU
| Opcode | PDU 名称 | 说明 |
|---|---|---|
| 0x1B | Handle Value Notification | 值通知(无需确认) |
| 0x1D | Handle Value Indication | 值指示(需要确认) |
| 0x1E | Handle Value Confirmation | 值确认 |
6、错误响应
| Opcode | 名称 | 说明 |
|---|---|---|
| 0x01 | Error Response | 错误响应 |
六、事务处理
1、事务类型
ATT 协议支持四种不同的事务类型,各有不同的可靠性保证:
| 事务类型 | 说明 | 可靠性 |
|---|---|---|
| 请求/响应 | 客户端发起,服务器响应 | 可靠 |
| 命令 | 客户端发起,无响应 | 不可靠 |
| 通知 | 服务器发起,无确认 | 不可靠 |
| 指示 | 服务器发起,需要确认 | 可靠 |
2、请求-响应事务
Server Client Server Client 启动 Response Timeout 停止超时 Response Timeout 重试或放弃 alt [成功响应] [错误响应] [超时] Request PDU Success Response Error Response
3、指示-确认事务
Server Client Server Client 启动 Indication Timeout 确认收到 Handle Value Indication Handle Value Confirmation
4、事务超时
| 超时类型 | 默认值 | 说明 |
|---|---|---|
| Response Timeout | 30 秒 | 等待响应超时 |
| Indication Timeout | 30 秒 | 等待确认超时 |
七、命令队列
1、队列规则
| 规则 | 说明 |
|---|---|
| 顺序执行 | 命令按发送顺序执行 |
| 队列限制 | Prepare Write 队列有大小限制 |
| 队列清空 | Execute Write 执行或取消 |
2、Prepare Write 队列
Server Client Server Client 准备写入队列 队列: [Part 1] 队列: [Part 1, Part 2] 队列: [Part 1, Part 2, Part 3] 队列: [] 队列: [] alt [执行写入] [取消写入] Prepare Write Prepare Write Response Prepare Write Prepare Write Response Prepare Write Prepare Write Response Execute Write (Execute) Execute Write Response Execute Write (Cancel) Execute Write Response
八、MTU 交换
1、MTU 交换流程
Server Client Server Client 客户端 MTU = 512 clientRxMTU = 512 服务器 MTU = 517 serverRxMTU = 517 协商后 MTU = min(512, 517) = 512 Exchange MTU Request Exchange MTU Response
2、MTU 参数
| 参数 | 范围 | 默认值 | 说明 |
|---|---|---|---|
| LE MTU | 23-65535 | 23 | LE 连接的 MTU |
| BR/EDR MTU | 48-65535 | 48 | BR/EDR 连接的 MTU |
九、权限检查
1、权限检查流程
读取
是
否
是
否
是
否
写入
是
否
是
否
是
否
收到请求
权限检查
可读?
需要认证?
返回错误
已认证?
执行读取
可写?
需要认证?
已认证?
执行写入
2、权限级别
| 级别 | 缩写 | 说明 |
|---|---|---|
| Open | - | 无限制 |
| Authentication Required | AUTH | 需要认证 |
| Authorization Required | AUTH +/AUZ | 需要授权 |
| Encryption Required | ENC | 需要加密 |
十、数据格式
1、ATT PDU 通用格式
┌─────────────────────────────────────────────────────────────┐
│ ATT PDU │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Opcode (1 字节) │ │
│ │ - 长度: 1 字节 │ │
│ │ - 说明: 命令类型标识 │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Parameters (可变) │ │
│ │ - 长度: 取决于 Opcode │ │
│ │ - 内容: 操作特定参数 │ │
│ └──────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
2、Opcode 结构
┌─────────────────────────────────────────────────────────────┐
│ Opcode 结构 │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Bit 7 │ Bit 6 │ Bits 5-0 │ │
│ │ (Command) │ (Auth Sig) │ (Method) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
│ Bit 7: Command Flag │
│ - 0: 请求/响应/通知/指示 │
│ - 1: 命令 │
│ │
│ Bit 6: Authentication Signature Flag │
│ - 0: 无认证签名 │
│ - 1: 包含认证签名 │
│ │
│ Bits 5-0: Method │
│ - 操作方法代码 │
└─────────────────────────────────────────────────────────────┘
十一、PDU 详解
1、Exchange MTU
Request
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x02 (1 字节) │
│ Client Rx MTU = 客户端最大接收 MTU (2 字节) │
└─────────────────────────────────────────────────────────────┘
Response
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x03 (1 字节) │
│ Server Rx MTU = 服务器最大接收 MTU (2 字节) │
└─────────────────────────────────────────────────────────────┘
2、Find Information
Request
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x04 (1 字节) │
│ Starting Handle = 起始句柄 (2 字节) │
│ Ending Handle = 结束句柄 (2 字节) │
└─────────────────────────────────────────────────────────────┘
Response
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x05 (1 字节) │
│ Format = 格式标识 (1 字节) │
│ │ 0x01: UUID-16 │
│ │ 0x02: UUID-128 │
│ Information Data = 信息数据 (可变) │
└─────────────────────────────────────────────────────────────┘
3、Read Request
Request
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x0A (1 字节) │
│ Handle = 属性句柄 (2 字节) │
└─────────────────────────────────────────────────────────────┘
Response
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x0B (1 字节) │
│ Value = 属性值 (可变) │
└─────────────────────────────────────────────────────────────┘
4、Write Request
Request
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x12 (1 字节) │
│ Handle = 属性句柄 (2 字节) │
│ Value = 属性值 (可变) │
└─────────────────────────────────────────────────────────────┘
Response
┌─────────────────────────────────────────────────────────────┐
│ Opcode = 0x13 (1 字节) │
└─────────────────────────────────────────────────────────────┘
十二、状态机
1、ATT 服务器状态机
初始化
连接建立
收到请求
请求完成
发送指示
收到确认
连接断开
连接断开
Idle
Ready
Processing
Busy