GATT协议

gatt协议

协议将设备分为2种。client客户端和server服务端

客户端发送命令,请求,确认信息给服务端,读取和写入存储在服务端的特征值 (Characteristics )

服务端通过下图三种方式返回数据给客户端,设备包含由 GATT 客户端读取或写入的 Characteristic,每当客户端发送请求时,服务端就会接受并执行相应的请求。

区分三种行为:Notification、Indication 和 Response

类型 主动发起者 是否由服务端主动推送 是否需要客户端确认 通常用途
Notification 服务端 ✅ 是 ❌ 否 实时传感数据(如心率)
Indication 服务端 ✅ 是 ✅ 是 重要数据(如报警、状态变更)
Response 服务端 ❌ 否(被动响应) ✅ 是(回应客户端请求) 回应读写请求(如客户端 read

🔁 Notification(通知)

  • 服务端发送数据到客户端,无需等待回应
  • 速度快,但不保证送达
  • 客户端只需在 CCCD 写 0x0100 来启用

🔐 Indication(指示)

  • 服务端发送后 必须收到客户端确认(ACK)
  • 传输更可靠,但速度慢
  • 客户端在 CCCD 写 0x0200 启用

📨 Response(响应)

  • 是客户端执行命令(如 readwrite) 后,服务端对请求的回应
  • 不需要启用 CCCD,也不是推送,而是请求-响应模型
  • 例如:
    • gatttool --char-read -a 0x003e ← 客户端请求
    • 服务端返回:Characteristic value/descriptor: 01 02 03 ← 响应

类比理解:

行为 类比
Notification 服务端发广播,不管你有没有收到
Indication 服务端发快递,要求你签收
Response 你打电话问问题,对方回答你

image-20250504161246377

数据存在服务端(器),存储的数据的形式是profile(配置文件),在profile下有各种service(服务),service下有各种characteristic(特征),客户端可以发现和获取服务端的 ServiceCharacteristic,然后与之通信。Service 可以理解为一个功能集Characteristic 是双方通信的最小单元,是一个抽象功能单元

image-20250504161734198

数据格式

service

image-20250504162430813

Service Declaration(服务申明)

image-20250504162504445

Service include(服务包含)

image-20250504162558046

characteristic(特征)

  • UUID(Universally Unique Identifier):用于唯一标识Characteristic。
  • Properties(属性):指定了Characteristic的行为,例如读取、写入、通知等。
  • Value(值):存储Characteristic的当前值。
  • Descriptors(描述符):提供了关于Characteristic的更多信息,如读写权限、单位、格式等。

比如我现在的服务端是我的烧录了 BLECTFesp32 ,它由很多 Characteristic 组成

image-20250505153855691

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 ffUUID 的缩略

通过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 
posted @ 2025-05-10 14:25  Ma&0xFly  阅读(112)  评论(0)    收藏  举报