BLE 协议栈:ATT 协议详解
·
BLE 协议栈: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 在蓝牙协议栈中的位置如下所示:
2、ATT 协议组成
ATT 协议由三大核心组件构成,各自承担不同职责,协同完成属性数据的传输与管理:
┌─────────────────────────────────────────────────────────────┐
│ ATT 协议架构 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 属性数据库 │ │
│ │ - Handle │ │
│ │ - Type (UUID) │ │
│ │ - Value │ │
│ │ - Permissions │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ ATT 操作 │ │
│ │ - 请求/响应 │ │
│ │ - 命令 │ │
│ │ - 通知/指示 │ │
│ │ - 确认 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 事务管理 │ │
│ │ - 命令排队 │ │
│ │ - 超时处理 │ │
│ │ - 错误处理 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
三、客户端/服务器模型
1、角色定义
ATT 协议采用经典的「客户端/服务器」架构,双方职责明确:
| 角色 | 英文 | 职责 |
|---|---|---|
| ATT 服务器 | ATT Server | 存储和管理属性数据库,响应客户端请求 |
| ATT 客户端 | ATT Client | 访问和操作属性数据库,发起各类请求 |
2、角色与连接
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 按照功能和传输方向可分为五大类:
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、请求-响应事务
3、指示-确认事务
4、事务超时
| 超时类型 | 默认值 | 说明 |
|---|---|---|
| Response Timeout | 30 秒 | 等待响应超时 |
| Indication Timeout | 30 秒 | 等待确认超时 |
七、命令队列
1、队列规则
| 规则 | 说明 |
|---|---|
| 顺序执行 | 命令按发送顺序执行 |
| 队列限制 | Prepare Write 队列有大小限制 |
| 队列清空 | Execute Write 执行或取消 |
2、Prepare Write 队列
八、MTU 交换
1、MTU 交换流程
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 服务器状态机
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)