1. GATT协议基础:从BLE协议栈说起
做蓝牙开发这些年,我见过不少新手一上来就扎进GATT的代码里,结果被各种概念绕得晕头转向。其实,GATT没那么玄乎——它就是在BLE协议栈上搭的一套「数据交换规则」。今天咱们先把地基打牢。
1.1 BLE协议栈架构回顾
先看一张我手绘的协议栈分层图。你想想看,数据从手机APP传到蓝牙设备,中间要经过多少层?
嗯,这里要注意——GATT和ATT是紧挨着的两层。GATT管「怎么组织数据」,ATT管「怎么传输数据」。我早期做项目时总把这两层混为一谈,后来踩了坑才分清楚。
1.2 GATT与GAP的区别
很多初学者会问:GATT和GAP到底有啥不同?我用一句话概括:
- GAP(Generic Access Profile)——管「连接」的。广播、扫描、建立连接、断开连接,都是GAP的事。
- GATT(Generic Attribute Profile)——管「数据」的。连接建立之后,怎么读写数据、怎么通知,归GATT管。
说白了,GAP是「怎么连上」,GATT是「连上之后怎么聊」。
| 对比维度 | GAP | GATT |
|---|---|---|
| 核心职责 | 设备发现、连接建立 | 数据交互、服务发现 |
| 工作阶段 | 连接前 + 连接中 | 连接建立后 |
| 角色 | Central / Peripheral | GATT Client / GATT Server |
| 典型操作 | 广播、扫描、连接参数更新 | 读特征值、写特征值、通知 |
| 我遇到过的坑 | 连接参数协商不当导致断连 | 特征值权限配置错误导致读写失败 |
个人经验:调试时如果设备连不上,先查GAP;连上了但读不到数据,再查GATT。这个排查顺序能省一半时间。
1.3 GATT的角色:Server与Client
GATT定义了两种角色:
- GATT Server——持有数据的一方。比如一个温度传感器,它内部存着温度值,等着别人来读。
- GATT Client——发起读写请求的一方。比如手机APP,它向传感器发请求,读取温度值。
注意,一个设备可以同时是Server和Client。我在做智能家居网关时,网关对传感器是Client(读数据),对手机APP又是Server(提供数据)。这种「双重身份」很常见。
核心原则:数据永远在Server上,操作由Client发起。
举个例子——你手机连上蓝牙手环,手环是Server(存着心率数据),手机是Client(发起读心率请求)。手环不会主动把数据「推」给手机,而是手机先「拉」,手环再响应。
1.4 Attribute Protocol基础
ATT是GATT的「翻译官」。GATT定义了一个Service里有哪些Characteristic,每个Characteristic有哪些属性;ATT则负责把这些属性打包成一个个「Attribute」,然后通过读写、通知等操作来传输。
每个Attribute由四个要素组成:
| 要素 | 说明 | 我踩过的坑 |
|---|---|---|
| Attribute Handle | 属性的唯一句柄(0x0001~0xFFFF) | 句柄重复会导致服务发现失败 |
| Attribute Type | 用UUID标识(16位/128位) | 自定义服务一定要用128位UUID,别用16位的 |
| Attribute Permissions | 读/写/加密/认证等权限 | 权限设得太松有安全风险,太紧又连不上 |
| Attribute Value | 实际数据内容(最长512字节) | 超过MTU的数据要分包,否则会丢 |
ATT定义了六种操作类型:
- Request / Response——Client发请求,Server必须回复。比如读特征值。
- Command——Client发命令,Server不需要回复。比如写特征值但不关心结果。
- Notification——Server主动通知Client,Client不需要确认。效率高,但可能丢包。
- Indication——Server主动指示Client,Client必须确认。可靠,但速度慢。
曾经踩过的坑:我在一个心率项目中用了Notification传数据,结果偶尔丢包导致心率曲线出现毛刺。后来改成Indication,虽然慢了一点,但数据完整了。对可靠性要求高的场景,别省那点确认开销。
1.5 本章小结
这一章我们理清了几个关键点:
- BLE协议栈里,GATT和ATT是「上层建筑」,负责数据组织和传输。
- GAP管连接,GATT管数据——分工明确。
- GATT Server存数据,GATT Client读数据——角色不能搞反。
- ATT用Handle、UUID、权限、值四个要素描述每个属性,操作方式有Request、Command、Notification、Indication四种。