蓝牙协议栈

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 PropertiesContains additional declaration property bits
Characteristic User DescriptionContains 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 TypeUUIDDescription
Primary Service0x2800Primary Service Declaration
Secondary Service0x2801Secondary Service Declaration
Include0x2802Include Declaration
Characteristic0x2803Characteristic Declaration
Characteristic Extended Properties0x2900Characteristic Extended Properties
Characteristic User Description0x2901Characteristic User Description Descriptor
Client Characteristic Configuration0x2902Client Characteristic Configuration Descriptor
Server Characteristic Configuration0x2903Server Characteristic Configuration Descriptor
Characteristic Format0x2904Characteristic Format Descriptor
Characteristic Aggregate Format0x2905Characteristic 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 HandleAttribute TypeAttribute ValueAttribute Permission
0xNNNN0x2800 – 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 HandleAttribute TypeAttribute ValueAttribute Permission
0xNNNN0x2803– UUID for Characteristic1.Characteristic Properties
2.Characteristic Value Attribute Handle
3.Characteristic UUID
Read Only,
No Authentication,
No Authorization
  • 1.Characteristic Properties
PropertiesValueDescription
Broadcast0x01If set, permits broadcasts of the Characteristic Value using Characteristic Configuration Descriptor
Read0x02如果设置,支持读取特征值
Write Without Response0x04如果设置,特征进行写入时,服务端可以不给客户端一个应答
Write0x08如果设置,特征进行写入时,服务端需要给客户端一个应答
Notify0x10如果设置,当特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时不需要回复
Indicate0x20如果设置,特征发生变化时,它会主动将新的值告知客户端,而客户端收到这个信息更新时需要给服务端一个简单的回复
Authenticated Signed Writes0x40If set, permits signed writes to the Characteristic Value.
Extended Properties0x80If 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值