什么是BLE GATT
BLE 是 Bluetooth Low Energy 的缩写,即蓝牙低功耗
GATT 是Generic ATtribute Profile 的缩写,它定义了两个低功耗蓝牙设备使用称为Services 和Characteristics的概念来回传输数据的方式。它使用称为属性协议 (ATT)的通用数据协议,该协议用于将Services、Characteristics和相关数据存储在一个简单的查找表中,为表中的每个条目使用 16 位 ID。
一旦在两个设备之间建立了专用连接,GATT 就会开始发挥作用
GATT和连接要记住的最重要的事情是连接是独占的. 这意味着一个BLE外围设备一次只能连接一个主设备(手机等)!一旦外围设备连接到主设备,它将停止广播,并且其他设备将不再能够看到它或连接到它,直到现有连接中断。
建立连接也是允许双向通信的唯一方法,其中主设备可以向外围设备发送有意义的数据,反之亦然。
连接网络拓扑
下图说明低功耗蓝牙设备在连接环境中的工作方式。一个外设一次只能连接一个主设备(如手机),但主设备可以连接多个外设。
然而,一旦在外围设备和主设备之间建立了连接,就可以在两个方向上进行通信,这与仅使用广告数据和 GAP 的单向广播方法不同
GATT 事务处理
理解 GATT 的一个重要概念是 服务器/客户端 关系。
外围设备称为GATT 服务器,它保存 ATT 查找数据以及Services和Characteristics定义,以及GATT 客户端信息
所有事务都由主设备 (GATT 客户端)启动,它接收来自外围设备 (GATT 服务器)的响应。
建立连接时,外围设备会向主设备建议一个“连接间隔”,每个连接间隔超时后,主设备将尝试重新连接,以查看是否有任何新数据可用等。请务必记住,此连接很重要。不过,interval 实际上只是一个建议!你的主设备可能无法响应请求,因为它正忙于与另一个外围设备通信,或者所需的系统资源不可用。
下图说明外围设备(GATT 服务器)和主设备(GATT 客户端)之间的数据交换过程,主设备启动每个事务:
Services和Characteristics
BLE 中的 GATT 事务基于称为Profiles、Services和Characteristics的高级嵌套对象,如下图所示:
Profiles
Profiles实际上并不存在于 BLE 外设上,它只是由蓝牙 SIG 或外设设计人员编译的预定义Services集合。例如,心率Profiles结合了心率Services和设备信息Services。官方采用的基于 GATT 的Profiles的完整列表可以在此处查看:Profiles概览
Services
Services用于将数据分解为逻辑实体,并包含称为Characteristics的特定数据块。一个Services可以有一个或多个Characteristics,每个Services通过一个称为 UUID 的唯一数字 ID 将自己与其他Services区分开来,它可以是 16 位(用于官方采用的 BLE Services)或 128 位(用于自定义Services) )。
官方采用的 BLE Services的完整列表可以在蓝牙开发者门户的Services页面上查看。以Heart Rate Service为例,我们可以看到这个官方采用的Services有一个 0x180D 的 16 位 UUID,并且包含多达 3 个特性,尽管只有第一个是强制性的:心率测量、身体传感器地点和心率控制点。
Characteristics
GATT 事务中最低级别的概念是Characteristics,它封装了单个数据点(尽管它可能包含一组相关数据,例如来自 3 轴加速度计的 X/Y/Z 值等)。
与Services类似,每个特性通过预定义的 16 位或 128 位 UUID 来区分自己,你可以自由使用蓝牙 SIG 定义的标准特性(确保跨 BLE 的硬件/软件的互操作性)或定义你自己的Characteristics,只有你的外围设备和软件才能理解。
例如,心率测量特性对于心率Services是强制性的,并使用 0x2A37 的 UUID。它以描述 HRM 数据格式(数据是 UINT8 还是 UINT16 等)的单个 8 位值开始,然后包含与此配置字节匹配的心率测量数据。
Characteristics是与 BLE 外设交互的要点,因此了解这个概念很重要。它们还用于将数据发送回 BLE 外围设备,也可以写入Characteristics