目录
1. 蓝牙BLE通用属性协议(GATT)
2.GATT角色介绍
3.GATT 层级和Profile架构
4. GATT Server架构(重点内容)
5. Characteristic架构(重点内容)
6. (Characteristic Properties)特性属性详解(重点内容)
时间有限,此文将会继续优化完善
1. 蓝牙BLE通用属性协议(GATT)
GATT(Generic Attribute Profile):通用属性协议,它是在ATT 的基础上,对 ATT 进行的进一步逻辑封装,定义数据的交互方式和含义。它是低功耗蓝牙BLE设备之间进行通信的协议。GATT定义了一种多层的数据结构,已连接的低功耗蓝牙设备用它来进行通信,其定义的多层数据结构简要概括起来就是服务(service)可以包含多个特征(characteristic),每个特征包含属性(properties)和值(value),还可以包含多个描述(descriptor)。
➢ GATT基于ATT协议(属性协议)来承载的,属性协议主要用来发现、读写、通知和指示。
➢ GATT 可以被 Application 或其他 Profile 使用,其协议栈如下图:
1、GATT 是脱胎于 ATT ,ATT 是 Attribute Protocol Specification 属性规范协议,注意ATT是协议,而GATT是规范,两者不同点在于 ATT规定了数据格式,而 GATT 则是按照 ATT 的格式将具体数据填充进去
2、GATT层是传输真正数据所在的层。包括了一个数据传输和存储架构以及其基本操作。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理
3、ATT之所以称作“protocol”,是因为它还比较抽象,仅仅定义了一套机制,允许client和server通过Attribute的形式共享信息。而具体共享哪些信息,ATT并不关心,这是GATT(Generic Attribute Profile)的主场。
4、GATT相对ATT只多了一个‘G‘,但含义却大不同,因为GATT是一个profile(更准确的说是profile framework)。
5、在蓝牙协议中,profile一直是一个比较抽象的概念,我们可以将其理解为“应用场景、功能、使用方式”都被规定好的Application
2.GATT角色介绍
➢ GATT 可以配置为如下两种角色,SIG GATT文档中的角色释义原文如下:
Client—This is the device that initiates commands and requests towards the server and can receive responses, indications and notifications sent by the server.
该设备可以向服务端发起命令和请求,并且能接收服务端发送的响应、指示和通知。
Server—This is the device that accepts incoming commands and requests from the client and sends responses, indications and notifications to a client.
该设备可以接收来自客户端的传入命令和请求,并向客户端发送响应、指示和通知。
➢简单理解:谁发起命令和请求,谁就是GATTC;谁接收命令和请求,谁就是GATTS。
➢一个设备可以同时扮演这两个角色:这些角色没有固定到设备上,角色在设备启动已定义的过程时确定,并在过程结束时释放。
GATT客户端抽象层:在GATT客户端应用程序大部分是直接使用GATT的API(少部分直接使用ATT层API),没有额外profile文件,因为GATT客户端是得到数据,不需要建立属性表和配置文件。
GATT服务端抽象层:在GATT服务端,GATT层的大部分功能由独立的Profiles处理,然后可以看见Profiles又使用GAttservApp模块(一个可配置的模块,用于储存和管理属性表,详见BLE Stack API Reference)处理。所以在建立GATT服务端的时候首先需要配置Profiles文件,Profiles文件调用GattServApp模块并使用其API与GATT层接口。在这种情况下应用程序不需要直接调用GATT层API、应用程序和Profiles文件接口。
3.GATT 层级和Profile架构
GATT按照层级定义了4个概念:
➢ GATT Profile: 一种规范,一种标准的通信协议。每个Profile由一个或多个Service组成, Service由一个或多个Characteristic组成,或是其他服务的引用(Include) ,Characteristic又由多个Attributes( Properties、Value、Descriptor(0,1或多个) )组成,每个Attribute又包含ATT Handle、 ATT Type、 ATT Value、 ATT Permissions。
➢Service:一种服务,也就是从机的能力。例如,蓝牙从机的电量信息服务、系统信息服务等。每个service中又包含多个characteristic特征值,每个具体的characteristic才是BLE通信的主题。
➢Characteristic:特征值,BLE主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。
举个例子,Heart Rate Measurement Characteristic。
这个 Characteristic 是Heart Rate Service必须实现的,它的UUID为0x2A37。它的数据结构是,开始8bit定义心率数据格式,后边的是对应格式的实际心率数据。
➢UUID:统一标识码,service 和 characteristic 都需要一个唯一的UUID来标识。
1、对于GATT层的Profile、Service、Characteristics、Attributes概念,我们一定要深入理解,因为一旦建立连接后,不管是嵌入式端还是应用端进行数据交互的都是这些概念。
2、基于GATT架构,Application的存在形式,不再是单一的Profile,很多简单的应用场景,可以直接以Service的形式存在(profile的概念隐藏在了GATT中),可以理解为“Service”实例化了。这大大简化了一些传感器节点的设计复杂度
3、实线为一个服务必须包含的部分,虚线为可选择的部分。
注:一个Profile中的属性表不能包含另一个属性表
4. GATT Server架构(重点内容)
➢服务组成:GATT 数据框架都是有一个或者多个service 并列组成的。用户通过定义不同的service,实现不同的功能。一系列ATT数据组成一个group,表示一个service。所有的service都必须满足相同的数据要求,具体分为三个部分
1. service服务申明(必须)
2. 包含其他include服务(可选)
3. Characteristic特性(必须),特性中含有Properties (必须) 、value(必须)、descriptor(可选)
➢一个服务包含一个或多个特性,这些特性是逻辑上相关的集合体。GATT服务一般包含几块具有相关性的功能,比如特定传感器的读取和设置,人机接口的输入和输出。
GATT Server类型及声明(重点内容)
➢服务类型: 服务有两种类型,primary service 和secondary service,primary service可以被其他service 所包含,可以通过discover 流程发现。secondary service只能被primary service 或者其他secondary service 所包含,不能独立存在。一个服务的类型,会在声明中注明。主要服务声明UUID 0x2800,次要服务声明UUID 0x2801。
➢ include 是service 中可选择的部分,它只是一种用来引用已存在服务的方法,引用服务声明UUID为0x2802。
➢服务声明: 每个定义的service第一条就是服务声明, 因此以服务声明可以分隔开所有不同的服务。声明之后,紧跟include 和 characteristic部分。
红色部分为一个服务必须包含的部分,蓝色为可选择的部分。
➢服务声明的数据结构:ATT类型(仅有两种)+ ATT value(服务的具体类型,UUID表示,比如电量服务,GAP服务等等),因此服务声明的Value包含了服务的UUID,服务权限为read only,不可以被修改,由server 端在自定义数据表格的时候确定。
5. Characteristic架构(重点内容)
➢特性其实是个集合,特性包含以下子元素:
1.特性声明(Characteristic Declaration)
2.特征值声明(Characteristic Value Declaration)
3.特征描述符声明(Characteristic Descriptor Declaration)
➢特性声明、特征值声明是必须要有的,但特征描述符是可选项,可能包含一个或多个描述符,也可能不包含描述符。
1、Characteristic是在GATT规范中最小的逻辑数据单元,由一个Value和多个描述特性的Desciptior组成。实际上,在与蓝牙设备打交道,主要就是读写Characteristic的value来完成。
2、一个特性至少包含2个属性:一个属性用于声明,一个属性用于存放属性的值。
2.2 (Characteristic declaration)特性声明架构(重点内容)
➢特性声明(Characteristic declaration):特性声明本身的 UUID 是 0x2803
➢特性声明中需要声明的特性是在属性值(Attribute value)中的,属性值包含有 3 个字段: 特性属性、属性句柄和属性类型,特性声明的权限仅为只读。如左下图:
➢任何特性都必须包含特性申明,特性声明中的属性值的3个字段中特性属性占 1 个字节,属性句柄占2个字节,属性类型要么是 2 字节 16bits 的 UUID 或者是16字节128bits的UUID,如右下图。
6. (Characteristic Properties)特性属性详解(重点内容)
通常的属性有如下几个: