【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)。
相关推荐
奔跑吧 android23 分钟前
【android bluetooth 协议分析 01】【HCI 层介绍 3】【NUMBER_OF_COMPLETED_PACKETS 事件介绍】
android·bluetooth·hci·bt·gd·aosp13
_龙小鱼_3 小时前
Kotlin扩展简化Android动画开发
android·开发语言·kotlin
uwvwko4 小时前
ctfshow——web入门254~258
android·前端·web·ctf·反序列化
顾子茵5 小时前
c++从入门到精通(六)--特殊工具与技术-完结篇
android·开发语言·c++
初遇你时动了情5 小时前
flutter 配置 安卓、Ios启动图
android·flutter·ios
YSoup5 小时前
Android Studio报错Cannot parse result path string:
android·android studio
zhangphil6 小时前
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
android·kotlin
与籍同行7 小时前
开发过程中遇到Selinux问题分析
android·selinux
韩仔搭建8 小时前
安卓端互动娱乐房卡系统调试实录:从UI到协议的万字深拆(第一章)
android·ui·娱乐