【android bluetooth 协议分析 01】【HCI 层介绍 6】【WriteLeHostSupport命令介绍】

HCI 指令 HCI_Write_LE_Host_Support 是 Bluetooth Host 向 Controller 发送的一条指令,用于启用或禁用主机对 Bluetooth Low Energy(LE)的支持能力。该指令属于 HCI(Host Controller Interface)命令集合中,规范位置为 Core Spec v5.x,Vol 2, Part E, Section 7.3.79

c 复制代码
7	2025-04-24 15:55:53.351405	host	controller	HCI_CMD	6	Sent Write LE Host Supported

Bluetooth HCI Command - Write LE Host Supported
    Command Opcode: Write LE Host Supported (0x0c6d)
        0000 11.. .... .... = Opcode Group Field: Host Controller & Baseband Commands (0x03)
        .... ..00 0110 1101 = Opcode Command Field: Write LE Host Supported (0x06d)
    Parameter Total Length: 2
    LE Supported Host: true (0x01)
    Simultaneous LE Host: false (0x00)
    [Response in frame: 8]
    [Command-Response Delta: 0.521ms]

1. 简要理解

HCI_Write_LE_Host_Support 指令的目的是:

告诉 Controller(控制器)主机是否支持 LE(Low Energy)功能。

LE 是 Bluetooth 4.0 引入的一种低功耗通信机制,开启这个支持标志后,控制器会在其特性(Feature Mask)中标记主机支持 LE。


2. 指令定义(HCI_Write_LE_Host_Support)

1. Command Parameters(命令参数)

  1. LE_Supported_Host(1 Octet)

    • 用于设置主机是否支持 LE。
    • 取值参考 [Core Spec Vol 2, Part C, Section 3.2] 中的定义。
    • 常用值:
      • 0x00:不支持
      • 0x01:支持
  2. Unused(1 Octet)

    • 历史遗留字段,当前控制器会忽略这个字段。
    • 任意值都可以写入。

2. Return Parameters(返回参数)

字段 长度 描述
Status 1 Octet 结果状态码
  • 0x00:表示指令执行成功。

  • 0x01 ~ 0xFF:指令执行失败,错误码参考 [Vol 1] Part F(错误码定义)。


3. 事件通知

  • 该命令完成后,Controller 会发送 HCI_Command_Complete 事件,向 Host 报告执行结果。
  • Host 应监听该事件以判断设置是否成功。

3. 应用场景(为什么需要设置它?)

在有些系统中(尤其是支持双模 Bluetooth 的设备),LE 支持并不是默认启用的。这条指令允许主机在启动时显式启用对 LE 的支持,从而使 Controller 更新自己的 Feature Mask,使得后续的 LE 操作(如 LE Advertising、LE Scanning、LE Connection)被允许。

例如:

  • 手机或车载主机首次启动 Bluetooth 时,可以通过该指令通知控制器它支持 BLE 功能。
  • 蓝牙堆栈初始化流程中,某些芯片厂商可能要求 Host 显式调用该命令,否则控制器不会开启 LE 支持。

4. 与其他指令的关系

  • HCI_Read_Local_Supported_Features:用于读取 Controller 当前支持的 Feature。

  • HCI_Read_LE_Host_Support:读取当前主机是否启用了 LE 支持。

  • HCI_Write_LE_Host_Support:用于设置是否启用主机对 LE 的支持(本文所述)。

  • HCI_Write_LE_Host_Support 的设置只影响 Controller 的 LMP features 表现,不直接影响 Host 逻辑。


5. aosp示例

如果你正在调试蓝牙协议栈初始化流程,这条指令通常会在堆栈初始化阶段调用,比如 Android 蓝牙堆栈中设置主机 LE 支持标志,以确保后续 LE 操作生效。是否调用成功可通过 HCI_Command_Complete 事件回调判断。

c 复制代码
  static constexpr uint64_t kDefaultEventMask = 0x3dbfffffffffffff;
  static constexpr uint64_t kDefaultLeEventMask = 0x000000004d02fe7f;
  
// system/gd/hci/controller.cc

struct Controller::impl {

  void Start(hci::HciLayer* hci) {
...
    le_set_event_mask(kDefaultLeEventMask);
    set_event_mask(kDefaultEventMask);
    write_le_host_support(Enable::ENABLED, Enable::DISABLED);

...
}


/*
enable:表示是否启用 LE Supported Host 功能(主机是否支持 BLE)。

deprecated_host_bit:表示是否启用一个已废弃的功能位 Simultaneous LE and BR/EDR Host support。

*/
  void write_le_host_support(Enable enable, Enable deprecated_host_bit) {
    if (deprecated_host_bit == Enable::ENABLED) {
      // 如果设置了 deprecated_host_bit, 打印一个警告
      // Since Bluetooth Core Spec 4.1, this bit should be 0
      LOG_WARN("Setting deprecated Simultaneous LE BR/EDR Host bit");
    }
    std::unique_ptr<WriteLeHostSupportBuilder> packet = WriteLeHostSupportBuilder::Create(enable, deprecated_host_bit);
    hci_->EnqueueCommand(
        std::move(packet),
        module_.GetHandler()->BindOnceOn(this, &Controller::impl::check_status<WriteLeHostSupportCompleteView>));
  }
  • 在初始化 Controller 模块时, 在 Controller::impl::Start 函数中就会调用 write_le_host_support 函数去设置

1. deprecated_host_bit 是什么?

deprecated_host_bitHCI_Write_LE_Host_Support 命令中的第二个参数,对应协议定义中的:

Simultaneous LE and BR/EDR to Same Device Capable (Host)

这个位早期用于标识主机是否支持同时对同一个设备进行 BLE 和传统蓝牙的连接。

但是:

  • 从 Bluetooth Core Spec 4.1 起,这个位就被弃用了。
  • 控制器在处理这个位时会 忽略它的值
  • 现在大多数 Host 都设置为 0x00(即 DISABLED)。
相关推荐
美狐美颜SDK开放平台2 分钟前
多场景美颜SDK解决方案:直播APP(iOS/安卓)开发接入详解
android·人工智能·ios·音视频·美颜sdk·第三方美颜sdk·短视频美颜sdk
嗷o嗷o39 分钟前
Android BLE 里,MTU、分包和长数据发送到底该怎么处理
android
Gary Studio2 小时前
Android AIDL HAL工程结构示例
android
y = xⁿ3 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale3 小时前
04_rc文件语法规则
android·framework·aosp
祖国的好青年4 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴5 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭5 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首5 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose