| <html devsite><head> |
| <title>蓝牙低功耗</title> |
| <meta name="project_path" value="/_project.yaml"/> |
| <meta name="book_path" value="/_book.yaml"/> |
| </head> |
| <body> |
| <!-- |
| Copyright 2018 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. |
| --> |
| |
| <p> |
| Android 4.3 及更高版本中提供的蓝牙低功耗 (BLE) 功能可在多个设备之间实现短促连接,以传输暴增的数据。未建立连接时,BLE 会处于睡眠模式。这样一来,BLE 可以提供比传统蓝牙更低的带宽和功耗。此功能适用于心率监测器或无线键盘等应用。要使用 BLE,用户需要确保设备上安装支持 BLE 的芯片组。 |
| </p> |
| |
| <h2 id="implementation">实现</h2> |
| |
| <p> |
| 所有最新的 BLE 应用配置文件都基于<a href="https://www.bluetooth.com/specifications/gatt">通用属性配置文件</a> (GATT)。当 Android 设备与 BLE 设备交互时,发送信息的设备是服务器,而接收信息的设备则是客户端。Android 包括<a href="https://developer.android.com/guide/topics/connectivity/bluetooth-le.html">用于 BLE 的开发者 API</a>,其中包含用于 GATT 服务器和 GATT 客户端之间交互的 API。要充分利用 BLE API,请实现 <a href="/devices/bluetooth/hci_requirements.html">Android 蓝牙 HCI 要求</a>。 |
| </p> |
| |
| <h2 id="device-modes">设备模式</h2> |
| |
| <p> |
| 使用 BLE 时,Android 设备可发挥外围设备、中心设备的作用,或同时发挥两者的作用。外围设备模式可让设备发送广告包。中心模式可让设备扫描广告。在同时发挥外围设备和中心设备的作用时,Android 设备可以一边在外围设备模式下发送广告,一边与其他 BLE 外围设备进行通信。支持蓝牙 4.1 及更低版本的设备只能在中心模式下使用 BLE。较旧的设备芯片组可能不支持 BLE 外围设备模式。 |
| </p> |
| |
| <h2 id="ble-scanning">BLE 扫描</h2> |
| |
| <p> |
| 使用 BLE 时,Android 设备可以更有效地定位和扫描特定的蓝牙设备。BLE API 可让应用开发者创建过滤器,供他们从主机控制器查找参与度较低的设备。 |
| </p> |
| |
| <aside class="caution"> |
| <strong>注意</strong>:BLE 扫描功能需要获取位置权限,因为 BLE 扫描功能会识别可用于地理定位的对象。关闭位置信息服务也将一并关闭蓝牙扫描功能。 |
| </aside> |
| |
| <h3 id="location-scanning">位置信息扫描</h3> |
| |
| <p> |
| 用户设备的位置信息服务可以使用蓝牙来检测蓝牙信标,并提供更准确的位置信息。用户可以按照以下方式启用该功能:</p> |
| |
| <ol> |
| <li>依次转到<strong>设置</strong> > <strong>安全性和位置信息</strong> > <strong>位置信息</strong>。</li> |
| <li>检查位置信息<strong>开启</strong>/<strong>关闭</strong>开关是否处于<strong>开启</strong>位置。</li> |
| <li>转到<strong>模式</strong>。</li> |
| <li>选择<strong>准确度高</strong>或<strong>耗电量低</strong>模式。</li> |
| </ol> |
| |
| <p> |
| 个别应用需要获取位置权限才能使用 BLE 扫描功能,即使这些应用扫描的目的只是为了查找要连接的设备。如果用户停用位置扫描功能,或者未向应用提供位置权限,则相应应用将不会收到任何 BLE 扫描结果。 |
| </p> |
| |
| <p> |
| 用户可以通过以下方式停用系统级蓝牙后台扫描:依次转到<strong>设置</strong> > <strong>安全性和位置信息</strong> > <strong>位置信息</strong> > <strong>扫描</strong>,然后关闭<strong>蓝牙扫描</strong>开关。这不会影响对位置或本地设备的 BLE 扫描。 |
| </p> |
| |
| <h3 id="filtering-scan-results">过滤扫描结果</h3> |
| |
| <p> |
| Android 6.0 及更高版本包括蓝牙控制器上的 BLE 扫描和过滤器匹配。设备可以过滤扫描结果,并将与 BLE 设备相关的 <strong>found</strong> 和 <strong>lost</strong> 事件报告给应用处理器 (AP)。过滤功能也适用于批量扫描,这将有助于节省电量,因为 BLE 扫描已分流到固件中。批量扫描可降低 AP 因设备或信标的 BLE 扫描而唤醒的频率。 |
| </p> |
| |
| <p> |
| <code>OnFound</code>/<code>OnLost</code> 功能在蓝牙控制器中实现,然后经过测试以确认在扫描过程中未错过 BLE 设备。这样可以节省电量,并且还有以下好处: |
| </p> |
| |
| <ul> |
| <li>对于 <code>OnFound</code> 事件,主 AP 在发现特定设备时唤醒。</li> |
| <li>对于 <code>OnLost</code> 事件,AP 在找不到特定设备时唤醒。</li> |
| <li>当附近设备在检测范围内时,框架应用可以收到较少的无用通知。</li> |
| <li>当设备不在检测范围时,连续扫描功能可以启用框架应用以收到通知。</li> |
| </ul> |
| |
| <p> |
| 扫描过滤器可根据发现的设备广告(<code>OnFound</code> 事件)而创建。Java 层可以指定参数,例如首次发现(或自首次发现以来的特定广告数量)。用户可以使用<a href="/devices/bluetooth/hci_requirements#advertisement-packet-content-filter">广告包内容过滤器 HCI 命令</a>实现 BLE 过滤。 |
| </p> |
| |
| </body></html> |