GATT:GENERIC ATTRIBUTE PROFILE,通用属性协议
Service:服务
Characteristic:特征值
参考:Core_v5.0 vol 3 Part G
1. GATT概述
GATT基于属性协议,定义了一个以服务、特征为主要元素的服务框架,并定义了一套运行在服务框架上的服务过程,包括服务、特征以及特征描述的发现、读取、写入、通知、指示等。
(1)GATT依赖
(2)协议栈
(3)角色
- Server:服务器,接受来自客户端的命令和请求,向客户端发送响应、指示和通知。
- Client:客户端,向服务器发起命令和请求,接收来自服务器的响应、指示和通知。
- 简而言之,提供数据的设备为GATT服务器,访问GATT服务器获得数据的设备为GATT客户端。一个设备,既可以是GATT服务器,也可以是GATT客户端。
(4)GATT协议层次
-
层次图
◇◇ 顶层是一个基于GATT的profile,由满足某个使用场景的一个或多个服务构成。
◇◇ 服务由零个或多个特征或对其它服务的引用(include)构成。
◇◇ 特征包含一个value,还可能包含其它关于这个值的可选信息。 -
特征:是一种或多种属性的集合。特性是服务中使用的属性值、属性配置信息和描述符信息的封装。
(5)ATT协议
-
GATT服务器通过属性表的表格组织数据,这些数据表示真正传输的数据。GATT利用ATT协议来传输协议。
-
ATT PDU:
◇◇ Opcode:表示命令、请求、响应、指示、通知、确认、鉴权flag的opcode.
◇◇ Attribute Parameters :表示命令、请求、响应、指示、通知的值。
◇◇ Authentication Signature :可选 -
ATT由4部分组成:
◇◇ Attribute Handle: 属性句柄,表示属性在GATT表里的索引,在一个设备中每一个属性的句柄都是唯一的。
◇◇ Attribute Type:UUID,表示属性表中数据类型的信息,它是理解属性表中的值的每一个字节的意义的关键信息。在一个GATT表中可能有许多属性,这些属性能可能有相同的UUID。
◇◇ Attribute Value:数据。
◇◇ Attribute Permissions:表示可读、可写权限,由服务器决定。 -
Attribute Caching:用于缓存服务器属性信息,如属性句柄。
◇◇ 若服务器不支持服务属性句柄的变更(Service Changed characteristic ),如删除,增加、修改,可客户端只需要在第一次连接的时候执行discover 属性信息过程。
◇◇ 若服务器支持服务属性句柄的变更(Service Changed characteristic ),如删除,增加、修改,则一旦发生变更,当客户端重新连接时,服务器需要给客户端发送指示,告诉客户端属性信息发生了变更。 -
Attribute Grouping:GATT协议定义了3中属性类型的属性分组:Primary Service、Secondary Service、Characteristic。
2. 服务定义
服务定义:服务由服务定义来表征。一个服务定义包括:服务声明、引用定义和特征定义。引用定义和特征定义是可选的。
(1)服务声明
- 服务声明是服务定义的一部分,通过服务声明可以对服务进行分类。服务声明以属性为容器,包含属性句柄、属性类型、属性值和属性权限。
- 格式:
◇◇ 服务类型为主要服务和次要服务。主要服务表示设备基本功能,次要服务表示设备额外提供的功能。
(2)引用定义:当引用其它服务时,需要用到引用定义。其格式:
(3)特征定义:特征定义含特征声明、特征值声明和特征描述符声明。每个声明都是以属性格式存在的。
- 特征声明:
- 特征值声明:
- 特征描述符声明:
3. GATT功能
GATT定义了一系列服务操作程序,用来发现服务、特征以及服务之间的关系,用来读取和写入特征值。这些服务操作被抽象为11种功能。
(1)GATT功能及其子过程:
(2)配置服务器:交换MTU
(3)发现主服务:该过程用于发现服务器的主服务。一旦发现主服务,可以通过特征发现、关系发现等过程,获取主服务的辅助信息。
- 发现所有主服务
- 通过UUID发现主服务
(4)发现引用服务
(5)发现特征:该过程用于发现服务器的服务特征。一旦发现特征,可以通过其它过程获得辅助信息。
- 发现所有特征 & 通过UUID发现特征
(6)发现特征描述符
(7)读特征值
(8)写特征值
- Write Without Response
- Signed Write Without Response
- Write Characteristic Value
- Write Long Characteristic Values
(9)特征值通知
(10)特征值指示
(11)读特征描述符
(12)写特征描述符