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 在蓝牙协议栈中的位置如下所示:
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

相关推荐
lcxc2 小时前
Mac M4超流畅运行Win版同花顺教程
网络
三佛科技-134163842122 小时前
FT32F103系列与APM32F103,STM32F103之间的对比,能否替换?
单片机·嵌入式硬件·物联网·智能家居·pcb工艺
W.A委员会2 小时前
常见网络攻击
网络·http·网络安全
zmj3203242 小时前
CAN数据帧详解
网络·can·canfd·数据帧
李永奉2 小时前
杰理可视化SDK开发-蓝牙的可发现可连接和回连
单片机·嵌入式硬件·物联网·语音识别
无心水3 小时前
OpenClaw技术文档/代码评审/测试用例生成深度实战
网络·后端·架构·测试用例·openclaw·养龙虾
TechWayfarer3 小时前
攻防对抗:利用IP段归属查询工具快速封禁攻击源——3步联动防火墙(附脚本)
python·网络协议·tcp/ip·安全
深蓝海拓3 小时前
基于QtPy (PySide6) 的PLC-HMI工程项目(十)框架初成的阶段总结
网络·笔记·python·学习·ui·plc
白羊by4 小时前
Softmax 激活函数详解:从数学原理到应用场景
网络·人工智能·深度学习·算法·损失函数