Bluetooth GATT介绍
1. 介绍
GATT(Generic Attribute Profile),描述了一种使用ATT的服务框架,该框架定义了服务(Server)和服务属性(characteristic)的过程(Procedure)及格式。
Procedure定义了characteristic的发现、读、写、通知(Notifing)、指示(Indicating) 及配置characteristic的广播。
GATT可以被Application或其他Profile使用
其协议栈如下图
--------------- ---------------
| Application | <----> | Application |
--------------- ---------------
| Attribute | | Attribute |
| Protocol | <----> | Protocol |
--------------- ---------------
| L2CAP | <----> | L2CAP |
--------------- ---------------
| Controller | <----> | Controller |
--------------- ---------------
GATT可以配置为如下两种角色(Role)
- Client : 命令、请求发起方
- Server : 命令、请求接收方
角色配置实例如下
_________
/ ======= \
/ __________\
| ___________ | Request /\
| |Computer | | ----------> / /
| |(Client) | | <---------- / / Sensor(Server)
| |_________| | Response / /
\=____________/ \/
/ """"""""""" \
/ ::::::::::::: \
(_________________)
Computer是一个温度服务客户端, Sensor是温度服务服务器,Computer向Sensor发起Procedure来读Sensor的值
GATT对下层的需求如下
- Physical Link : 使用GAP Channel Establishment建立的ATT Bearer
- GATT Role : 不依赖于Coontroller角色(Master/Slave)
- Security : 对于LE,Security Features(Authorization、Authentication、Encryption)是可选的
对于BR/EDR, Encryption是强制的
- TX order : GATT中的多字节字段,采用Least Significant octet先发送(Little Endian)
2 内容
2.1 Configured Broadcast
对于LE物理链路,在Server广播模式过程中,Client通过Configured Broadcast告知Server应该在advertising data加入Characteristic Value
方法是Client设置指定bit位
广播频率则是Service、Characteristic行为定义的一部分
2.2 GATT Profile Hierarchy
GATT指定了数据交互的结构(Structure)
这个结构体定义了一些基本元素,如Service、Characteristic,这些元素存在于Attribute中。

GATT中最上层是Profile,Profile由一个或多个服务(Service)组成,服务是由Characteristics组成,或是其他服务的引用(Reference) 。
Characteristic包含一个值(Value),可能包含该Value的相关信息
2.2.1 Service
Service是[数据]和与之关联的[完成某个特定功能的行为]/[特性]的集合。
在GATT中,一个服务由服务定义(Service Defintion)来实现,一个服务定义可能包含引用服务(Reference Service)、强制Characteristic和可选Characteristic。
为了实现旧版本的兼容,新版本中服务定义只能增加新的引用服务或可选Characteristic,新版本中的服务定义禁止从旧的服务定义中改变行为
Server有两类
- Primary Service : 拥有基本功能的服务,可被其他服务包含,可以通过Primary Service Discovery过程来发现
- Secondary Service : 仅用来被Primary/Other Secondary Service、高层协议引用的服务
判读一个服务是Primary or Secondary Service可通过高层协议强制规定
2.2.2 Included Service
一个Included Service是一种引用已存在服务的方法,
具体办法为在服务定义的开始加上Included Service的引用,
这样整个Included Service定义成为新服务定义的一部分
2.2.3 Characteristic
Characteristic由Characteristic Definition定义,包含一个Characteristic声明、Characteristic属性、值、值的描述(Optional)
3 Service Interoperability Requirements
3.1 Service Definition
服务定义(Service Definition)包含一个服务申明(Service Declaration) ,可能包含Include Definitions和Characteristic Definitions
在下一个服务申明前或到达Maximum Attribute Handle时结束
服务定义在服务端上基于Attribute Handle顺序呈现
服务定义中的Include Definitions和Characteristic Definitions被认为是服务的一部分
服务定义中的顺序为
Service Declaration ~ Include Definitions(>=0) ~ Characteristic Definitions(>=0)
Service Declaration如下
| Attribute Handle | Attribute Type | Attribute Value | Attribute Permission |
| 0xNNNN | 0x2800 – UUID for <Primary Service> 0x2801 – UUID for <Secondary Service> |
16-bit Bluetooth UUID 128-bit UUID for Service |
Read Only, No Authentication, No Authorization |
规则如下:
- 当多个服务存在时
使用16-bit Bluetooth UUID服务定义的服务应该分组(如按顺序排列)
同理,使用128-bit UUID的服务定义的服务也分组
- 一个设备或高层协议可能有多个服务定义,同时多个服务定义含有相同的Service UUID
- 服务端的所有Attributes应该包含一个服务声明或存在一个服务定义
- 服务端的服务定义可能无序;Client不应该认为服务端的服务定义一定是有序的
3.2 Include Definition
一个Include Definition只包含一个Include Declaration
Include Declaration如下
| Attribute Handle | Attribute Type | Attribute Value | Attribute Permission | ||
| 0xNNNN | 0x2802 – UUID for<Include> |
Included Service Attribute Handle |
End Group Handle |
Service UUID | Read Only, No Authentication, No Authorization |
其中,仅当UUID是16-bit Bluetooth UUID时才存在
如果一个Service的Include Definition(A)是引用其他Server的Include Definition(B) ,那么Include Definition(B)不应该引用Include Definition(A),否则就是循环引用(Circular Reference)
当一个Client检测到循环引用或detects nested include declarations to a greater level than it expects ,Client应当终止本次通信(ATT Bearer)
3.3 Characteristic Definition
Characteristic Definition包含如下内容
- Characteristic Declaration : First
- Characteristic Value declaration : Second
- Characteristic Descriptor Declarations(Optional) : Last(含多个时顺序不关紧要)
Characteristic Definitions在服务端以Attribute Handle排序
以上每个Declaration包含在一个单独的Attribute中
3.3.1 Characteristic Declaration
Characteristic Declaration如下
| Attribute Handle | Attribute Type | Attribute Value | Attribute Permission | ||
| 0xNNNN | 0x2803 – UUID for Characteristic |
Characteristic Properties |
Characteristic Value Attribute Handle |
Characteristic UUID |
Read Only, No Authentication, No Authorization |
其中,Attribute Value只读
Attribute Value字段如下
| Attribute Value | Size | Description |
| Characteristic Properties | 1 octets | Bit field of characteristic properties |
| Characteristic Value Handle |
2 octets | Handle of the Attribute containing the value of this characteristic |
| Characteristic UUID | 2/16 octets | 16-bit Bluetooth UUID or 128-bit UUID for Characteristic Value |
一个Service可能含有相同Characteristic UUID的Characteristic Definitions
在一个服务定义中,一些强制的Characteristics应该位于Include Declarations之后、其他可选characteristics之前
而Client不应该认为Characteristic是有序的
同时,16-bit Bluetooth UUIDs和128-bit Bluetooth UUIDs应该分别分组
Characteristic Properties以bit位的方式决定如下内容
- Characteristic Value的使用方式
- Characteristic Descriptors的访问方式
Characteristic Properties bit field的详细内容如下
Notice: 多个比特位可以同时设置
| Properties | Value | Description |
| Broadcast | 0x01 | If set, permits broadcasts of the Characteristic Value using Characteristic Configuration Descriptor |
| Read | 0x02 | If set, permits reads of the Characteristic Value using procedures defined in Section 4.8 |
| Write Without Response |
0x04 | If set, permit writes of the Characteristic Value without response using procedures defined in Section 4.9.1 |
| Write | 0x08 | If set, permits writes of the Characteristic Value with response using procedures defined in Section 4.9.3 or Section 4.9.4 |
| Notify | 0x10 | If set, permits notifications of a Characteristic Value without acknowledgement using the procedure defined in Section 4.10 |
| Indicate | 0x20 | If set, permits indications of a Characteristic Value with acknowledgement using the procedure defined in Section 4.11 |
| Authenticated Signed Writes |
0x40 | If set, permits signed writes to the Characteristic Value using the procedure defined in Section 4.9.2 |
| Extended Properties |
0x80 | If set, additional characteristic properties are defined in the Characteristic Extended Properties Descriptor defined in Section 3.3.3.1 |
3.3.2 Characteristic Value Declaration
Characteristic Value Declaration如下
| Attribute Handle | Attribute Type | Attribute Value | Attribute Permissions |
| 0xNNNN | 0xuuuu – 16-bit Bluetooth UUID or 128-bit UUID for Characteristic UUID |
Characteristic Value | Higher layer profile or implementation specific |
3.3.3 Characteristic Descriptor Declarations
Characteristic Descriptor Declarations包含了Characteristic Value相关信息
GATT定义了一系列的标准Characteristic Descriptors供高层协议使用
高层协议也可以定义协议相关的Characteristic Descriptors
Characteristic Descriptors在服务端上是无序的,Client不应该理所当然
Characteristic Descriptors Declarations Permissions由高层协议定义或协议相关的
Client不应该理所当然地认为是可读的
Characteristic Descriptor Declarations包括如下内容(详细见规范)
- Characteristic Extended Properties
- Characteristic User Description
- Client Characteristic Configuration
- Server Characteristic Configuration
- Characteristic Presentation Format
- Characteristic Aggregate Format
3.4 Summary of GATT Profile Attribute Types
| 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 |
4. GATT Feature Requirements
4.1 Overview
GATT中定义了11项Feature
1. Server Configuration
2. Primary Service Discovery
3. Relationship Discovery
4. Characteristic Discovery
5. Characteristic Descriptor Discovery
6. Reading a Characteristic Value
7. Writing a Characteristic Value
8. Notification of a Characteristic Value
9. Indication of a Characteristic Value
10. Reading a Characteristic Descriptor
11. Writing a Characteristic Descriptor
每个Feature都有对应的过程和子过程,这些过程描述了如何使用ATT来实现各自的功能
4.2 Feature Support and Procedure Mapping
详细的对应列表如下表
|
No |
Feature |
Sub-Procedure |
Ref |
Client |
Server |
|
1 |
Server Configuration |
Exchange MTU |
4.3.1 |
O |
O |
|
2 |
Primary Service Discovery |
Discover All Primary Services |
4.4.1 |
O |
M |
|
Discover Primary Services By |
4.4.2 |
O |
M |
||
|
3 |
Relationship Discovery |
Find Included Services |
4.5.1 |
O |
M |
|
4 |
Characteristic |
Discover All Characteristic of a Service |
4.6.1 |
O |
M |
|
Discover Characteristic by UUID |
4.6.2 |
O |
M |
||
|
5 |
Characteristic |
Discover All Characteristic Descriptors |
4.7.1 |
O |
M |
|
6 |
Characteristic Value Read |
Read Characteristic Value |
4.8.1 |
O |
M |
|
Read Using Characteristic UUID |
4.8.1 |
O |
M |
||
|
Read Long Characteristic Values |
4.8.2 |
O |
O |
||
|
Read Multiple Characteristic Values |
4.8.3 |
O |
O |
||
|
7 |
Characteristic Value Write |
Write Without Response |
4.9.1 |
O |
C.1 |
|
Signed Write Without Response |
4.9.2 |
O |
O |
||
|
Write Characteristic Value |
4.9.3 |
O |
C.2 |
||
|
Write Long Characteristic Values |
4.9.4 |
O |
O |
||
|
Characteristic Value Reliable Writes |
4.9.5 |
O |
O |
||
|
8 |
Characteristic Value Notification |
Notifications |
4.10.1 |
O |
O |
|
9 |
Characteristic Value Indication |
Indications |
4.11.1 |
M |
C.3 |
|
10 |
Characteristic |
Read Characteristic Descriptors |
4.12.1 |
O |
O |
|
Read Long Characteristic Descriptors |
4.12.2 |
O |
O |
||
|
11 |
Characteristic |
Write Characteristic Descriptors |
4.12.3 |
O |
O |
|
Write Long Characteristic Descriptors |
4.12.4 |
O |
O |
||
|
C1: Write Without Response is mandatory if Signed Write Without Response is supported otherwise optional C2: Write Characteristic Value is mandatory if Write Long Characteristic Values is supported otherwise optional C3: If Service Change Characteristic is present, this feature is mandatory, otherwise optional. |
|||||
4.3 Server Configuration
该过程可被Client用来配置Attribute Protocol的MTU大小
4.3.1 Exchange MTU
Client使用该子过程来设置适配双方均支持的最大ATT_MTU
在BR/EDR物理链路中不应该使用该过程,而应该使用L2CAP Channel Configuration Procedures
该过程对应于ATT的MTU Exchange Request/Response
见<Bluetooth ATT介绍 - 4.2 MTU Exchange>
4.4 Primary Service Discovery
Client使用该过程来发现服务端的Primary Services,一旦发现服务存在,可通过其他过程来访问Primary Services的附加信息(关联主服务和次服务)
可使用的其他过程包括Characteristic Discovery和Relationship Discovery
该过程包括两个子过程:
- Discover All Primary Services
- Discover Primary Services by Service UUID
在BR/EDR物理链路上则使用SDP service discovery来发现服务
4.4.1 Discover All Primary Services
Client使用该子过程来发现服务端的所有Primary Services
该子过程使用ATT的Read By Group Type Request,同时设置如下参数
- Starting Handle : 0x0001
- Ending Handle : 0xFFFF
- Attribute Type : UUID for <Primary Service>
可能的回应有
- Read By Group Type Response
- Error Response
Read By Group Type Response返回三元组列表
三元组包括
- Attribute Handle : 服务声明的Handle
- End Group Handle : 服务定义中最后一个Attribute的Handle
- Attribute Value : 服务端支持的服务的Service UUID
当收到Error Response<Error Code: Attribute Not Found>时,则表明该过程已经完成
当Client找到自己所需要的服务时,可以终止该过程
Note: 3.1中已指出Service Declaration是可读,并且不需要认证或授权
因此权限相关的错误不会发生
下图是一个实例图

4.4.2 Discover Primary Service by Service UUID
当Client只知道Service UUID时,可以使用该子过程来发现对应的主服务
该子过程使用ATT的Find By Type Value Request,同时设置参数如下
- Starting Handle : 0x0001
- Ending Handle : 0xFFFF
- Attribute Value : 16-bit Bluetooth UUID or 128-bit UUID
- Attribute Type : UUID for <Primary Service>
可能的回应有
- Find By Type Value Response
- Error Response
Find By Type Value Response返回Attribute Handle ranges列表
Attribute Handle range即服务定义的Starting Handle和Ending Handle
如果Attribute Handle range中的End Found Handle不是0xFFFF
那么Client将会再请求一次Req
同时将Starting Handle设置为收到的最后一个Attribute Handle+1
终止规则和权限问题同Discover All Primary Services
下图是一个实例图

4.5 Relationship Discovery
Client使用该过程来发现和其他服务的服务关系
4.5.1 Find Include Services
Client使用该子过程来发现一个服务定义包含的服务申明
该子过程使用ATT的Read By Type Request,同时设置参数如下
- Starting Handle : 所要查找服务的Starting Handle
- Ending Handle : 所要查找服务的Ending Handle
- Attribute Type : UUID for <Include>
可能的回应有
- Find By Type Response
- Error Response
Find By Type Response返回[Attribute Handle, Attribute Value]集合对
Attribute Value由所包含服务申明的Attribute Handle和End Group Handle组成
当UUID为16-bit Bluetooth UUID时,那么它也将包含在Rsp中
该Req应该被再次请求,同时设置Starting Handle为为收到的最后一个Attribute Handle+1
当Rsp中包含的服务申明中Attribute Handle等于Req的Ending Handle时,
该子过程被认为完成(当然Attribute Not Found-Error Rsp也是)
当Include Service使用128-bit UUID时
使用Read Request来获取Include Service UUID
其中Attribute Handle参数设置为Include Service的Attribute Handle
权限规则同上面
下图是一个实例图

========================================================
Bluetooth GATT介绍的更多相关文章
- BLE GATT 介绍
做 BLE 快两年了,想想刚开始自己查各种资料学习的时候也是有很多感慨,记得最清楚的就是 GATT 这个东东,当时完全搞不懂,什么是服务?什么是特征值?什么是 UUID?最近感觉对这些概念又有点混乱了 ...
- Bluetooth GAP介绍
目录 1 GAP协议栈 2 Profile Role 3 用户接口 4 模式 5 安全 5.1 认证(Authentication) 5.2 安全模式 6 Idle Mode Procedures 7 ...
- Bluetooth ATT介绍
目录 1 介绍 2 详细内容 2.1 Attribute Type 2.2 Attribute Handle 2.3 Attribute Handle Grouping 2.4 Attribute V ...
- Bluetooth LMP介绍
目录 1. 介绍 2. 数据包格式(Packet Format) 3. Procedure Rules 4. 通用回应消息(General Response Messages) 5. 设备特性(Dev ...
- Bluetooth Baseband介绍
目录 1. 概述 1.1 Clock(时钟) 1.2 寻址方式 2. 物理信道(Physical Channels) 3. 物理链路(Physical Links) 4. 逻辑传输层(Logical ...
- Bluetooth HFP介绍
目录 1. 介绍 1.1 目的 1.2 使用场景 1.3 依赖关系 1.4 协议栈 1.5 角色 2. 应用层 3. 空白章节 4. 互操作性要求 4.1 介绍 4.2 Service Level C ...
- Bluetooth RFCOMM介绍
目录 1. 介绍 2. 服务概述 2.1 RS-232控制信号 2.2 Null Modem Emulation 2.3 多串口仿真 3. 服务接口描述 4. RFCOMM帧类型 5. RFCOMM帧 ...
- Bluetooth HCI介绍
目录 1. HCI功能 2. HCI Packet 1. HCI Command 2. HCI Event 3. HCI Data 3. HCI传输层 HCI, 主机控制接口(Host Control ...
- Bluetooth L2CAP介绍
目录 1. 通用操作 1. L2CAP Channel 2. 设备间操作 3. 层间操作 4. 操作模式 2. 数据包格式(Data Packet Format) 1. B-Frame 2. G-Fr ...
随机推荐
- calendar 示例
package unit5; import java.text.DateFormatSymbols; public class MyMonth { private int month; private ...
- include、include_once与require、require_once区别
include与require的区别 include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行. <?php include 'no.p ...
- Spring的类型转换器
spring有2种类型转换器,一种是propertyEditor,一种是Converter. 第一种属性编辑器用法见Spring的属性编辑器的章节.如果2种转换器都适用,那么究竟会适用哪种呢?Spri ...
- Chart系列(二):数据绑定
1.绑定到OleDbDataReader: // Define the database query string mySelectQuery="SELECT Name, Sales FRO ...
- emacs yasnippet
首先安装emacs 然后下载yasnippet-bundle-0.6.1c.el.tgz解压 在~/.emacs.d/文件夹下新建一个文件plug,一般是新建一个plugins但是我到下面有这个文件夹 ...
- 20145325张梓靖 实验三 "敏捷开发与XP实践"
20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...
- placeholder在不同浏览器下的表现及兼容方法
1.什么是placeholder? placeholder是html5新增的一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点(或 ...
- 安装rkhunter
#!/bin/bash if [ ! -d /soft ];thenmkdir /soft fiwhich rkhunterif [ $? -eq 0 ];then echo "rkhunt ...
- uc_key getshell
<?php $key = 'cebbvi5s15BSiMXteaP9TNCIz5K5jAVekw7tcV9TqmYCNT5VOJdu7toOxipTX';#uc_key 写在这里 $url = ...
- java语法基础思维导图