1.GAP概述
GAP 协议层定义了 BLE 设备的发现流程,设备管理和设备连接的建⽴。 BLE GAP 协议层采⽤ API 调⽤和事件 (Event) 返回的设计模式,通过事件返回来获取 API 在协议栈的处理结果。当对端设备主动发起请求时,也是通过事件返回获取对端设备的状态。BLE 设备定义了四类 GAP ⻆⾊:
• ⼴播者 (Broadcaster):处于这种⻆⾊的设备通过发送⼴播 (Advertising) 让接收者发 现⾃⼰。这种⻆⾊只能发⼴播,不能被连接。
• 观察者 (Observer):处于这种⻆⾊的设备通过接收⼴播事件并发送扫描 (Scan) 请求。这种⻆⾊只能发送扫描请求,不能被连接。
• 外围设备 (Peripheral):当⼴播者接受了观察者发来的连接请求后就会进⼊这种⻆⾊。当设备进⼊了这种⻆⾊之后,将会作为从设备 (Slave) 在链路中进⾏通信。
• 中央设备 (Central):当观察者主动进⾏初始化,并建⽴⼀个物理链路时就会进⼊这 种⻆⾊。这种⻆⾊在链路中同样被称为主设备 (Master)。
2.ATT 属性概述
ATT 属性协议 BLE ⾥⾯的数据以属性 (Attribute) ⽅式存在,每条属性由四个元素组成:
• 属性句柄 (Attribute Handle):正如我们可以使⽤内存地址查找内存中的内容⼀样, ATT 属性的句柄也可以协助我们找到相应的属性,例如第⼀个属性的句柄是 0x0001,第⼆个属性的句柄是 0x0002,以此类推,最⼤可以到 0xFFFF。
• 属性类型 (Attribute UUID):每个数据有⾃⼰需要代表的意思,例如表示温度、发射 功率、电池等等各种各样的信息。蓝⽛组织 (Bluetooth SIG) 对常⽤的⼀些数据类型 进⾏了归类,赋予不同的数据类型不同的标识码 (UUID)。例如 0x2A09 表示电池信 息,0x2A6E 表示温度信息。UUID 可以是 16 ⽐特的 (16-bit UUID),也可以是 128 ⽐ 特的 (128-bit UUID)。
• 属性值 (Attribute Value):属性值是每个属性真正要承载的信息,其他 3 个元素都是 为了让对⽅能够更好地获取属性值。有些属性的⻓度是固定的,例如电池属性 (Battery Level) 的⻓度只有 1 个字节,因为需要表示的数据仅有 0~100%,⽽ 1 个字 节⾜以表示 1~100 的范围;⽽有些属性的⻓度是可变的,例如基于 BLE 实现的透 传模块。
• 属性许可 (Attribute Permissions):每个属性对各⾃的属性值有相应的访问限制,⽐ 如有些属性是可读的、有些是可写的、有些是可读⼜可写的等等。拥有数据的⼀⽅ 可以通过属性许可,控制本地数据的可读写属性。
3.GATT 规范概述
ATT 属性协议规定了在 BLE 中的最⼩数据存储单位,⽽ GATT 规范则定义了如何⽤特性值 和描述符表示⼀个数据,如何把相似的数据聚合成服务 (Service),以及如何发现对端设备 拥有哪些服务和数据。 GATT 规范引进了特性值的概念。这是由于在某些时候,⼀个数据可能并不只是单纯的数 值,还会带有⼀些额外的信息: ⽐如这个数据的单位是什么?是重量单位千克 kg、温度单位摄⽒度 ℃,还是其他单 位; ⽐如希望具体告知对⽅这个数值的名称,例如同为温度属性 UUID 下,希望告知对 ⽅该数据表示“主卧温度”,另⼀个数据表示“客厅温度”; ⽐如在表示 230000、460000 等⼤数据时,可以增加指数信息,告知对⽅该数据的 指数是 10^4,这样仅需在空中传递 23、46 即可。 上述内容仅为清楚描述⼀个数据众多需求中的⼏个例⼦,实际应⽤中还可能出现其他以各 种⽅式表达的数据需求。为了包含这些信息,每个属性中均需要安排⼀⼤段数据空间,存 储这些额外信息。然⽽,⼀个数据很有可能⽤不到绝⼤部分的额外信息,因此这种设计并 这不符合 BLE “协议尽可能精简”的要求。在此背景下,GATT 规范引进了描述符的概念, 每种描述符可以表达⼀种意思,⽤户可使⽤描述符,描述数据的额外信息。必需说明的是, 每个数据和描述符并⾮⼀⼀对应,即⼀个复杂的数据可以拥有多个描述符,⽽⼀个简单的 数据可以没有任何描述符。
蓝⽛低功耗 数据本身的属性值及其可能携带的描述符,构成了特性 (Characteristic)* 的概念。数据特 性包含以下⼏个部分:
• 特性声明 (Characteristic Declaration):主要告诉对⽅此声明后⾯跟的内容为特性数 值。从当前特性声明开始到下⼀个特性声明之间的所有句柄 (Handle) 将构成⼀个完 整的特性。此外,特性声明还包括紧跟其后的特性数值的可写可读属性信息。
• 特性数值 (Characteristic Value):特性的核⼼部分,⼀般紧跟在特性声明后⾯,承载 特性的真正内容。
• 描述符 (Descriptor):描述符可以对特性进⾏进⼀步描述,每个特性可以有多个描述 符,也可以没有描述符。 BLE 协议中会把⼀些常⽤的功能定义成⼀个个的服务 (Service)*,例如把电池相关的特性 和⾏为定义成电池服务 (Battery Service);把⼼率测试相关的特性和⾏为定义成⼼跳服务 (Heart Rate Service);把体重测试相关的特性和⾏为定义成体重服务 (Weight Scale Service)。 可以看到,每个服务包含若⼲个特性,每个特性包含若⼲个描述符。⽤户可以根据⾃⼰的 应⽤需求选择需要的服务,并组成最终的产品应⽤。 ⼀个完整服务的特性定义参考如下:
4.GATT 客户端服务发现示例
GATT 客户端需要具有发现对⽅设备的服务和特性的功能 (Service Discovery)。不同的设备 可能会使⽤不同的发现流程,下⾯以查找对⽅设备的 GATT 服务为例:
1.⾸先发现对⽅所有的 Service 信息,包括 Service 的 UUID 和 Handle 范围 - GATT Service,UUID 0x1801,Handles 0x0001~0x0005 - GAP Service,UUID 0x1800,Handles 0x0014~0x001C
2.然后在 GATT 的 Handle 范围内 (0x0001~0x0005),继续查找所有的特性 (0x2803) - 找到特性 "Service Change Characteristic”,Handles 0x0002~0x0003 - 其中 0x0002 对应的是这个特性的特性声明 - 其中 0x0003 对应的是这个特性的特性值 - 所以每个特性⾄少需要占据 2 个 Handle 的属性
3.既然 GATT Service 的 Handles 范围是 0x0001~0x0005,所以在 0x0003 后⾯可能跟 有相应的描述符,因此继续从 0x0004 开始查找所有的描述符