【BLE进阶日记】专栏目录
第一章 BLE介绍
第二章 BLE协议基础知识
第三章 BLE–GAP (Advertising and Connections)
第四章 BLE–GATT (Services and Characteristics)
第五章 BLE硬件平台
第六章 BLE调试工具
第七章 嵌入式应用程序开发
文章目录
前言
本专栏旨在提供对低功耗蓝牙的一个坚实的、实用的、高水平的理解:数据是如何组织的,设备之间如何相互通信,以及协议设计团队所
做出的关键设计决策和权衡。
1. 第1~4章提供了低功耗蓝牙技术的高级概述,解释了数据是如何组织的以及它的关键限制,同时也介绍了所有你在使用BLE时可能遇到
的关键概念。
2. 第5~6章介绍用于开发或对支持ble的应用程序或设备进行测试的有用工具(包括硬件和软件)。这些章节集中在低成本,易于访问的
工具,以帮助你开始低成本开发。
3. 第7章介绍了您可能为BLE使用的主要开发平台(用于产品设计和嵌入式硬件工程师的各种嵌入式电子平台)。
本专栏提供了示例代码,您可以免费在程序和文档中使用它。
本章概述了通用属性配置文件(GATT),该配置文件建立了在BLE中用于表示和操作数据的层次结构和格式。它介绍了服务和特征的基本概念,以及允许连接设备彼此交换数据的过程。
一、GATT简介
通用属性配置文件(GATT)详细规定了如何在BLE连接中交换所有配置文件和用户数据。与定义与设备进行低级交互的GAP相反,GATT仅处理实际的数据传输过程和格式。
GATT还为所有基于GATT的配置文件提供参考框架,这些配置文件涵盖精确的用例并确保来自不同供应商的设备之间的互操作性。因此,所有标准的BLE配置文件都是基于GATT的,并且必须符合它才能正常运行。这使得GATT成为BLE规范的关键部分,因为与应用程序和用户相关的每个数据项必须根据其规则进行格式化、打包和发送。
GATT使用属性协议作为其设备之间交换数据的传输协议。这些数据以services的形式按层次结构组织,并且services将概念上相关的用户数据片段称为characteristics。这决定了本章讨论的GATT的许多基本方面。
二、Roles
与蓝牙规范中的其他协议或配置文件一样,GATT从定义相互交互设备可以采用的角色开始:
- Client:
GATT客户端对应于“属性协议(ATT)”中讨论的ATT客户端,它向服务器发送请求并接收其响应(以及服务器发起的更新)。GATT客户端事先不知道服务器的属性情况,因此必须通过执行服务发现来了解属性的存在和性质。完成服务发现后,它可以开始读取和写入服务器中找到的属性,并接收服务器发起的更新。 - Server:
GATT服务器对应于“属性协议(ATT)”中讨论的ATT服务器,它从客户端接收请求并发送响应。它还在配置为这样做时发送服务器发起的更新,负责存储并提供用户数据给客户端,以属性组织。每个出售的BLE设备都必须包含至少一个基本的GATT服务器,即使只能返回错误响应也可以。
值得再次提到的是,GATT角色既与GAP角色完全独立,同时又相互兼容。这意味着GAP中央和GAP外围设备都可以作为GATT客户端或服务器,甚至可以同时充当两者角色。
三、UUIDs
通用唯一标识符(UUID)是一个128位(16字节)的数字,被保证是全球唯一的(或具有很高的概率)。UUIDs 在许多协议和应用程序中使用,除了蓝牙之外。它们的格式、用法和生成规范在ITU-T Rec. X.667中详细规定,也被称为ISO/IEC 9834-8:2005。
为了提高效率,因为16字节会占用链路层27字节数据负载长度的大部分,蓝牙低功耗(BLE)规范添加了两种额外的 UUID 格式:16位和32位的 UUIDs。这些缩短的格式只能用于在蓝牙规范中定义的 UUIDs(即,在蓝牙SIG列为标准蓝牙 UUIDs的 UUIDs)。
要从缩短的版本中恢复到完整的128位 UUID,将16位或32位的短值(由xxxxxxxx表示,包括前导零)插入到蓝牙基本UUID中:
xxxxxxxx-0000-1000-8000-00805F9B34FB
SIG 为其定义和规定的所有类型、服务和配置文件提供了(缩短的)UUIDs。但如果您的应用程序需要自己的 UUIDs,要么是因为 SIG 提供的 UUIDs 不满足您的要求,要么是因为您希望实现先前未考虑在配置文件规范中的新用例,您可以使用ITU的UUID生成页面来生成它们。
对于不是基于蓝牙基本UUID生成的UUIDs(通常称为特定供应商UUIDs),无法使用缩短。在这些情况下,您将始终需要使用完整的128位UUID值。
四、属性
属性是由GATT(和ATT)定义的最小数据实体。它们是可寻址的信息片段,可以包含有关服务器中不同属性的结构和分组的相关用户数据(或元数据)。GATT和ATT只能使用属性进行工作,因此为了使客户端和服务器进行交互,所有信息都必须以这种形式组织。
从概念上讲,属性始终位于服务器上,并由客户端访问(并可能被修改)。规范仅在概念上定义属性,并不强制ATT和GATT的实现使用特定的内部存储格式或机制。因为属性既包含不变的静态定义,又包含随时间快速变化的实际用户(通常是传感器)数据,所以属性通常存储在非易失性存储器和RAM的混合中。
每个属性都包含有关属性本身以及在以下部分描述的实际数据的信息。
1、句柄
属性句柄是特定GATT服务器上每个属性的唯一16位标识符。它是使属性可寻址的部分,并且在事务之间保证不会更改,对于已配对设备来说,即使在连接之间也不会更改。由于值0x0000表示无效的句柄,每个GATT服务器可用句柄的数量为0xFFFE(65535),尽管实际上,服务器中的属性数量通常接近几十个。
在使用属性句柄的上下文中,句柄范围一词指的是受到两个给定边界限制的包含句柄的所有属性。例如,句柄范围0x0100-0x010A将指代句柄在0x0100到0x010A之间的任何属性。
在GATT服务器中,句柄递增的值确定客户端可以访问的属性的有序序列。但是句柄之间可以存在间隙,因此客户端不能依靠连续的序列来猜测下一个属性的位置。相反,客户端必须使用发现功能获取感兴趣的属性的句柄。
2、类型
属性类型无非是UUID。它可以是16位、32位或128位的UUID,分别占用2、4或16字节。属性类型决定了属性值中存在的数据类型,并提供了根据类型发现属性的机制。
虽然属性类型始终是UUID,但可以使用多种类型的UUID来填充类型。它们可以是标准UUID,用于确定GATT服务器的属性层次结构的布局,例如服务或特征UUID,也可以是指定属性中包含的数据类型的配置文件UUID,例如心率测量或温度,甚至可以是专有的、供应商特定的UUID,其含义由供应商分配并取决于实现。
3、权限
权限是元数据,用于指定可以在每个特定属性上执行哪些ATT操作以及具体的安全要求。
ATT和GATT定义了以下权限:
- 访问权限:
类似于文件权限,访问权限确定客户端是否可以读取或写入(或二者