蓝牙

Android 提供支持经典蓝牙和蓝牙低功耗的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。

在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 Android 蓝牙 HCI 要求。具有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经典蓝牙和 BLE。BLE 不能向后兼容较旧版本的蓝牙芯片组。

在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的要求。要使用可用的蓝牙 5 功能,该设备需要具有符合蓝牙 5 要求的芯片组。

注意:Android 8.0 及以前版本之间的原生蓝牙堆栈的最大变化是使用 高音。Android 8.0 中的供应商实现必须使用 HIDL 而不是  libbt-vendor

Android 8.0 架构

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

图 1 Android 8.0 蓝牙架构

应用框架
处于应用框架级别的是应用代码,它使用  android.bluetooth API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
蓝牙系统服务
蓝牙系统服务(位于  packages/apps/Bluetooth 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。
JNI
与 android.bluetooth 相关联的 JNI 代码位于  packages/apps/Bluetooth/jni 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。
蓝牙堆栈
系统在 AOSP 中提供了默认蓝牙堆栈,它位于  system/bt 中。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
供应商实现
供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。

HIDL

HIDL 定义了蓝牙堆栈和供应商实现之间的接口。要生成蓝牙 HIDL 文件,请将蓝牙接口文件传递到 HIDL 生成工具中。接口文件位于 hardware/interfaces/bluetooth 下。

蓝牙堆栈开发

Android 8.0 蓝牙堆栈是一个完全限定的蓝牙堆栈。限定列表位于蓝牙 SIG 网站上的 QDID 97584 下。

核心蓝牙堆栈位于 system/bt 下。开发工作在 AOSP 中进行,欢迎贡献内容。

Android 7.x 及更早版本的架构

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

图 2. Android 7.x 及更早版本的蓝牙架构

应用框架
处于应用框架级别的是应用代码,它利用  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 文件参考。

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. python list.sort()根据多个关键字排序的方法实现
  3. Android(安卓)创建与解析XML(一)—— 概述
  4. Android(安卓)绑定Service 实现android控制service的生命周期
  5. [置顶] 安卓视频播放器 一行代码快速实现视频播放,Android视频播
  6. Android中显示输入的隐藏密码/Android多语系支持
  7. Android(安卓)HIDL第一个HelloWorld demo
  8. 代码实现Android流量统计
  9. [Android(安卓)新特性] 15项大改进 Android(安卓)4.4新特性解析

随机推荐

  1. Android(安卓)SeekBar自定义使用图片和颜
  2. Android开发资料推荐之20个Android游戏源
  3. Android软键盘弹出,布局没有上移的解决办
  4. android学习路线和环境搭建、推荐一个博
  5. Android(安卓)BroadcastReceiver 简介
  6. Android(安卓)CTS Tips
  7. 安卓巴士Android开发神贴整理
  8. 常用的android权限配置和常用工具代码
  9. Android(安卓)5.1状态栏背景色定制 在Lau
  10. Android应用安装错误:INSTALL_FAILED_MEDI