低功耗蓝牙
引言
大多数人在生活中都接触过蓝牙,可能屏幕前的你现在正佩戴着蓝牙耳机,收听来自手机或电脑的音频。不过,音频传输是经典蓝牙 (Bluetooth Classic) 的典型应用场景,而低功耗蓝牙是一种与经典蓝牙不兼容的蓝牙通信协议,在蓝牙 4.0 中被引入。
低功耗蓝牙的分层架构
低功耗蓝牙协议定义了三层软件结构,自上而下分别是
-
应用层 (Application Layer)
-
主机层 (Host Layer)
-
控制器层 (Controller Layer)
应用层即以低功耗蓝牙为底层通信技术所构建的应用,依赖于主机层向上提供的 API 接口。
主机层负责实现 L2CAP、GATT/ATT、SMP、GAP 等底层蓝牙协议,向上对应用层提供 API 接口,向下通过主机控制器接口 (Host Controller Interface, HCI) 与控制器层通信。
控制器层包括物理层 (Physical Layer, PHY) 和链路层 (Link Layer, LL) 两层,向下直接与控制器硬件进行交互,向上通过 HCI 与主机层进行通信。
值得一提的是,蓝牙核心规范 (Core Specification) 允许主机层和控制器层在物理上分离,此时 HCI 体现为物理接口,包括 SDIO、USB 以及 UART 等;当然,主机层和控制器层可以共存于同一芯片,以实现更高的集成度,此时 HCI 体现为逻辑接口,常被称为虚拟主机控制器接口 (Virtual Host Controller Interface, VHCI)。一般认为,主机层和控制器层组成了低功耗蓝牙协议栈 (Bluetooth LE Stack)。
下图展示了低功耗蓝牙的分层结构。

GAP 层 - 定义设备的连接
GAP 层的全称为通用访问规范 (Generic Access Profile, GAP),定义了低功耗蓝牙设备之间的连接行为以及设备在连接中所扮演的角色。
GAP 状态与角色
GAP 中共定义了三种设备的连接状态以及五种不同的设备角色,如下
-
空闲 (Idle)
-
此时设备无角色,处于就绪状态 (Standby)
-
-
设备发现 (Device Discovery)
-
广播者 (Advertiser)
-
扫描者 (Scanner)
-
连接发起者 (Initiator)
-
-
连接 (Connection)
-
外围设备 (Peripheral)
-
中央设备 (Central)
-
广播者向外广播的数据中包含设备地址等信息,用于向外界设备表明广播者的存在,并告知其他设备是否可以连接。扫描者则持续接收环境中的广播数据包。若某一个扫描者发现了一个可连接的广播者,并希望与之建立连接,可以将角色切换为连接发起者。当连接发起者再次收到该广播者的广播数据,会立即发起连接请求 (Connection Request);在广播者未开启白名单 (Filter Accept List, 又称 White List) 或连接发起者在广播者的白名单之中时,连接将被成功建立。
进入连接以后,原广播者转变为外围设备(旧称从设备 Slave ),原扫描者或连接初始化者转变为中央设备(旧称主设备 Master )。
GAP 角色之间的转换关系如下图所示

GATT/ATT 层 - 数据表示与交换
GATT/ATT 层定义了进入连接状态后,设备之间的数据交换方式,包括数据的表示与交换过程。
ATT 层
ATT 的全称是属性协议 (Attribute Protocol, ATT),定义了一种称为 属性 (Attribute) 的基本数据结构,以及基于服务器/客户端架构的数据访问方式。
简单来说,数据以属性的形式存储在服务器上,等待客户端的访问。以智能开关为例,开关量作为数据,以属性的形式存储在智能开关内的蓝牙芯片(服务器)中,此时用户可以通过手机(客户端)访问智能开关蓝牙芯片(服务器)上存放的开关量属性,获取当前的开关状态(读访问),或控制开关的闭合与断开(写访问)。
属性这一数据结构一般由以下三部分构成
-
句柄 (Handle)
-
类型 (Type)
-
值 (Value)
-
访问权限 (Permissions)
在协议栈实现中,属性一般被放在称为 属性表 (Attribute Table) 的结构体数组中管理。一个属性在这张表中的索引,就是属性的句柄,常为一无符号整型。
属性的类型由 UUID 表示,可以分为 16 位、32 位与 128 位 UUID 三类。 16 位 UUID 由蓝牙技术联盟 (Bluetooth Special Interest Group, Bluetooth SIG) 统一定义,可以在其公开发布的 Assigned Numbers 文件中查询;其他两种长度的 UUID 用于表示厂商自定义的属性类型,其中 128 位 UUID 较为常用。
GATT 层
GATT 的全称是通用属性规范 (Generic Attribute Profile),在 ATT 的基础上,定义了以下三个概念
-
特征数据 (Characteristic)
-
服务 (Service)
-
规范 (Profile)
这三个概念之间的层次关系如下图所示

特征数据和服务都是以属性为基本数据结构的复合数据结构。一个特征数据往往由两个以上的属性描述,包括
-
特征数据声明属性 (Characteristic Declaration Attribute)
-
特征数据值属性 (Characteristic Value Attribute)
除此以外,特征数据中还可能包含若干可选的描述符属性 (Characteristic Descriptor Attribute)。
一个服务本身也由一个属性进行描述,称为服务声明属性 (Service Declaration Attribute)。一个服务中可以存在一个或多个特征数据,它们之间体现为从属关系。另外,一个服务可以通过 Include 机制引用另一个服务,复用其特性定义,避免如设备名称、制造商信息等相同特性的重复定义。
规范是一个预定义的服务集合,实现了某规范中所定义的所有服务的设备即满足该规范。例如 Heart Rate Profile 规范由 Heart Rate Service 和 Device Information Service 两个服务组成,那么可以称实现了 Heart Rate Service 和 Device Information Service 服务的设备符合 Heart Rate Profile 规范。
广义上,我们可以称所有存储并管理特征数据的设备为 GATT 服务器,称所有访问 GATT 服务器以访问特征数据的设备为 GATT 客户端。
更多推荐
所有评论(0)