BLE协议栈整体架构
首先了解一下,BLE协议栈(protocol stack)整体架构。
如上图所述,要实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后在协议栈上开发自己的应用。可以看出BLE协议栈是连接芯片和应用的桥梁,是实现整个BLE应用的关键。那BLE协议栈具体包含哪些功能呢?简单来说,BLE协议栈主要用来对你的应用数据进行层层封包,以生成一个满足BLE协议的空中数据包,也就是说,把应用数据包裹在一系列的帧头(header)和帧尾(tail)中。具体来说,BLE协议栈主要由如下几部分组成:
- PHY层(Physical layer物理层)。PHY层用来指定BLE所用的无线频段,调制解调方式和方法等。PHY层做得好不好,直接决定整个BLE芯片的功耗,灵敏度以及selectivity等射频指标。
- LL层(Link Layer链路层)。LL层是整个BLE协议栈的核心,也是BLE协议栈的难点和重点。像Nordic的BLE协议栈能同时支持20个link(连接),就是LL层的功劳。LL层要做的事情非常多,比如具体选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。LL层只负责把数据发出去或者收回来,对数据进行怎样的解析则交给上面的GAP或GATT。
- HCI(Host controller interface)。HCI是可选的,HCI主要用于2颗芯片实现BLE协议栈的场合,用来规范两者之间的通信协议和通信命令等。
- GAP层(Generic access profile)。GAP是对LL层payload(有效数据包)如何进行解析的两种方式中的一种,而且是最简单的那一种。GAP简单的对LL payload进行一些规范和定义,因此GAP能实现的功能极其有限。GAP目前主要用来进行广播,扫描和发起连接等。
- L2CAP层(Logic link control and adaptation protocol)。L2CAP对LL进行了一次简单封装,LL只关心传输的数据本身,L2CAP就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。
- SMP(Secure manager protocol)。SMP用来管理BLE连接的加密和安全的,如何保证连接的安全性,同时不影响用户的体验,这些都是SMP要考虑的工作。
- ATT(Attribute protocol)。简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。 BLE协议栈中,开发者接触最多的就是ATT。BLE引入了attribute概念,用来描述一条一条的数据。 Attribute除了定义数据,同时定义该数据可以使用的ATT命令,因此这一层被称为ATT层。
- GATT(Generic attribute profile )。GATT用来规范attribute中的数据内容,并运用group(分组)的概念对attribute进行分类管理。没有GATT,BLE协议栈也能跑,但互联互通就会出问题,也正是因为有了GATT和各种各样的应用profile,BLE摆脱了ZigBee等无线协议的兼容性困境,成了出货量最大的2.4G无线通信产品。
GATT简介
GATT主要包括唯一标识符(Universally Unique Identifiers ,缩写UUIDs)、角色(Roles)
、属性(Attributes)、数据结构(Data Organization)。
下图描述了一个GATT客户端读写有两个服务的GATT服务端数据的过程。
- 唯一标识符(UUID):UUID是一个全球唯一的128位(16字节)数字,用于标识通用属性(GATT)配置文件中的配置文件、服务和数据类型。为了减轻存储和传输128位UUID值的负担,已预先分配了一系列UUID值,以分配给经常使用的已注册目的。 该预分配范围中的第一个UUID被称为Bluetooth Base UUID,其值从蓝牙分配的数字文档中为00000000-0000-1000-8000-00805F9B34FB。 预分配范围内的UUID值的别名表示为16位或32位值。 这些别名通常称为16位和32位UUID,但是要注意,每个别名实际上代表一个128位UUID值。16位UUID对应的完整UUID为0x0000[16位UUID]-0000-1000-8000-00805F9B34FB。
Bluetooth SIG提供的标准的预定义UUIDS可以查看如下链接:
SIG-Defined GATT Services
SIG-Defined GATT Characteristics
SIG-Defined GATT Descriptors - 角色(Roles):包含两种角色,服务端(Server)和客户端(Client)
属性(Attributes):属性是服务端的能力,由客户端进行访问。
GATT-数据层次结构
- GATT中最上层是Profile,Profile由一个或多个服务(Service)组成
- 服务(Service)是由特性(Characteristics)组成,或是其他服务的引用(Reference)
- 特性(Characteristics)包含多个属性(Attributes)。特征声明属性(Declaration)、特征值属性(Value)和特征描述符属性(Descriptor )(可选)
GATT-服务(Service)
完成特定功能的数据和相关行为的集合被称为服务(Service)(即特征(Characteristics)的集合)。主要服务(Primary services)由GATT客户端通过“GATT主要服务发现过程”发现。
服务分为公共服务和私有服务:
- 公共服务 由蓝牙SIG定义 (16位UUID)
- 私人服务 由供应商定义(128位UUID)
GATT-特征(Characteristics)
特征(Characteristics)本质上是用户数据的容器。它们至少包含两个属性:
- 特征声明属性(Characteristic Declaration Attribute): 值属性的元数据
- 特征值属性 (Characteristic Value Attribute):包含数据值本身
- 特征描述符属性(Characteristic Descriptors Attribute):可选,用于进一步扩展声明属性中包含的数据的特殊属性。GATT定义的通用的特征描述符属性包括:
特征描述符属性 | 说明 |
---|---|
Extended Properties | Contains additional declaration property bits |
Characteristic User Description | Contains a user-readable description for the characteristic in which it is placed |
Client Characteristic Configuration Descriptor (CCCD) | A switch, enabling/disabling server-initiated updates |
GATT-属性(Attributes)
属性的数据结构
- 属性句柄(Attribute Handle):属性句柄是唯一的16位标识符。其犹如指向属性实体的指针,对端设备可通过属性句柄来访问该属性,它是一个2字节长度的十六进制码,起始于0x0001,在系统初始化时候,各个属性的句柄逐步加一,最大不超过0xFFFF。
- 属性类型(Attribute Type):作用是用以区分当前属性是服务(Service)或是特征(Characteristics)等。属性类型常用的有:首要服务项(Primary Service)-0x2800、次要服务项(Secondary Service)-0x2801
包含服务项(Include)-0x2802、特征值(Characteristic)-0x2803。这些属性类型的UUID蓝牙标准组织已经对其进行了分类,服务类通用唯一识别码(0x1800 – 0x26FF)、标识计量单位(0x2700 – 0x27FF )、区分属性类型(0x2800 – 0x28FF )、描述符类型(0x2900 – 0x29FF)、区分特征值类型(0x2A00 – 0x7FFF )。常见的属性类型如下表。
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 |
- 属性权限(Attribute Permissions):权限主要有以下四种:
权限 | 说明 |
---|---|
访问权限(Access Permission) | 只读、只写、读写 |
加密权限(Encryption Permission) | 加密、不加密 |
认证权限(Authentication Permission) | 需要认证、无需认证。认证(Authentication)是指相互确认对方身份。完成认证流程的两个设备,双方建立信任关系,二者之间的通信通道即可以认为是安全的。BLE中,“认证”过程就是配对。 |
授权权限(Authorization Permission) | 需要授权、无需授权。授权(Authorization)是指对授信设备开放权利。 |
队列读取权限(prepare write permission) |
认证和授权功能容易混淆,其英文拼写也很相似。从上面的概念上看,授权要求设备必须是可信任的,因此授权的管控等级要高于认证——认证的设备未必被授权,授权的设备一定是认证的。理解二者关系,需要引入一个概念:Trusted Device(可信任设备)一个没有经过认证的设备,被称为Unknown Device(未知设备);经过了认证该设备会在绑定信息中被标记为Untrusted,被称为Untrusted Device(不可信设备);经过了认证,并且在绑定信息中被标记为Trusted的设备被称为Trusted Device(可信设备)。
授权要求设备为Trusted Device(可信任设备)。在实际使用中,经过配对以后设备即为Untrusted Device——认证,在代码中调用API可以设置设备为Trusted Device——授权。
/* GATT attribute permission bit field values */
typedef enum
{
/** No operations supported, e.g. for notify-only */
AIS_GATT_PERM_NONE = 0,
/** Attribute read permission. */
AIS_GATT_PERM_READ = ABIT(0),
/** Attribute write permission. */
AIS_GATT_PERM_WRITE = ABIT(1),
/* Attribute read permission with encryption. */
AIS_GATT_PERM_READ_ENCRYPT = ABIT(2),
/* Attribute write permission with encryption. */
AIS_GATT_PERM_WRITE_ENCRYPT = ABIT(3),
/* Attribute read permission with authentication. */
AIS_GATT_PERM_READ_AUTHEN = ABIT(4),
/* Attribute write permission with authentication. */
AIS_GATT_PERM_WRITE_AUTHEN = ABIT(5),
/* Attribute prepare write permission. */
/*属性队列读取权限*/
AIS_GATT_PERM_PREPARE_WRITE = ABIT(6)
} ais_attr_perm_t;
- 属性值(Attribute Value):保存实际的数据内容,可以通过客户端进行访问。它还可以保存关于属性的数据(这取决于属性类型)。如果该属性是服务项类型或者是特征值声明类型,那么它的属性值就是UUID等信息。如果是普通的特征值,则属性值是用户的数据。属性值需要预留空间以保存用户数据。
属性与服务、属性与特征的关系
一个应用所有的属性(Attributes)组成一个database,也称为Attribute Table,一个Attribute Table示例如下所示:
服务定义(Service Definition)
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 |
特性定义(Characteristic Definition)
Attribute Handle | Attribute Type | Attribute Value | Attribute Permission |
---|---|---|---|
0xNNNN | 0x2803– UUID for Characteristic | 1.Characteristic Properties 2.Characteristic Value Attribute Handle 3.Characteristic UUID | Read Only, No Authentication, No Authorization |
- 1.Characteristic Properties
Properties | Value | Description |
---|---|---|
Broadcast | 0x01 | If set, permits broadcasts of the Characteristic Value using Characteristic Configuration Descriptor |
Read | 0x02 | 如果设置,支持读取特征值 |
Write Without Response | 0x04 | 如果设置,特征进行写入时,服务端可以不给客户端一个应答 |
Write | 0x08 | 如果设置,特征进行写入时,服务端需要给客户端一个应答 |
Notify | 0x10 | 如果设置,当特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时不需要回复 |
Indicate | 0x20 | 如果设置,特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时需要给服务端一个简单的回复 |
Authenticated Signed Writes | 0x40 | If set, permits signed writes to the Characteristic Value. |
Extended Properties | 0x80 | If set, additional characteristic properties are defined in the Characteristic Extended Properties Descriptor. |
参考
深入浅出低功耗蓝牙(BLE)协议栈
低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
Bluetooth GATT介绍
https://microchipdeveloper.com/wireless:ble-gatt-data-organization