原文地址:
https://source.android.com/devices/bluetooth
Android默认提供的蓝牙栈包括两个部分
- BTE(Bluetooth Embedded System)
实现蓝牙的核心功能 - BTA(Bluetooth Application Layer )
和Android framework交互
还需要实现Android 6.0 蓝牙HCI,以便更从分的使用在Android5.0添加的低功耗API
结构
系统蓝牙服务使用JNI与蓝牙栈交互,与应用程序使用Binder IPC。开发人员通系统服务访问蓝牙的各种配置文件(profile)。下图展示蓝牙的结构。
应用层
应用层软件通过蓝牙API与蓝牙硬件交互,应用层通过Binder IPC调用蓝牙API
蓝牙系统服务
蓝牙系统服务作为Android APP,位于packages/apps/Bluetooth目录,还实现了位于Android framework层的蓝牙服务以及profiles接口。通过jni调用HAL层。
应用层Bluetooth APP,作为系统bluetooth的核心进程,主要任务是通过JNI调用Bluetooth HAL层,完成蓝牙请求.
JNI
和蓝牙相关的jni代码位于packages/apps/Bluetooth/jni路径下。JNI调用HAL层代码,当发生某些蓝牙操作发生时,还会接受来自HAL层的回调;比如当发现蓝牙设备时。
HAL
硬件抽象层定义的蓝牙API和蓝牙进程调用的标准接口,实现这些标准接口可保证蓝牙设备的正常工作。硬件抽象层的相关的头文件放在
hardware/libhardware/include/hardware/bt_*.h
HAL 由蓝牙核心规范抽象层和蓝牙应用规范硬件抽象层组成.
Bluetooth stack
默认实现的蓝牙栈位于system/bt 目录下面。该栈实现了通用的蓝牙HAL,通过扩展和更改配置可实现蓝牙的定制。
BTA实现蓝牙设备管理,状态管理和一下规范,与应用程序交互;BTE通过HCI与厂商蓝牙芯片交互,实现蓝牙协议栈的通用功能;而且BTE还包括同意内核接口(GKI ??)
Vendor extensions
通过创建libbt-vendor模块以及制定这些组件,可以实现自定义扩展和HCI层的追踪(??)。
厂商自定义实现的功能和组件
HAL实现
蓝牙HAL位于/hardware/libhardware/include/hardware/bluetooth.h。为与实现与蓝牙栈的交互,需要实现bluetooth.h文件中包含的基本接口。
蓝牙profile文件也位于该目录,详情参看HAL File Reference
部分相关profile,如下
- bt_av.h :定义A2dp profile 接口
- bt_gatt.h, bt_gatt_client.h, and bt_gatt_server.h :这些文件定义了GATT profile接口
- bt_hf.h : 定义HFP profile接口
- bt_hh.h : 定义了HID profile接口
- bt_pan.h: 定义了 PAN profile接口
- bt_rc.h: 定义了AVRCP profile 接口
- bt_sock.h :当以RFCOMM sockets 接口
蓝牙的实现不局限于HAL中定义的功能和配置。在system/bt目录下,能找到蓝牙栈的默认实现,即实现HAL的默认实现以及额外的功能和配置。
自定义蓝牙栈(Customizing the Native Bluetooth Stack)
通过一下步骤可以实现蓝牙默认栈的自定义功能
- 自定义蓝牙配置文件
如果你提供的蓝牙profiles,在android HAL层没有接口,需要以SDK形式提供给开发者,便于开发者使用这些profile,确保这些API在蓝牙系统进程中可用,并将它们添加到默认堆栈中。 - 自定义扩展和配置
通过创建libbt-vendor模块,可以添加额外的AT命令或特定于设备的配置更改。例子位于 /hardware/broadcom/libbt目录 - 主机控制器接口(HCI)
通过创建libbt-hci模块,提供自主的HCI,多用于调试。例子位于 external/bluetooth/hci目录下
翻译仅供参考