属性介绍
BLE体系结构图,本文主要讲GATT层
BLE GATT规定了交换profile文件数据的层级结构:
一个profile中可包含一个或多个服务,服务也分为主要服务和次要服务,一个服务可包含一个或者多个特征;一个特征至少包含两个属性,特征声明,特征值,特征描述符
主要服务:是BLE设备提供的一个主要功能或应用,它通常包含一组相关的特性,用于描述BLE设备提供的服务。每个主要服务都有一个唯一的UUID来标识它。例如,一个心率监测器可以提供一个主要服务,其中包含一个心率测量特性和一个电池级别特性(主要服务UUID一般是0x2800,主服务没有声明是发现不了BLE服务的)。
次要服务:是与主要服务相关但比较次要的服务,它可以扩展主要服务的功能或提供其他的应用。每个次要服务也有一个唯一的UUID来标识它。例如,一个智能手表可以提供一个主要服务,其中包含一个步数测量特性和一个闹钟特性,而另外一个次要服务则包含一个定位特性,用于提供位置信息。
BLE属性主要有三个:特征声明,特征值,特征描述符(各自都有对应的UUID)
特征声明:特征声明定义了一个特征的基本信息,包括特征的 UUID、权限(例如读、写、通知等)、属性类型等。它是特征的标识和描述。(特征声明的UUID一般是0x2803)。
特征声明有一个值,这个值有5个字节:包括特征的属性(0字节),特征值句柄(1,2字节),和特征UUID(3,4字节);
字节0:规定了该特征的性质(property):
{
0x01 ---- 允许对该特征值进行广播。
0x02 ---- 允许读取特征值。
0x04 ---- 允许写入特征值(没有响应)。
0x08 ---- 允许写入特征值(有响应)。
0x10 ---- 允许向GATT 客户端进行特征值通知(无需确认)。
0x20 ---- 允许向GATT 客户端进行特征值指示(需要确认)。
0x40 ---- 允许对特征值进行签名写操作。
0x80 ---- 存在扩展性质位,该扩展性质位在特征扩展性质描述符中定义。
}
字节1 - 2:表示了该特征值的句柄(handle)。
字节3 - 4:表示了该特征值的类型(UUID)。
特征声明例子:
由上图(属性表)可以看出 :
主要服务 UUID是0x2800
特征声明UUID是0x2803,
特征声明有一个值是02:03:00:00:2A,根据以上图信息可知(红色框起来的 ):02 是特征的属性(0字节),00 03是特征值句柄(1,2字节), 2A 00是特征值UUID(3,4字节),对应就是黄色框起来的
特征值的UUID是0x2A00
注意:没有特征声明是找不到特征值和CCCD,因为特征声明是服务的一部分,它描述了特征的基本属性,如UUID、属性(如读、写、通知等)和特征值的句柄。客户端设备通过读取特性声明来发现服务和特征。如果没有特征声明,客户端设备就无法找到和识别特征值
特征值:特征值是特征所携带的实际数据。它可以是各种数据类型,例如整数、浮点数、字符串等,用于传输和存储特征相关的信息 (特征值UUID为用户自定义)。
BLE 特征值用于在蓝牙设备之间传输和存储数据。它们承载着特征相关的实际信息,在 BLE 通信中起着重要作用。 特征值可以是各种数据类型,例如整数、浮点数、字符串等。通过读取和写入特征值,设备之间可以进行数据交换和共享。
具体用途包括但不限于以下几种: 数据传输:特征值可以用于传输设备之间的数据。例如,一个传感器设备可以通过特征值将温度、湿度等数据发送给另一个设备。
远程控制:特征值可以用于远程控制设备的行为。例如,通过写入特定的特征值,可以控制一个智能家居设备的开关状态、亮度等。
状态更新:特征值可以用于实时更新设备的状态信息。例如,一个电池设备可以通过特征值报告其当前的电量百分比。
配置设置:特征值可以用于设备的配置和设置。例如,通过写入特定的特征值,可以更改设备的参数、采样频率等。
特征描述符(CCCD):在 BLE 技术中,设备之间进行通信时使用 GATT协议来传输数据。GATT 定义了一种层次结构来组织和描述一个设备的所有特性和服务,并为每个特性和服务定义了唯一的 UUID,(CCCD的UUID一般是0x2902)
每个特性都可以有一个或多个描述符,用于描述特性的属性。其中,CCCD 描述符用于配置客户端角色与特征通信时的行为,例如是否允许通知、指示等。
CCCD 是一个特征描述符,它与特征值相关联,并且存储在从设备的 GATT 数据库中。通过写入特定的值到 CCCD,主设备可以向从设备表明其希望接收特定特征的通知或指示。
具体而言,主设备会向 CCCD 写入一个 16 位的值,其中包含一些标志位,用于表示通知/指示的状态和权限。常见的值是:
0x0000:禁用通知/指示。
0x0001:启用通知。
0x0002:启用指示。
通过将相应的值写入 CCCD,主设备告知从设备要启用哪种类型的通知/指示。这样一来,从设备就会根据 CCCD 的配置发送相应类型的数据通知给主设备。
简单来说,添加CCCD的目的,就是为了有事件通知
CCCD说明例子:
心率数据通常是通过特性值发送的。特性值是实际承载数据的部分。然而,CCCD 是用来控制设备是否发送通知或指示的。当CCCD被设置为启用通知或指示时,设备会在特性值改变时发送一个通知或指示给客户端。
所以,虽然心率数据是通过特性值发送的,但是是否发送这些数据(即,是否发送通知或指示)是由CCCD的设置决定的。CCCD是控制通知,特性值是发送通知
属性的权限
每个属性都可以当成数据点:属性的权限对应也有五种:读,写,写不回应,通知,指示
属性权限例子:
BLE设备是从机,手机是主机
读: 手机从BLE设备读取某个特性的值
写: 手机修改BLE设备中某个特性的值 (需要设备回应)
写不回应:手机修改BLE设备中某个特性的值 (不需要设备回应)
通知:BLE设备的数据发生变化,通知手机来取数据(需要订阅对应的通知)(不需要手机回应)
指示:BLE设备的数据发生变化,通知手机来取数据(需要订阅对应的通知)(需要手机回应)