1. GATT协议基础:从BLE协议栈说起

做蓝牙开发这些年,我见过不少新手一上来就扎进GATT的代码里,结果被各种概念绕得晕头转向。其实,GATT没那么玄乎——它就是在BLE协议栈上搭的一套「数据交换规则」。今天咱们先把地基打牢。

1.1 BLE协议栈架构回顾

先看一张我手绘的协议栈分层图。你想想看,数据从手机APP传到蓝牙设备,中间要经过多少层?

BLE协议栈分层架构 APP层(Application) 用户业务逻辑、GATT服务定义 GATT层(Generic Attribute Profile) 数据交互规范、Service/Characteristic管理 ATT层(Attribute Protocol) 属性读写、通知、指示等原子操作 L2CAP层(逻辑链路控制与适配协议) 数据包分段/重组、多路复用 HCI层(主机控制器接口) 链路层(Link Layer)+ 物理层(PHY) 本章 重点

嗯,这里要注意——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定义了六种操作类型:

  1. Request / Response——Client发请求,Server必须回复。比如读特征值。
  2. Command——Client发命令,Server不需要回复。比如写特征值但不关心结果。
  3. Notification——Server主动通知Client,Client不需要确认。效率高,但可能丢包。
  4. Indication——Server主动指示Client,Client必须确认。可靠,但速度慢。
曾经踩过的坑:我在一个心率项目中用了Notification传数据,结果偶尔丢包导致心率曲线出现毛刺。后来改成Indication,虽然慢了一点,但数据完整了。对可靠性要求高的场景,别省那点确认开销。

1.5 本章小结

这一章我们理清了几个关键点:

  • BLE协议栈里,GATT和ATT是「上层建筑」,负责数据组织和传输。
  • GAP管连接,GATT管数据——分工明确。
  • GATT Server存数据,GATT Client读数据——角色不能搞反。
  • ATT用Handle、UUID、权限、值四个要素描述每个属性,操作方式有Request、Command、Notification、Indication四种。