![Android 蓝牙 HAL 图标](https://source.android.google.cn/static/docs/core/images/ape_fwk_hal_bluetooth.png?authuser=5&hl=tr)
Android 提供了一个默认蓝牙堆栈,该堆栈具有以下两个层级:实现核心蓝牙功能的蓝牙嵌入式系统 (BTE) 以及与 Android 框架应用通信的蓝牙应用层 (BTA)。
要充分利用 Android 5.0 中添加的蓝牙低功耗 API,您应实现 Android 6.0 蓝牙 HCI 要求。该文档最初是作为 Android 5.0 蓝牙 HCI 要求编写而成。
架构
蓝牙系统服务通过 JNI 与蓝牙堆栈进行通信,并通过 Binder IPC 与应用通信。系统服务向开发者提供了对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:
![Android 蓝牙架构](https://source.android.google.cn/static/docs/core/images/ape_fwk_bluetooth.png?authuser=5&hl=tr)
图 1. 蓝牙架构
- 应用框架
- 处于应用框架级别的是应用代码,它利用 android.bluetooth API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
- 蓝牙系统服务
- 蓝牙系统服务(位于
packages/apps/Bluetooth
中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。该应用通过 JNI 调用 HAL 层。 - JNI
- 与 android.bluetooth 相关联的 JNI 代码位于
packages/apps/Bluetooth/jni
中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。 - HAL
- 硬件抽象层定义了 android.bluetooth API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。蓝牙 HAL 的头文件是
hardware/libhardware/include/hardware/bluetooth.h
。另外,请查看所有hardware/libhardware/include/hardware/bt_*.h
文件。 - 蓝牙堆栈
- 系统为您提供了默认蓝牙堆栈(位于
system/bt
中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。 - 供应商扩展程序
- 要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。
实现 HAL
蓝牙 HAL 位于 /hardware/libhardware/include/hardware/bluetooth.h
中。因此,bluetooth.h
文件包含蓝牙堆栈的基本接口,并且您必须实现其功能。
特定于配置文件的文件位于同一目录中。有关详情,请参阅 HAL 文件参考。
以下是与配置文件相关的文件的部分列表。有关完整列表,请参阅 /hardware/libhardware/include/hardware/
目录:
bt_av.h
:包含 A2DP 配置文件的接口定义。bt_gatt.h
、bt_gatt_client.h
和bt_gatt_server.h
:包含 GATT 配置文件的接口定义。bt_hf.h
:包含 HFP 配置文件的接口定义。bt_hh.h
:包含 HID 主机配置文件的接口定义。bt_hl.h
:包含 HDP 配置文件的接口定义。bt_mce.h
:包含 MAP 配置文件的接口定义。bt_pan.h
:包含 PAN 配置文件的接口定义。bt_rc.h
:包含 AVRCP 配置文件的接口定义。bt_sock.h
:包含 RFCOMM 套接字的接口定义。
请记住,您的蓝牙实现不限于 HAL 中提供的功能和配置文件。您可以在 system/bt
目录中找到蓝牙堆栈中的默认实现,该堆栈实现了默认的 HAL 以及其他功能和自定义设置。
自定义原生蓝牙堆栈
如果您使用的是默认蓝牙堆栈,但想要进行一些自定义设置,则可以执行以下操作:
- 自定义蓝牙配置文件 - 如果要添加没有由 Android 提供的 HAL 接口的蓝牙配置文件,则必须提供 SDK 插件下载方式,以使配置文件可供应用开发者使用,使这些 API 在蓝牙系统->进程应用 (
packages/apps/Bluetooth
) 间可用,并将它们添加到默认堆栈 (system/bt
)。 - 自定义供应商扩展程序和配置更改 - 您可以通过创建
libbt-vendor
模块来添加内容,例如额外的 AT 命令或特定于设备的配置更改。有关示例,请参阅/hardware/broadcom/libbt
目录。 - 主机控制器接口 (HCI) - 您可以通过创建一个主要用于调试跟踪的
libbt-hci
模块来提供自己的 HCI。有关示例,请参阅external/bluetooth/hci
目录。