Android 为中心设备角色提供了内置的低功耗蓝牙 (BLE) 平台支持,并提供了应用程序可用于发现设备、查询服务和传输信息的 API。
常见的用例包括:
在附近的设备之间传输少量数据。
与近程传感器交互,根据用户的当前位置提供定制化的体验。
与经典蓝牙相比,BLE 专为显著降低功耗而设计。这使得应用能够与功耗要求更严格的 BLE 设备(如近程传感器、心率监测器和健身设备)进行通信。
注意:当用户使用 BLE 将其设备与另一台设备配对时,两个设备之间传输的数据对于用户设备上的所有应用都是可见的。
因此,如果您的应用捕获了敏感数据,则应实现应用层安全机制以保护该数据的隐私。
基础知识
为了让支持 BLE 的设备能够相互传输数据,它们必须先建立通信通道。使用 Bluetooth LE API 需要您在清单文件中声明多项权限。一旦您的应用获得了使用蓝牙的权限,就需要访问 BluetoothAdapter 并确定设备上是否可用蓝牙。如果蓝牙可用,设备将扫描附近的 BLE 设备。找到设备后,通过连接到 BLE 设备上的 GATT 服务器来发现 BLE 设备的功能。连接建立后,即可根据可用的服务和特征与已连接的设备传输数据。
关键术语和概念
以下是 BLE 关键术语和概念的摘要:
通用属性配置文件 (GATT)
GATT 配置文件是一项通用规范,用于通过 BLE 链路发送和接收称为“属性”(attributes) 的短数据片段。目前所有的 BLE 应用配置文件均基于 GATT。请查看 GitHub 上的 Android BluetoothLeGatt 示例以了解详情。
配置文件 (Profiles)
Bluetooth SIG 为 BLE 设备定义了许多配置文件。配置文件是关于设备在特定应用中如何工作的规范。请注意,一个设备可以实现多个配置文件。例如,设备可以同时包含心率监测器和电量检测器。
属性协议 (ATT)
GATT 是建立在属性协议 (ATT) 之上的,这也称为 GATT/ATT。ATT 针对在 BLE 设备上运行进行了优化。为此,它尽可能使用最少的字节。每个属性都由通用唯一识别码 (UUID) 唯一标识,UUID 是一种标准的 128 位格式,用于唯一标识信息。ATT 传输的属性格式化为特征和服务。
特征 (Characteristic)
特征包含一个值和 0 到 n 个描述该特征值的描述符。特征可以被看作是一种类型,类似于类 (class)。
描述符 (Descriptor)
描述符是用于描述特征值的已定义属性。例如,描述符可以指定人类可读的描述、特征值的可接受范围或特定于特征值的度量单位。
Service
服务是特征的集合。例如,您可以拥有一个名为“心率监测器”的服务,其中包含诸如“心率测量”之类的特征。您可以在 bluetooth.org 上找到现有基于 GATT 的配置文件和服务列表。
角色和职责
当设备与 BLE 设备交互时,角色和职责以两种不同的方式划分:
中心设备与外围设备 (Central vs Peripheral)。 这适用于 BLE 连接本身——处于中心角色的设备负责扫描并查找广播,处于外围角色的设备负责发送广播。两个仅支持外围角色的设备无法相互通信,两个仅支持中心角色的设备也无法通信。
GATT 服务器与 GATT 客户端 (GATT server vs GATT client)。 这决定了两个设备建立连接后如何进行通信。处于客户端角色的设备发送数据请求,处于服务器角色的设备负责满足这些请求。
为了理解中心-外围与服务器-客户端角色划分之间的区别,请考虑这样一个例子:您有一部 Android 手机和一个将传感器数据传回手机的 BLE 活动追踪器。
手机(中心设备)主动扫描 BLE 设备。活动追踪器(外围设备)发送广播并等待接收连接请求。
手机与活动追踪器建立连接后,它们开始向对方传输 GATT 元数据。在这种情况下,运行在手机上的应用发送数据请求,因此它充当 GATT 客户端。活动追踪器负责满足这些请求,因此它充当 GATT 服务器。
该应用的另一种设计可能涉及让手机扮演 GATT 服务器的角色。有关更多信息,请参阅 BluetoothGattServer。