【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)。
相关推荐
千里马学框架21 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台21 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui