当前位置: 首页 > news >正文

【android bluetooth 协议分析 01】【HCI 层介绍 7】【ReadLocalName命令介绍】

1. HCI_Read_Local_Name

Read Local Name 是 HCI(Host Controller Interface)命令之一,属于 BR/EDR 控制器的 HCI Command 类别,其主要功能是 读取本地设备(Controller)的人类可读名称(Local Name)。这通常用于让其它蓝牙设备知道该设备的“蓝牙名称”。

在这里插入图片描述


1. 命令功能(Description)

HCI_Read_Local_Name 命令允许 Host 读取 BR/EDR Controller 存储的人类友好名称(即 Bluetooth 名称)。

这类似于你打开手机蓝牙设置看到的“设备名称”,例如“John’s iPhone”或“Car Audio”。这个名称就是 Controller 的 Local Name。


2. 命令参数(Command Parameters)

9	2025-04-24 15:55:53.352134	host	controller	HCI_CMD	4	Sent Read Local NameBluetooth HCI Command - Read Local NameCommand Opcode: Read Local Name (0x0c14)0000 11.. .... .... = Opcode Group Field: Host Controller & Baseband Commands (0x03).... ..00 0001 0100 = Opcode Command Field: Read Local Name (0x014)Parameter Total Length: 0[Response in frame: 10][Command-Response Delta: 1.381ms]

None

该命令不需要 Host 提供任何参数,直接发出即可。


3. 返回参数(Return Parameters)

10	2025-04-24 15:55:53.353515	controller	host	HCI_EVT	255	Rcvd Command Complete (Read Local Name)Bluetooth HCI Event - Command CompleteEvent Code: Command Complete (0x0e)Parameter Total Length: 252Number of Allowed Command Packets: 1Command Opcode: Read Local Name (0x0c14)0000 11.. .... .... = Opcode Group Field: Host Controller & Baseband Commands (0x03).... ..00 0001 0100 = Opcode Command Field: Read Local Name (0x014)Status: Success (0x00)Device Name: [Command in frame: 9][Command-Response Delta: 1.381ms]
  1. Status(1 字节)

    • 表示命令执行是否成功
    • 0x00 表示成功,其他值为错误码(如 0x01 Invalid HCI Command Parameters)
  2. Local_Name(248 字节)

    • 即设备的本地名称(最多 248 字节,UTF-8 编码时最多 248 个字节,但不一定是 248 个字符)
    • 如果名称不足 248 字节,其余部分将被填充为 0x00。

4. 事件(Event(s) Generated)

当该命令完成时,Controller 会回送一个 HCI_Command_Complete 事件。

这个事件中会包含上述的 StatusLocal_Name 字段。


2. 实际应用场景说明

1. 例子:手机蓝牙配对显示名称

当手机或车机进行蓝牙配对时,通常会显示对方设备的名称,比如:

发现设备:Car Audio
这是通过读取对方设备的 Local Name 获取的。

在底层协议栈中,手机或车机可能通过以下步骤实现这一过程:

  1. Host 发送 HCI_Read_Local_Name 命令到 Controller
  2. Controller 返回 HCI_Command_Complete 事件,其中包含 Local Name
  3. 上层显示或广播这个名称

2. 相关章节

在这里插入图片描述

Section 6.23 – 该节通常会详细说明 Local Name 是如何被存储和更新的,比如:

  • 可以通过 HCI_Write_Local_Name 改名

  • 被远程设备读取时也会用这个值(如 Inquiry Response 时)

  • 在 Extended Inquiry Response(EIR)数据中也可能包含这个名字


3. aosp 中的例子

  
// system/gd/hci/controller.ccstruct Controller::impl {void Start(hci::HciLayer* hci) {
...hci_->EnqueueCommand(ReadLocalNameBuilder::Create(),handler->BindOnceOn(this, &Controller::impl::read_local_name_complete_handler));...
}

在 Controller::impl::Start 函数中,我们会获取 本地蓝牙设备的名字。
当我们获取到内容后,回调 read_local_name_complete_handler

1. read_local_name_complete_handler

// system/gd/hci/controller.ccvoid read_local_name_complete_handler(CommandCompleteView view) {auto complete_view = ReadLocalNameCompleteView::Create(view);ASSERT(complete_view.IsValid());ErrorCode status = complete_view.GetStatus();ASSERT_LOG(status == ErrorCode::SUCCESS, "Status 0x%02hhx, %s", status, ErrorCodeText(status).c_str());std::array<uint8_t, 248> local_name_array = complete_view.GetLocalName();local_name_ = std::string(local_name_array.begin(), local_name_array.end());// erase \0local_name_.erase(std::find(local_name_.begin(), local_name_.end(), '\0'), local_name_.end());}

最终我们将 读到的蓝牙名字保存在 local_name_ 中。


std::string Controller::GetLocalName() const {return impl_->local_name_;
}

如果其他模块需要本地蓝牙的名字,可以通过调用 Controller::GetLocalName 函数获得

4.总结

项目内容
命令名称HCI_Read_Local_Name
功能读取 Controller 存储的人类可读设备名称
命令参数
返回值Status(1B)+ Local_Name(248B)
触发事件HCI_Command_Complete
应用场景显示蓝牙设备名称、广播设备身份、配对时展示名称等

相关文章:

  • Feature Toggle 不再乱:如何设计一个干净、安全、可控的特性开关系统?
  • LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串
  • 模板(template)初始
  • Spring Cloud Seata 深度解析:原理与架构设计
  • 微店平台关键字搜索商品接口技术实现
  • 题海拾贝:P2910 [USACO08OPEN] Clear And Present Danger S
  • kotlin Android AccessibilityService 无障碍入门
  • UE RPG游戏开发练手 第二十八课 重攻技能1
  • k8s节点维护的细节
  • 带你搞懂@Valid和@Validated的区别
  • 线代第三章向量第一节:n维向量及其运算
  • Electron + Vite + Vue 项目中的 IPC 通信三层封装实践
  • 解决RAGFlow部署中镜像源拉取的问题
  • vi实时查看日志
  • 专题讨论3:基于图的基本原理实现走迷宫问题
  • WPF中资源(Resource)与嵌入的资源(Embedded Resource)的区别及使用场景详解
  • 2025.05.01【Barplot】柱状图的多样性绘制
  • TinyEngine 2.5版本正式发布:多选交互优化升级,页面预览支持热更新,性能持续跃升!
  • 1.1 结构体与类对象在List中使用区别
  • iOS:重新定义移动交互,引领智能生活新潮流
  • MiniMax发布新一代语音大模型
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • 李公明 | 一周画记:德里达哲学还是接地气的
  • 国家统计局:消费对我国经济增长的拉动有望持续增长
  • 美国失去最后一个AAA评级,资产价格怎么走?美股或将触及天花板
  • 女生“生理期请病假要脱裤子证明”?高校回应:视频经处理后有失真等问题