
本文共 2702 字,大约阅读时间需要 9 分钟。
TI BLE Profile详解
BLE 协议栈的 GATT 层是用于应用程序在两个连接设备之间的数据通信。从 GATT 层的角度看,当设备连接后,设备将充当以下两种角色之一:
- GATT Client:从 GATT 服务器读取或写入数据的设备
- GATT Server:包含客户端需要读取或写入的数据的设备
需要注意的是,GATT Client 和 Server 的角色与 BLE 的链路层(slave 和 master)或 GAP 层(peripheral 和 central)的角色是完全独立的。在这一点上,一个 slave 或 master 也可以同时作为 GATT Client 或 GATT Server。
一个 GATT Server 可以包含多个完成特定功能或特性 GATT Server 组成。在 SimpleBLEPeripheral(从机)应用程序中,有三个 GATT 服务:
什么是 Profile?
为了确保 Bluetooth 设备之间的兼容性, Bluetooth 规范定义了 Profile。Profile 可以被理解为连接层或应用层协议,提供设备之间特定功能的实现。Bluetooth 的一个重要特性是,所有的 Bluetooth 产品不需要实现全部的 Bluetooth 规范。开发者可以根据所需实现的功能选择性地实现所需的 Profile,而无需承担额外的开发开销。例如,当需要利用蓝牙提供数据传输功能时,就必须建立对应的 Profile。TI 的 BLE 协议栈为我们提供了部分 Profile,其中包括一些非标准的 Profile,如 SimpleGATTProfile 和 SimpleKeysProfile。通过对这两个 Profile 的介绍和实验,我们可以更好地了解 Profile 的特性和使用方法。
每个 Profile 在初始化时会响应其特定的服务和内部寄存器。GATT 服务器将整个服务添加到属性表中,并为每个属性分配唯一的句柄。GATT Profile 用于存储和处理 GATT 服务器中的数据。
GATT 服务器通过一个称为属性表的表格组织数据,这些数据是真正用于发送的数据。属性表中的每个属性都包括以下信息:
- UUID:属性表中数据类型的信息,是理解属性表中值的关键信息。
- handle:属性在 GATT 表中的索引,设备中每个属性的句柄都是唯一的。
- Characteristic Values:属性的实际值。
需要注意的是,GATT 表中可以包含多个属性,但这些属性可能具有相同的 UUID。
Android Bluetooth Profile详解
Android 中常用的 Bluetooth Profile 包括 SPP(有线通道)、A2DP(高级音频分布 Profile)、AVRCP(音视频遥控 Profile)、HID(人类接口设备 Profile)和 HFP(无线头戴设备 Profile)。其中 A2DP 和 AVRCP 是 Media 相关 Profile,经常用于数据通信,而 SPP 是基础 Profile。
Bluetooth Profile 的概念
Profile 定义了一种基于 Bluetooth 的应用,规范通常包括:- 针对开发者的接口
- 消息的格式和标准(如音频压缩)
- 使用的蓝牙协议栈组件
每个 Profile 对应一个 UUID,类似于 TCP/IP 中端口的概念。Bluetooth 使用 SDP(服务发现协议)来发现设备支持的 Profile。SDP Client 根据 SDP 服务 daemon 的信息完成 Profile 的发现和鉴别。
需要注意的是,基础 Profile 包括 GAP 和 SDP,而 SPP 通常作为其他 Profile 的实现基础。
Bluetooth UUID 的概念
UUID 是一种分布式 ID 生成方式,在 Bluetooth SIG 中定义的 Profile UUID 采用特定的格式:- BASE_UUID + uuid16 < 96 或 BASE_UUID + uuid32 < 96 其中,BASE_UUID 为 00000000-0000-1000-8000-00805F9B34FB。
例如,A2DP_UUID 为 0000110B-0000-1000-8000-00805F9B34FB。在 Android 的 logcat 输出中经常可以看到 00805F9B34FB 的字串。
需要注意的是,SPP 是唯一的 Android 完全开放的 Bluetooth Profile,其 UUID 可以自定义,但设备双方必须事先共享 UUID。SPP 通信方式类似于 Linux 的 TCP socket,需要注意客户端接入后如何处理以及是否需要另起线程等问题。
A2DP 是实现音频和多媒体功能的重要 Profile。在 Android 中,A2DP 的相关 API 大部分为 @hide,开发者需要通过反射获取相关 API。A2DP 的 API 与 Android API Level 的对应关系将在后续文档中总结。
HID 和 AVRCP
HID 是标准的输入输出 Profile,常用于键盘、鼠标等设备。例如,可以利用 HID Profile 实现一些简单的远程按键控制。在 Android 中,HID 事件的捕获与 backKey 的处理方式类似,可以通过 View.OnKeyListener 的 onKey 方法捕获对应的 keyCode。AVRCP 主要用于多媒体播放控制,与 HID 类似,但具体事件定义在 Android 的键盘布局中,用于定义音量键、播放暂停键等。
HFP
HFP 是车载设备中常用的 Profile,类似于 A2DP,支持 HFP 和 A2DP 的设备。Bluetooth 在蓝牙打开的情况下会自动连接。通过以上 Profile 的理解和实践,可以更好地掌握蓝牙通信的实现细节,提升开发效率。