| <html devsite><head> |
| <title>蓝牙</title> |
| <meta name="project_path" value="/_project.yaml"/> |
| <meta name="book_path" value="/_book.yaml"/> |
| </head> |
| <body> |
| <!-- |
| Copyright 2017 The Android Open Source Project |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); you may |
| not use this file except in compliance with the License. You may obtain a |
| copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| License for the specific language governing permissions and limitations |
| under the License. |
| --> |
| <figure> |
| <img style="float: right; margin: 0px 15px 15px 15px;" src="/devices/bluetooth/images/ape_fwk_hal_bluetooth.png" alt="Android 蓝牙 HAL 图标"/> |
| </figure> |
| |
| <p> |
| Android 提供支持经典蓝牙和蓝牙低功耗的默认蓝牙堆栈。借助蓝牙,Android 设备可以创建个人区域网络,以便通过附近的蓝牙设备发送和接收数据。 |
| </p> |
| |
| <p> |
| 在 Android 4.3 及更高版本中,Android 蓝牙堆栈可提供实现蓝牙低功耗 (BLE) 的功能。要充分利用 BLE API,请遵循 <a href="/devices/bluetooth/hci_requirements.html">Android 蓝牙 HCI 要求</a>。具有合格芯片组的 Android 设备可以实现经典蓝牙或同时实现经典蓝牙和 BLE。BLE 不能向后兼容较旧版本的蓝牙芯片组。 |
| </p> |
| |
| <p> |
| 在 Android 8.0 中,原生蓝牙堆栈完全符合蓝牙 5 的要求。要使用可用的蓝牙 5 功能,该设备需要具有符合蓝牙 5 要求的芯片组。 |
| </p> |
| |
| <aside class="note"><strong>注意</strong>:Android 8.0 及以前版本之间的原生蓝牙堆栈的最大变化是使用<a href="/devices/architecture/treble.html">高音</a>。Android 8.0 中的供应商实现必须使用 HIDL 而不是 <code>libbt-vendor</code>。</aside> |
| |
| <h2 id="architecture-android-80">Android 8.0 架构</h2> |
| |
| <p> |
| 蓝牙应用通过 Binder 与蓝牙进程进行通信。蓝牙进程使用 JNI 与蓝牙堆栈通信,并向开发者提供对各种蓝牙配置文件的访问权限。 |
| 下图显示了蓝牙堆栈的常规结构: |
| </p> |
| |
| <figure id="figure1"> |
| <img src="/devices/bluetooth/images/fluoride_architecture.png" alt="Android 8.0 蓝牙架构"/> |
| <figcaption> |
| <strong>图 1</strong> Android 8.0 蓝牙架构 |
| </figcaption> |
| </figure> |
| |
| <dl> |
| <dt>应用框架</dt> |
| <dd> |
| 处于应用框架级别的是应用代码,它使用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。 |
| </dd> |
| |
| <dt>蓝牙系统服务</dt> |
| <dd> |
| 蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。 |
| </dd> |
| |
| <dt>JNI</dt> |
| <dd> |
| 与 android.bluetooth 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用蓝牙堆栈。 |
| </dd> |
| |
| <dt>蓝牙堆栈</dt> |
| <dd> |
| 系统在 AOSP 中提供了默认蓝牙堆栈,它位于 <code>system/bt</code> 中。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。 |
| </dd> |
| |
| <dt>供应商实现</dt> |
| <dd> |
| 供应商设备使用硬件接口设计语言 (HIDL) 与蓝牙堆栈交互。 |
| </dd> |
| </dl> |
| |
| <h3 id="hidl">HIDL</h3> |
| <p> |
| <a href="/devices/architecture/hidl.html">HIDL</a> 定义了蓝牙堆栈和供应商实现之间的接口。要生成蓝牙 HIDL 文件,请将蓝牙接口文件传递到 HIDL 生成工具中。接口文件位于 <a href="https://android.googlesource.com/platform/hardware/interfaces/+/master/bluetooth/" class="external"><code>hardware/interfaces/bluetooth</code></a> 下。 |
| </p> |
| |
| <h3 id="bluetooth-stack-development">蓝牙堆栈开发</h3> |
| <p> |
| Android 8.0 蓝牙堆栈是一个完全限定的蓝牙堆栈。限定列表位于蓝牙 SIG 网站上的 <a href="https://www.bluetooth.org/tpg/QLI_viewQDL.cfm?qid=35890">QDID 97584</a> 下。 |
| </p> |
| |
| <p> |
| 核心蓝牙堆栈位于 <code><a href="https://android.googlesource.com/platform/system/bt/+/master"> |
| system/bt</a></code> 下。开发工作在 AOSP 中进行,欢迎贡献内容。 |
| </p> |
| |
| <h2 id="architecture-android-7x-and-earlier">Android 7.x 及更早版本的架构</h2> |
| <p>蓝牙系统服务通过 JNI 与蓝牙堆栈进行通信,并通过 Binder IPC 与应用通信。系统服务向开发者提供了对各种蓝牙配置文件的访问权限。下图显示了蓝牙堆栈的常规结构: |
| </p> |
| |
| <figure id="figure2"> |
| <img src="/devices/bluetooth/images/ape_fwk_bluetooth.png" alt="Android 蓝牙架构"/> |
| <figcaption> |
| <strong>图 2.</strong> Android 7.x 及更早版本的蓝牙架构 |
| </figcaption> |
| </figure> |
| |
| <dl> |
| <dt>应用框架</dt> |
| <dd>处于应用框架级别的是应用代码,它利用 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。 |
| </dd> |
| |
| <dt>蓝牙系统服务</dt> |
| <dd>蓝牙系统服务(位于 <code>packages/apps/Bluetooth</code> 中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。该应用通过 JNI 调用 HAL 层。 |
| </dd> |
| |
| <dt>JNI</dt> |
| <dd>与 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> 相关联的 JNI 代码位于 <code>packages/apps/Bluetooth/jni</code> 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。 |
| </dd> |
| |
| <dt>HAL</dt> |
| <dd>硬件抽象层定义了 <a href="http://developer.android.com/reference/android/bluetooth/package-summary.html">android.bluetooth</a> API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。 |
| 蓝牙 HAL 的头文件是 <code>hardware/libhardware/include/hardware/bluetooth.h</code>。 |
| 另外,请查看所有 <code>hardware/libhardware/include/hardware/bt_*.h</code> 文件。 |
| </dd> |
| |
| <dt>蓝牙堆栈</dt> |
| <dd>系统为您提供了默认蓝牙堆栈(位于 <code>system/bt</code> 中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。 |
| </dd> |
| |
| <dt>供应商扩展</dt> |
| <dd>要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。 |
| </dd> |
| |
| </dl> |
| |
| <h3 id="implementing-the-hal">实现 HAL</h3> |
| <p>蓝牙 HAL 位于 <code>/hardware/libhardware/include/hardware/bluetooth.h</code> 中。 |
| <code>bluetooth.h</code> 文件包含蓝牙堆栈的基本接口,而且您必须实现其功能。</p> |
| |
| <p>特定于配置文件的文件位于同一目录下。有关详情,请参阅 <a href="/reference/hal/dir_6b11132f1a015b03f2670f21bef1d871.html">HAL 文件参考</a>。 |
| </p> |
| |
| </body></html> |