GATT协议
gatt协议
协议将设备分为2种。client客户端和server服务端
客户端发送命令,请求,确认信息给服务端,读取和写入存储在服务端的特征值 (Characteristics )
服务端通过下图三种方式返回数据给客户端,设备包含由 GATT
客户端读取或写入的 Characteristic
,每当客户端发送请求时,服务端就会接受并执行相应的请求。
区分三种行为:Notification、Indication 和 Response
类型 | 主动发起者 | 是否由服务端主动推送 | 是否需要客户端确认 | 通常用途 |
---|---|---|---|---|
Notification | 服务端 | ✅ 是 | ❌ 否 | 实时传感数据(如心率) |
Indication | 服务端 | ✅ 是 | ✅ 是 | 重要数据(如报警、状态变更) |
Response | 服务端 | ❌ 否(被动响应) | ✅ 是(回应客户端请求) | 回应读写请求(如客户端 read ) |
🔁 Notification(通知)
- 服务端发送数据到客户端,无需等待回应
- 速度快,但不保证送达
- 客户端只需在 CCCD 写
0x0100
来启用
🔐 Indication(指示)
- 服务端发送后 必须收到客户端确认(ACK)
- 传输更可靠,但速度慢
- 客户端在 CCCD 写
0x0200
启用
📨 Response(响应)
- 是客户端执行命令(如
read
或write
) 后,服务端对请求的回应 - 不需要启用 CCCD,也不是推送,而是请求-响应模型
- 例如:
gatttool --char-read -a 0x003e
← 客户端请求- 服务端返回:
Characteristic value/descriptor: 01 02 03
← 响应
类比理解:
行为 | 类比 |
---|---|
Notification | 服务端发广播,不管你有没有收到 |
Indication | 服务端发快递,要求你签收 |
Response | 你打电话问问题,对方回答你 |
数据存在服务端(器),存储的数据的形式是profile(配置文件),在profile下有各种service(服务),service下有各种characteristic(特征),客户端可以发现和获取服务端的 Service
和 Characteristic
,然后与之通信。Service
可以理解为一个功能集Characteristic
是双方通信的最小单元,是一个抽象功能单元
数据格式
service
Service Declaration(服务申明)
Service include(服务包含)
characteristic(特征)
- UUID(Universally Unique Identifier):用于唯一标识Characteristic。
- Properties(属性):指定了Characteristic的行为,例如读取、写入、通知等。
- Value(值):存储Characteristic的当前值。
- Descriptors(描述符):提供了关于Characteristic的更多信息,如读写权限、单位、格式等。
比如我现在的服务端是我的烧录了 BLECTF
的 esp32
,它由很多 Characteristic
组成
handle
是特征的句柄,char properties
是特征的属性,char value handle
是特征值的句柄,uuid
是特征的通用唯一标识符
句柄是一个简单的地址索引,用于定位某个 Attribute(属性)在 GATT 表中的位置。
拿着为0x45的 handle
举例
handle = 0x0045, char properties = 0x1a, char value handle = 0x0046, uuid = 0000ff0f-0000-1000-8000-00805f9b34fb
┌──(kali㉿kali)-[~]
└─$ gatttool -b 2C:BC:BB:0B:DC:82 --char-read --handle=0x45
Characteristic value/descriptor: 1a 46 00 0f ff
1a
就是特征属性,代表权限
46
是这个特征的特征值的句柄 ,我们可以通过其去查看这个特征的描述
00 0f ff
是 UUID
的缩略
通过0x46的 handle
去读取 Value/Descriptor
,得到的就是这个特征的描述
┌──(kali㉿kali)-[~]
└─$ gatttool -b 2C:BC:BB:0B:DC:82 --char-read --handle=0x46
Characteristic value/descriptor: 4c 69 73 74 65 6e 20 74 6f 20 6d 65 20 66 6f 72 20 6d 75 6c 74 69 20 6e 6f 74 69 66 69 63 61 74 69 6f 6e 73