文章目录
-
- GATT
-
- [Configuration and Roles](#Configuration and Roles)
- [GATT Profile Hierarchy](#GATT Profile Hierarchy)
- Service
-
- [Service Declaration](#Service Declaration)
- [Service Include](#Service Include)
-
- [Include Declaration](#Include Declaration)
- Characteristic
-
- [Characteristic Declaration](#Characteristic Declaration)
- [Characteristic Value Declaration](#Characteristic Value Declaration)
- [Characteristic Descriptor Declarations](#Characteristic Descriptor Declarations)
-
- [Characteristic Extended Properties](#Characteristic Extended Properties)
- [Characteristic User Description](#Characteristic User Description)
- [Client Characteristic Configuration](#Client Characteristic Configuration)
- [Server Characteristic Configuration](#Server Characteristic Configuration)
- [Characteristic Presentation Format](#Characteristic Presentation Format)
- [Characteristic Aggregate Format](#Characteristic Aggregate Format)
- [GATT Profile Attribute Types](#GATT Profile Attribute Types)
- [GATT Send Command](#GATT Send Command)
摘要:这篇博文介绍了 GATT(通用属性配置文件)的相关内容,主要包括 GATT 和 ATT 的关系,GATT 的配置和角色,GATT 配置文件的层次结构,以及服务和特性的定义,同时描述了特性声明、特性值声明和特性描述符的结构和作用
参考资料:《Bluetooth Core Specification v5.0》
《Supplement to the Bluetooth Core Specification》
《蓝牙 API - ESP32 --- ESP-IDF 编程指南 latest 文档》
GATT
关于 GAP 在蓝牙协议栈中的作用,见ESP32学习笔记_Bluetooth(1)------蓝牙技术与 BLE 通信机制简介中的 Core Architecture 部分
这部分的原文,详见: 《Bluetooth Core Specification v5.0》Vol3 PartD
通用属性配置文件(Generic Attribute Profile,GATT)通过使用属性协议(Attribute Protocol)定义了一个服务框架,该框架定义了服务及其特性的程序和格式,所定义的程序包括发现、读取、写入、通知和指示特性,以及配置特性广播
ATT 与 GATT 的关系
ATT 提供了一个基础的传输框架和操作机制(例如,读取、写入和通知),而 GATT 则是 ATT 的上层协议,定义了如何组织这些属性,使得设备能够通过结构化的方式进行通信
- GATT 提供了一套服务(services)和特征(characteristics)的规范,指导如何通过 ATT 协议进行数据交换
- GATT 使用 ATT 协议的读、写和通知操作来访问设备的属性
ATT 是 GATT 的数据传输载体,而 GATT 是 ATT 的应用框架,二者结合为蓝牙低功耗设备的通信提供了完整的协议支持
Configuration and Roles
GATT 将蓝牙设备分为两种:
Client 客户端
发起 命令和请求的设备,向服务器发送命令并接收服务器发送的响应、指示和通知Server 服务端
接受 来自客户端的命令和请求的设备,并向客户端发送响应、指示和通知- 这些角色不是固定分配给设备的,角色是在设备发起定义的程序时确定的,并在程序结束时释放
此配置文件涵盖以下场景:
- 配置交换
- 设备上服务和特性的发现
- 读取特性值
- 写入特性值
- 特性值通知
- 特性值指示
数据以 profile(配置文件)的形式存储在服务端
GATT 配置文件指定了配置文件数据交换的结构 ,该结构定义了配置文件中使用的基本元素 ,如服务(Service)和特性(Characteristic);所有这些元素都包含在属性中 ,属性协议中使用的属性是承载配置文件数据的容器
层次结构的顶层是配置文件 ,配置文件由一个或多个服务组成,这些服务是为了实现某个使用场景所必需的,一个服务由特性或对其他服务的引用组成;每个特性包含一个值,并且可能包含关于该值的可选信息
GATT Profile Hierarchy
GATT 配置文件的基本结构如下
Profile 配置文件
配置文件是最高层次,通常由一个或多个服务组成 ,它定义了完成某个特定使用场景所必需的所有元素Service 服务
服务由一个或多个特性组成 ,并且可能包含对其他服务的引用; 服务是一个逻辑集合,用于组织和管理特性;在 GATT 配置文件中,服务是为了满足特定功能需求而设计的Characteristic 特性
特性是服务的基本组成部分,每个特性通常包含一个值,并且可能包含与该值相关的描述符(如用户描述符、客户端配置描述符等);这些特性承载着实际的配置文件数据Descriptor 描述符
描述符是与特性相关的附加信息,用于进一步解释特性的值或控制特性的行为,常见的描述符包括用户描述符、客户端配置描述符等

GATT Profile 文件层次结构
图源:《Bluetooth Core Specification v5.0》
Service
服务是一组数据和相关行为的集合,用于实现特定的功能或特性,在 GATT 中,服务由其服务定义(service definition)来定义
服务定义可以包含
- 引用的服务
- 必需的特性
- 可选的特性
为了保持与早期客户端的向后兼容,服务定义的后续版本只能添加新的引用服务或可选特性,不能修改以前版本中的行为
Primary Service 主服务
是暴露设备主要功能的服务 ,主服务可以被其他服务包含 ,并且可以通过主服务发现程序进行发现Secondary Service 次服务
仅用于从主服务、另一个次服务或其他更高层规范中引用,次服务只在引用它的实体的上下文中相关
是否将一个服务定义为主服务或次服务,可能由更高层的规范进行规定,服务可以在一个或多个更高层的规范中使用,以实现特定的使用场景
Service 数据结构
- Service Declaration
- Service Include
- Characteristic 01
- Characteristic xx
特点
- 服务定义在下一个服务声明之前结束,或者在达到最大属性句柄时结束;服务定义在服务器上按属性句柄的顺序出现
- 服务定义必须包含一个服务声明(Service Declaration),并且可以包含包含定义和特性定义
- 服务定义中包含的所有包含定义和特性定义都视为服务的一部分 ,所有包含定义必须紧跟在服务声明之后,并且在任何特性定义之前
- 所有特性定义必须紧跟在最后一个包含定义之后,如果没有包含定义,则紧跟在服务声明之后
- 一个服务定义可以有零个或多个包含定义和特性定义,包含定义和特性定义没有上限
- 服务器上的所有属性要么包含服务声明,要么存在于服务定义内
- 服务器中包含的服务定义可以按任意顺序出现,客户端不应假设服务器上服务定义的顺序
所有的定义均以属性 Attribute (ATT 属性协议)的形式存在,内容包括
Attribute Handle 属性句柄
2 OctetsAttribute Type 属性类型
2 or 16 OctetsAttribute Value 属性值
variable lengthAttribute Permissions 属性权限
implementation specific(工具自定义)
Service Declaration
服务声明是一个属性(Attribute),
Attribute Type 属性类型
设置为 Primary Service 主服务 或 Secondary Service 次服务 的 UUIDAttribute Value 属性值
应为服务的 16 位Bluetooth UUID或 128 位 UUID (参见<Assigned_Numbers.pdf>),称为服务 UUID,客户端必须支持 16 位和 128 位 UUID 的使用 ,客户端可以忽略任何具有未知服务 UUID 的服务定义(未知服务 UUID 是指不支持的服务的 UUID)Attribute Permission 属性权限
应为只读,并且不要求身份验证或授权
UUID(通用唯一标识符) 是一种 128 位的标识符,广泛用于标识不同的对象、服务或数据元素,确保它们在全球范围内的唯一性
在蓝牙技术中,UUID 被用于区分和标识不同的服务、特性和描述符
UUID 可以是 16 位或 128 位格式,其中 16 位 UUID 常用于标准服务,而 128 位 UUID 通常用于自定义服务,UUID 的使用确保了设备间的兼容性和通信的准确性
Bluetooth UUID 是一种特定于蓝牙协议的 UUID ,用于标识蓝牙设备中的服务、特性和描述符。与通用的 UUID (通用唯一标识符)相比,Bluetooth UUID 通常采用 16 位 、32 位 或 128 位 格式,其中 16 位 UUID 用于标准蓝牙服务

服务声明结构
图源:《Bluetooth Core Specification v5.0》
当存在多个服务时,使用不同位数 UUID 的服务定义应当分组在一起(使用 16 位 Bluetooth UUID 的服务定义分组在一起(即按顺序列出),使用 128 位 UUID 的服务定义分组在一起)
一个设备或更高层规范可以有多个服务定义,且可以有多个服务定义使用相同的服务 UUID
Service Include
包含服务是一种将服务器上存在的另一个服务定义引用到当前定义的服务中的方法
要包含另一个服务,在服务定义的开始部分使用包含定义(include definition)
特点
- 通过包含定义引用的服务的整个服务定义将成为新服务定义的一部分 ,这包括所有包含的服务和该服务的特性
- 被包含的服务仍然是独立的服务
- 一个被包含的服务不应因包含或包含的服务而被修改 ,服务定义中对包含定义或嵌套包含的数量没有限制
Include Declaration
一个 包含定义(include definition) 应仅包含一个包含声明(include declaration)
Attribute Type
设置为 Include 的 UUIDAttribute Value
- 包含服务的属性句柄
- 结束组句柄(每个服务或服务的一部分都有一个 开始句柄(Start Handle,即 Attribute Handle) 和 结束句柄(End Handle),它们定义了服务的范围)
- 所包含服务的 UUID
Attribute Permission
应为只读,并且不要求身份验证或授权

包含声明结构
图源:《Bluetooth Core Specification v5.0》
当 UUID 是 16 位 Bluetooth UUID 时,服务 UUID 必须被直接指定
GATT(Generic Attribute Profile) 中,当一个服务使用 16 位 Bluetooth UUID 时,服务 UUID 必须在服务的定义中明确指定
在某些情况下,如某些包含(Include)服务,UUID 可能通过引用的其他服务的 Attribute Handle 来隐式获得 ,但这并不等同于"未指定"UUID
服务定义中的包含声明不能指向自己,这适用于包含定义引用的每个服务(这被称为 循环引用(circular reference));如果客户端检测到循环引用或检测到嵌套包含声明超过其预期的层次,客户端应终止 ATT 承载通道(ATT Bearer)
Characteristic
特性是服务中使用的值,伴随有关于如何访问该值的属性和配置信息 ,以及关于如何显示或表示该值的信息
一个特性定义(Characteristic Definition)应包含
- 特性声明(Characteristic Declaration)
- 特性值声明(Characteristic Value Declaration)
并且可能包含
- 特性描述符声明(Characteristic Descriptor Declarations)
特点
- 特性值声明应紧随其后放置在特性声明之后,任何可选的特性描述符声明应放置在特性值声明之后,可选的特性描述符声明的顺序没有限制
- 特性定义的结束位置是下一个特性声明、服务声明的开始,或者是最大 Attribute Handle,特性定义在服务器的服务定义中按 Attribute Handle 顺序出现
- 特性定义可以通过将多个特性值合并为一个单独的聚合特性值来进行定义 ,这可以用于通过读取和写入单个聚合特性值来优化多个特性值的读取和写入;这类特性定义与普通的特性定义相同 ,特性声明应使用唯一的特性 UUID 来标识该聚合特性定义 ;聚合特性定义还可以包含一个特性聚合格式描述符,用于描述聚合特性值的显示格式
Characteristic Declaration
一个 特性声明(Characteristic Declaration) 是一个 Attribute
Attribute Type
设置为特性的 UUIDAttribute Value
- 特性属性(Characteristic Properties)
- 特性值属性句柄(Characteristic Value Attribute Handle)
- 特性 UUID
Attribute Permission
应为可读,并且不要求身份验证或授权
特性声明的 Attribute Value 在服务器与任何客户端建立信任关系时不得更改

特征声明结构
图源:《Bluetooth Core Specification v5.0》
Attribute Value
Attribute Value | Size | Description |
---|---|---|
Characteristic Properties | 1 octets(1 个 8 位数据) | 特性属性的位域 |
Characteristic Value Handle | 2 octets | 包含此特性值的属性的句柄 |
Characteristic UUID | 2 or 16 octets | 16 位 Bluetooth UUID 或 128 位 UUID,用于特性值 |
一个服务可以有多个具有相同特征 UUID 的特征定义
在服务定义中,某些特征可能是必需的,这些特性应位于包含声明(include declarations)之后、任何可选特性之前
客户端不应假设服务定义中必需特性或可选特性的顺序
尽可能地,并且在前述要求范围内,使用 16 位 Bluetooth UUID 的特性声明应当按顺序分组在一起(即按顺序列出),而使用 128 位 UUID 的特性声明应当分组在一起
Characteristic Properties
特性属性位域(Characteristic Properties)决定了特性值如何使用,或者如何访问特性描述符,可以设置多个 特性属性
这些位应根据该特性所允许的程序进行设置,并由更高层规范定义,而不考虑安全要求
Properties | Value | 描述 |
---|---|---|
Broadcast | 0x01 | 如果设置,则允许使用服务器特性配置描述符广播特性值 如果设置,必须存在服务器特性配置描述符 |
Read | 0x02 | 如果设置,则允许使用第 4.8 节中定义的程序读取特性值 |
Write Without Response | 0x04 | 如果设置,则允许使用第 4.9.1 节中定义的程序写入特性值且不要求响应 |
Write | 0x08 | 如果设置,则允许使用第 4.9.3 或第 4.9.4 节中定义的程序写入特性值并要求响应 |
Notify | 0x10 | 如果设置,则允许在没有确认的情况下使用第 4.10 节中定义的程序通知特性值 如果设置,则必须存在客户端特性配置描述符 |
Indicate | 0x20 | 如果设置,则允许在有确认的情况下使用第 4.11 节中定义的程序指示特性值 如果设置,则必须存在客户端特性配置描述符 |
Authenticated Signed Writes | 0x40 | 如果设置,则允许使用第 4.9.2 节中定义的程序向特性值写入签名 |
Extended Properties | 0x80 | 如果设置,则在第 3.3.3.1 节中定义的特性扩展属性描述符中定义附加特性属性 如果设置,则必须存在特性扩展属性描述符 |
见《Bluetooth Core Specification v5.0》 P2236
Characteristic Value Handle
特性值属性句柄字段(Characteristic Value Attribute Handle) 是指包含特性值(Characteristic Value) 的属性的属性句柄(Attribute Handle)
Characteristic UUID
特性 UUID 字段 是一个 16 位 Bluetooth UUID 或 128 位 UUID,用于描述特性值(Characteristic Value) 的类型。客户端必须支持使用 16 位 和 128 位 特性 UUID
如果客户端遇到一个具有未知 特性 UUID 的特性定义(不支持的特性所使用的 UUID),可以忽略该特性
Characteristic Value Declaration
特性值声明(Characteristic Value Declaration) 包含特性值,它是特性声明之后的第一个属性,所有特性定义必须具有特性值声明
特性值声明是一个 Attribute
Attribute Type
设置为在特性声明中使用的 16 位 Bluetooth UUID 或 128 位 UUID,用于标识特性值Attribute Value
设置为特性值Attribute Permissions
由服务指定,或者如果没有特别指定,则可以由实现决定

特征值声明结构
图源:《Bluetooth Core Specification v5.0》
Characteristic Descriptor Declarations
特性描述符(Characteristic Descriptors)用于包含与特性值(Characteristic Value)相关的信息
GATT 配置文件定义了一组标准的特性描述符 ,可以供更高层配置文件使用,更高层的配置文件可能会定义额外的特性描述符,这些描述符是特定于该配置文件的
每个特性描述符由特性描述符 UUID 标识,客户端必须支持使用 16 位 和 128 位 特性描述符 UUID;如果客户端遇到一个具有未知特性描述符 UUID 的特性描述符声明,可以忽略该描述符
如果特性描述符存在于特性定义中,它们应跟随特性值声明之后 ;特性描述符声明可以按任意顺序出现在特性定义中,客户端不应假设特性描述符声明在特性值声明之后的顺序
特性描述符声明的权限由更高层的配置文件定义,或者如果未指定,则由实现决定
客户端不应假设所有的特性描述符声明都是可读的
Characteristic Extended Properties
特性扩展属性(Characteristic Extended Properties)声明是一个描述符,用于定义附加的特性属性;如果特性属性中的扩展属性位被设置,则该特性描述符必须存在
在一个特性定义中只能有一个特性扩展属性声明
特性描述符包含在一个 Attribute 中
Attribute Type
应设置为 "特性扩展属性(Characteristic Extended Properties)" 的 UUIDAttribute Value
应设置为特性扩展属性位域(Characteristic Extended Properties Bit Field)Attribute Permissions
应为可读,不需要身份验证和授权

特征扩展属性结构
图源:《Bluetooth Core Specification v5.0》
特性扩展属性位域描述了如何使用特性值(Characteristic Value) 或如何访问特性描述符
如果表中定义的位被设置,则表示允许执行相应的操作;可以设置多个 特性属性
Properties | Value | Description |
---|---|---|
Reliable Write | 0x0001 | 如果设置,则允许使用第 4.9.5 节中定义的程序进行可靠的特性值写入 |
Writable Auxiliaries | 0x0002 | 如果设置,则允许写入第 3.3.3.2 节中定义的特性描述符 |
Reserved for Future Use | 0xFFFC | 保留供未来使用 |
Characteristic User Description
特性用户描述(Characteristic User Description) 声明是一个可选的特性描述符,用于定义一个可变大小的 UTF-8 字符串,它是对特性值(Characteristic Value) 的用户文本描述;如果特性属性(Characteristic Properties) 中的可写辅助位(Writable Auxiliary) 被设置,则该特性描述符可以被写入
在一个特性定义中只能有一个特性用户描述声明
特性描述符包含在一个 Attribute 中
Attribute Type
应设置为 "特性用户描述(Characteristic User Description)" 的 UUIDAttribute Value
应设置为特性用户描述的 UTF-8 字符串Attribute Permissions
由配置文件指定,或者如果未特别指定,则可以由实现决定

特征用户描述结构
图源:《Bluetooth Core Specification v5.0》
Client Characteristic Configuration
客户端特性配置(Client Characteristic Configuration) 声明是一个可选的特性描述符,用于定义特性如何由特定客户端进行配置
客户端特性配置描述符的值应在已配对设备之间的连接中保持持久性;在与非配对设备的每次连接中,客户端特性配置描述符的值应设置为默认值
该特性描述符值是一个 位域(bit field),当某个位被设置时,相应的操作将被启用,否则将不使用
在一个特性定义中只能有一个客户端特性配置声明
客户端可以写入此配置描述符来控制服务器上该特性的配置,每个客户端都有自己独立的客户端特性配置 实例,读取客户端特性配置仅显示该客户端的配置,写入仅影响该客户端的配置
写入配置描述符时,服务器可能需要身份验证和授权
客户端特性配置声明应为可读和可写,该特性描述符包含在一个 Attribute 中
Attribute Type
应设置为 "客户端特性配置(Client Characteristic Configuration)" 的 UUIDAttribute Value
应设置为特性描述符值Attribute Permissions
由配置文件指定,或如果未特别指定,则可以由实现决定

客户端特性配置结构
图源:《Bluetooth Core Specification v5.0》
客户端特性配置位定义
Configuration | Value | Description |
---|---|---|
Notification | 0x0001 | 特性值将被通知。只有在特性属性设置了通知位时,此值才可以设置 |
Indication | 0x0002 | 特性值将被指示。只有在特性属性设置了指示位时,此值才可以设置 |
Reserved for Future Use | 0xFFFC | 保留供未来使用 |
- 客户端特性配置描述符值 的默认值应为 0x0000
- 如果 GATT 服务器 支持来自同一设备的多个 ATT 承载通道(ATT bearers),则每个 ATT 承载通道应视为具有独立的 GATT 客户端实例,因此,每个 GATT 客户端应拥有独立的 客户端特性配置
Notification 通知
是一种无确认的数据传输方式,服务器发送数据后无需等待客户端的响应;这使得通知在需要高效、频繁更新数据的场景中非常适用,但不能保证数据已经被客户端成功接收
Indication 指示
则是一种有确认的传输方式,服务器发送数据后会等待客户端的确认响应;这确保了客户端已经成功接收数据,因此适用于那些需要可靠传输和确保数据到达的场景,但相较通知,指示会增加一定的延迟和开销
Server Characteristic Configuration
服务器特性配置(Server Characteristic Configuration) 声明是一个可选的特性描述符,用于定义如何为服务器配置特性
特性描述符值是一个 位域(bit field),当某个位被设置时,相应的操作将被启用,否则将不使用
在一个特性定义中只能有一个服务器特性配置声明
服务器特性配置声明应为可读和可写,客户端可以写入该配置描述符来控制服务器上所有客户端的特性配置;对于所有客户端来说,服务器特性配置是单一实例,读取服务器特性配置显示的是所有客户端的配置,而写入则会影响所有客户端的配置
服务器可能需要身份验证和授权才能写入配置描述符
该特性描述符包含在一个 Attribute 中
Attribute Type
应设置为 "服务器特性配置(Server Characteristic Configuration)" 的 UUIDAttribute Value
应设置为特性描述符值Attribute Permissions
由配置文件指定,或者如果没有特别指定,则可以由实现决定

服务器特性配置结构
图源:《Bluetooth Core Specification v5.0》
服务器特性配置位定义
Configuration | Value | 描述 |
---|---|---|
Broadcast | 0x0001 | 当服务器处于广播过程并且广告数据资源可用时,特性值将被广播 只有在特性属性设置了广播位时,此值才可以设置 |
Reserved for Future Use | 0xFFFE | 保留供未来使用 |
Characteristic Presentation Format
特性展示格式(Characteristic Presentation Format) 声明是一个可选的特性描述符,用于定义特性值(Characteristic Value) 的格式 ,即如何解析特征值
如果一个特性定义中存在多个特性展示格式声明(Characteristic Presentation Format declarations),则必须存在特性聚合格式声明(Characteristic Aggregate Format declaration) 作为该特性定义的一部分
特性格式值由五个部分组成:
- 格式(format)
- 指数(exponent)
- 单位(unit)
- 命名空间(name space)
- 描述(description)
该特性描述符包含在一个Attribute 中
Attribute Type
应设置为 "特性格式(Characteristic Format)" 的 UUIDAttribute Value
应设置为特性描述符值Attribute Permissions
应为只读,并且不需要身份验证或授权

特征展示格式属性结构
图源:《Bluetooth Core Specification v5.0》
特性展示格式描述符属性值字段的定义
Field Name | Value Size | Description |
---|---|---|
Format | 1 octet | 该特性值的格式 |
Exponent | 1 octet | 指数字段,用于确定该特性值如何进一步格式化 |
Unit | 2 octets | 该特性的单位,如在《Assigned Number Specification》中定义 |
Name Space | 1 octet | 描述的命名空间,如在《Assigned Number Specification》中定义 |
Description | 2 octets | 该特性的描述,如在更高层配置文件中定义 |
位序
Characteristic Format descriptor 使用的位序应该是 小端序(little-endian)(低位字节存储在低地址,而高位字节存储在 高地址,即数据的 最低有效字节(LSB) 放在最前面)
格式
格式(Format) 字段决定了 特性值(Characteristic Value) 中单个值的格式
如果格式不是一个完整的字节数,则数据应以能够容纳该值的最小字节数进行存储;数据应占用每个字节的全部内容,除了最后一个字节的最高有效位;最后一个字节的其他位应预留供未来使用
带符号整数应使用二进制补码表示法(two's-complement representation)
定义的格式值
Format | Short Name | Description | Exponent Value |
---|---|---|---|
0x00 | rfu | Reserved for Future Use | No |
0x01 | boolean | unsigned 1-bit; 0 = false, 1 = true | No |
0x02 | 2bit | unsigned 2-bit integer | No |
0x03 | nibble | unsigned 4-bit integer | No |
0x04 | uint8 | unsigned 8-bit integer | Yes |
0x05 | uint12 | unsigned 12-bit integer | Yes |
0x06 | uint16 | unsigned 16-bit integer | Yes |
0x07 | uint24 | unsigned 24-bit integer | Yes |
0x08 | uint32 | unsigned 32-bit integer | Yes |
0x09 | uint48 | unsigned 48-bit integer | Yes |
0x0A | uint64 | unsigned 64-bit integer | Yes |
0x0B | uint128 | unsigned 128-bit integer | Yes |
0x0C | sint8 | signed 8-bit integer | Yes |
0x0D | sint12 | signed 12-bit integer | Yes |
0x0E | sint16 | signed 16-bit integer | Yes |
0x0F | sint24 | signed 24-bit integer | Yes |
0x10 | sint32 | signed 32-bit integer | Yes |
0x11 | sint48 | signed 48-bit integer | Yes |
0x12 | sint64 | signed 64-bit integer | Yes |
0x13 | sint128 | signed 128-bit integer | Yes |
0x14 | float32 | IEEE-754 32-bit floating point | No |
0x15 | float64 | IEEE-754 64-bit floating point | No |
0x16 | SFLOAT | IEEE-11073 16-bit SFLOAT | No |
0x17 | FLOAT | IEEE-11073 32-bit FLOAT | No |
0x18 | duint16 | IEEE-20601 format | No |
0x19 | utf8s | UTF-8 string | No |
0x1A | utf16s | UTF-16 string | No |
0x1B | struct | Opaque structure | No |
0x1C -- 0xFF | rfu | Reserved for Future Use | No |
- 当编码 IPv4 地址 时,应使用 uint32 格式类型
- 当编码 IPv6 地址 时,应使用 uint128 格式类型
- 当编码 蓝牙 BD_ADDR 时,应使用 uint48 格式类型
- duint16 是由两个 uint16 值连接在一起组成的
Exponent
指数(Exponent) 字段与整数数据类型一起使用,用于确定值如何进一步格式化
指数字段仅在 格式字段(format field) 中指定为整数格式类型时使用,是二进制补码有符号整数
实际值 = 特性值 × 1 0 指数 \text{实际值} = \text{特性值} \times 10^{\text{指数}} 实际值=特性值×10指数
实际值是特性值 与 10 的 指数(Exponent) 次方的组合
Unit
单位(Unit) 是一个 UUID,如在 分配编号文档(Assigned Numbers document) 中定义
Name Space
命名空间(Name Space) 字段用于标识 负责定义描述字段枚举值的组织,该组织在分配编号文档中有定义
Description
描述(Description) 是一个枚举值,如在 分配编号文档(Assigned Numbers document)中定义,来自 命名空间字段(Name Space) 中标识的组织
Characteristic Aggregate Format
特性聚合格式(Characteristic Aggregate Format) 声明是一个可选的特性描述符,用于定义聚合的特性值(Characteristic Value) 的格式
在一个特性定义中只能有一个特性聚合格式声明
特性聚合格式值由特性展示格式声明(Characteristic Presentation Format declarations) 的属性句柄列表(Attribute Handles) 组成,每个属性句柄指向一个特性展示格式声明,Attribute Permissions 应为只读,并且不需要身份验证或授权
属性句柄列表是多个 16 位属性句柄(Attribute Handle) 值连接成一个 Attribute Value ,该列表至少应包含两个特性展示格式声明(Characteristic Presentation Format declarations) 的属性句柄
特性值应根据每个由属性句柄指向的特性展示格式声明进行解构,列表中属性句柄的顺序是有意义的
如果在一个特性定义中存在多个特性展示格式声明,则必须有一个特性聚合格式声明;该声明应在属性句柄列表中包含特性定义中的每个特性展示格式声明;其他特性定义中的特性展示格式声明也可以被使用

特性聚合格式属性结构
图源:《Bluetooth Core Specification v5.0》
GATT Profile Attribute Types
GATT 属性类型
Attribute Type | UUID | Description |
---|---|---|
Primary Service | 0x2800 | Primary Service Declaration |
Secondary Service | 0x2801 | Secondary Service Declaration |
Include | 0x2802 | Include Declaration |
Characteristic | 0x2803 | Characteristic Declaration |
Characteristic Extended Properties | 0x2900 | Characteristic Extended Properties |
Characteristic User Description | 0x2901 | Characteristic User Description Descriptor |
Client Characteristic Configuration | 0x2902 | Client Characteristic Configuration Descriptor |
Server Characteristic Configuration | 0x2903 | Server Characteristic Configuration Descriptor |
Characteristic Format | 0x2904 | Characteristic Format Descriptor |
Characteristic Aggregate Format | 0x2905 | Characteristic Aggregate Format Descriptor |
GATT Send Command
GATT 使用 ATT 发送命令