蓝牙

Android 蓝牙 HAL 图标

Android 提供了一个默认蓝牙堆栈,该堆栈具有以下两个层级:实现核心蓝牙功能的蓝牙嵌入式系统 (BTE) 以及与 Android 框架应用通信的蓝牙应用层 (BTA)。

要充分利用 Android 5.0 中添加的蓝牙低功耗 API,您应实现 Android 6.0 蓝牙 HCI 要求。该文档最初是作为 Android 5.0 蓝牙 HCI 要求编写而成。

架构

蓝牙系统服务通过 JNI 与蓝牙堆栈进行通信,并通过 Binder IPC 与应用通信。系统服务向开发者提供了对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构:

Android 蓝牙架构

图 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.hbt_gatt_client.hbt_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 目录。