【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)。
相关推荐
YF02111 小时前
Frida如何稳定连接PC端跟Android手机端
android·mac·xposed
O***P5712 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
z***43842 小时前
MySQL-mysql zip安装包配置教程
android·mysql·adb
无心水2 小时前
【Python实战进阶】7、Python条件与循环实战详解:从基础语法到高级技巧
android·java·python·python列表推导式·python条件语句·python循环语句·python实战案例
g***78914 小时前
鸿蒙NEXT(五):鸿蒙版React Native架构浅析
android·前端·后端
Bervin1213810 小时前
Flutter Android环境的搭建
android·flutter
e***877016 小时前
windows配置永久路由
android·前端·后端
fouryears_2341718 小时前
现代 Android 后台应用读取剪贴板最佳实践
android·前端·flutter·dart
YF021119 小时前
Frida for MacBook/Android 安装配置
android·前端
雨白19 小时前
Android实战:构建高可维护的日志系统
android