深入理解 LE Read Remote Features 命令与事件响应

在蓝牙低功耗(BLE)通信中,设备特性(LE Features)协商是连接过程中的一个关键环节。本文将详细介绍 HCI 层的命令 LE_Read_Remote_Features 及其对应的事件响应 LE_Read_Remote_Features_Complete,并结合 AOSP 源码和实际日志案例深入分析其使用流程与失败原因。


1. 背景与作用

LE_Read_Remote_Features 命令用于查询远程 BLE 设备支持的功能能力,这些能力以 bitmask(8 字节)表示,涵盖了加密支持、长距离 PHY、扩展广播等关键特性。

🔍 该命令通常在 BLE 连接建立成功之后发出,用于决定是否启用高级特性(如 DLE、2M PHY、Coded PHY 等)。


2. HCI 命令结构

在这里插入图片描述

1.HCI_LE_Read_Remote_Features(命令)

字段内容
Opcode0x2016(OGF: 0x08, OCF: 0x0016)
参数Connection_Handle(2 字节,低 12 位有效)
返回值
事件响应HCI_Command_Status,随后跟 LE_Read_Remote_Features_Complete

2. 用途说明

这个命令的目的是:

向 Controller 发送请求,读取指定 Connection_Handle 上远程设备所支持的 LE(Low Energy)功能特性(如:LE Encryption, Extended Advertising, 2M PHY 等)。

用于:

  • Central 读取 Peripheral 的特性(或反过来)

  • 动态判断远端设备支持哪些 BLE 功能

  • 连接后才能用(基于 Connection_Handle


3. 命令参数

参数名称大小说明
Connection_Handle2 字节(只有低 12 位有效)当前 ACL 连接的句柄(连接编号)
范围:0x00000x0EFF

⚠️ 注意:高 4 位是保留位或标志位,需屏蔽(代码中使用 handle & 0x0FFF


4. 返回参数

无返回参数(命令本身不直接返回结果)

事件(Event)机制 会异步返回两个事件:


5. 事件流程说明

当 Host 发出 LE Read Remote Features 命令后,HCI 控制器将生成以下事件:

1. HCI_Command_Status(立即返回)
  • 告知主机该命令是否被 Controller 接收成功

  • 不包含读取结果,仅表示“命令执行中”或“命令无法执行”


2️. HCI_LE_Read_Remote_Features_Complete(最终完成)
  • 当 Controller 读取远程特性成功后,发此事件

  • 包含字段:

    • Status:命令执行是否成功

    • Connection_Handle

    • LE_Features:8 字节的 Feature Bitmap(代表远端支持的特性)

✅ 这是你需要在上层软件中接收和解析的主要数据


6. 注意事项(规范原文中的 Note)

该命令不会通过 HCI_Command_Complete 表示完成,而是通过 HCI_LE_Read_Remote_Features_Complete 来表示命令已完成。
即:你不应该监听 Command_Complete 来处理结果,而是监听对应的 LE 事件。


7.典型使用场景

场景描述
ATT 服务等连接后检查远端是否支持特定 BLE 特性如 LE Secure Connections、2M PHY、Data Length Extension
BLE 连接后做版本兼容性判断动态适配不同设备
蓝牙自动化测试验证设备间 BLE 特性匹配
Android BLE Stack 中btm_ble_read_remote_features_complete() 回调处理该事件数据并记录到连接上下文中

8. 小结

关键点内容
命令名HCI_LE_Read_Remote_Features
Opcode0x2016
参数Connection_Handle(12-bit)
返回无,结果通过事件返回
主要事件HCI_LE_Read_Remote_Features_Complete
特性位数8 字节 bitmap
使用目的获取远程设备支持的 BLE 特性

3. HCI 事件响应结构

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


1. 事件基本信息
项目内容
事件名称HCI_LE_Read_Remote_Features_Complete
事件码 (Event Code)0x3E (即 LE Meta Event 的 Event Code)
子事件码 (Subevent Code)0x04 表示这是 “Read Remote Features Complete” 子事件
作用表示控制器完成了远程 BLE 设备的特性查询。

2. 事件结构解析

Event 格式结构:

Event Code (1 Byte) = 0x3E
Parameter Total Length (1 Byte)└─ Subevent_Code (1 Byte) = 0x04Status (1 Byte)Connection_Handle (2 Bytes, 12 bits meaningful)LE_Features (8 Bytes)
字段大小说明
Subevent_Code1 字节值为 0x04,代表是该子事件
Status1 字节0 表示成功,非 0 为失败(如设备不支持)
Connection_Handle2 字节(低 12 位有效)标识当前连接
LE_Features8 字节远程设备支持的 BLE 功能(bitmask)
3. LE_Features Bitmask 功能对照表
Bit名称功能说明实际应用
0LE Encryption支持 AES-CCM 加密安全配对
1Conn Param Req Procedure支持 LLCP 参数更新流程降功耗
5Data Length Extension (DLE)支持数据包扩展BLE Audio
6LL Privacy支持隐私地址与解析器防跟踪
8LE 2M PHY支持 2 Mbps PHY提速
11LE Coded PHY支持远距离传输(S=2, S=8)车钥匙
12Extended Advertising广播内容支持 > 31 字节BLE 广播
13Periodic Advertising周期广播AoA/AoD
14Channel Selection Algorithm #2更佳抗干扰选择算法BLE Mesh
你可以在代码中根据这些位判断远端设备支持哪些高级功能,比如是否支持 LE 2M PHY(高传输速率)或 DLE(Data Length Extension)。

完整位定义请参考《Bluetooth Core Spec Vol 6, Part B, Section 4.6》。

4.使用建议
使用阶段推荐操作
BLE 连接建立后立即发送 LE Read Remote Features 命令
收到 Complete 事件后根据 LE_Features 结果,更新连接能力或适配策略
多次连接相同设备可复用之前的能力缓存(如规范中建议)

5. 总结
项目内容
命令HCI_LE_Read_Remote_Features (0x2016)
事件HCI_LE_Read_Remote_Features_Complete (0x3E / Subevent 0x04)
事件内容status + handle + 8字节LE特性bitmask
代码位置btm_ble_read_remote_features_complete() 函数中处理
应用场景特性协商、能力判断、自适应控制、BLE测试等


4. AOSP 源码解析

1.btm_ble_read_remote_features_complete

  • 用途:当主机通过 HCI 向控制器发出 LE Read Remote Features 命令后,控制器会返回命令完成事件,此函数用于解析该事件并根据结果更新连接状态、记录远程设备支持的特性等。

  • 入口参数

    • p: 指向事件参数的指针
    • length: 参数长度
  • system/stack/btm/btm_ble_gap.cc

/********************************************************************************* Function         btm_ble_read_remote_features_complete** Description      This function is called when the command complete message*                  is received from the HCI for the read LE remote feature*                  supported complete event.** Returns          void*******************************************************************************/
void btm_ble_read_remote_features_complete(uint8_t* p, uint8_t length) {uint16_t handle;uint8_t status;/*如果事件数据长度小于 3 字节,则认为格式非法,跳转到错误处理。最少需要:status (1字节) + handle (2字节) = 3 字节*/if (length < 3) {goto err_out;}/*使用宏从 p 中按顺序读取:status: HCI 命令执行结果状态码handle: ACL 链路句柄(16位)*/STREAM_TO_UINT8(status, p);STREAM_TO_UINT16(handle, p);// HCI 句柄只有低 12 位有意义,高 4 位为保留或标志位,需屏蔽。handle = handle & 0x0FFF;  // only 12 bits meaningful/*如果读取失败(非 HCI_SUCCESS):如果失败原因不是“不支持读取远程特征”,则打印错误日志并退出否则记录警告日志说明远端设备不支持该命令(但流程可以继续)*/if (status != HCI_SUCCESS) {if (status != HCI_ERR_UNSUPPORTED_REM_FEATURE) {LOG_ERROR("Failed to read remote features status:%s",hci_error_code_text(static_cast<tHCI_STATUS>(status)).c_str());return;}LOG_WARN("Remote does not support reading remote feature");}// 如果读取成功,则还需要确保后续还有 BD_FEATURES_LEN 字节数据,用于保存远程设备支持的功能位(Bit Field)if (status == HCI_SUCCESS) {// BD_FEATURES_LEN additional bytes are read// in acl_set_peer_le_features_from_handleif (length < 3 + BD_FEATURES_LEN) {goto err_out;}/*尝试将 p 所指的特性数据记录到已有的连接对象中如果找不到对应的连接(句柄无效或连接已断开),打印错误并退出*/if (!acl_set_peer_le_features_from_handle(handle, p)) {LOG_ERROR("Unable to find existing connection after read remote features");return;}}/*无论是否支持远程特性,最终都会向控制器发送一个 远程版本信息请求(Remote Version Request),以进一步获取控制器支持的协议版本等信息。*/btsnd_hcic_rmt_ver_req(handle);return;err_out:LOG_ERROR("bogus event packet, too short");
}
步骤逻辑
读取 status + connection_handle(前 3 字节)
-判断 status 是否为 HCI_SUCCESS(0x00)
-如果成功,从指针 p 继续读取 8 字节 features 并写入到 ACL 连接
-如果失败(如 0x3E),输出错误并终止处理

5. 结语

BLE 中的 LE_Read_Remote_Features 是了解远程设备能力的关键命令,正确地处理该命令及其响应事件,有助于提升连接质量、支持更复杂的 BLE 特性(如 BLE Audio、Mesh、AoA 等)。连接失败时,如遇到 0x3E 错误码,应首先检查 BLE 连接是否建立,排查广播、地址解析与链路层资源等问题。


这里分享一个 真实的案例:
【android bluetooth 协议分析 05】【蓝牙连接详解1】【连接错误码-0x3E】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86067.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86067.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86067.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业架构设计中的CBAM方法深度解析:成本效益驱动的架构决策艺术

目录 CBAM方法概述与核心价值 CBAM核心流程与实施步骤 前期准备与场景确定 成本效益建模与分析 风险调整与决策制定 实施技巧与挑战克服 CBAM实战案例与应用场景 案例一&#xff1a;电商平台促销系统架构选型 案例二&#xff1a;制造业ERP系统云迁移决策 案例三&…

为什么你的vue项目连接不到后端

当你新创建一个vue项目时&#xff0c;你很有可能忘记配置了后端的地址这个时候可以加上这样的配置在 vite.config.js import { fileURLToPath, URL } from node:urlimport { defineConfig } from vite import vue from vitejs/plugin-vue import vueDevTools from vite-plugi…

Metasploit常用命令详解

一、Metasploit 概述 Metasploit是一款开源的渗透测试框架&#xff0c;由 H.D. Moore 于 2003 年首次发布&#xff0c;目前由 rapid7 公司维护。它整合了大量漏洞利用模块、后渗透工具和漏洞扫描功能&#xff0c;已成为网络安全工程师、红队 / 蓝队成员及安全研究人员的核心工…

数据库AICD特性之--一致性 Consistency

数据库AICD特性之–原子性 Atomicity 数据库AICD特性之–隔离性 Isolation 数据库 ACID 特性之 – 持久性 Durability 数据库AICD特性之–一致性 Consistency 一致性指数据库在事务执行前后&#xff0c;数据始终符合预设的完整性约束和业务规则。事务执行前数据是合法的&…

OpenCV在图像上绘制文字示例

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 OpenCV中除了提供绘制各种图形的函数外&#xff0c;还提供了一个特殊的绘制函数&#xff0c;用于在图像上绘制文字。这个函数是putText()&#xff0c;它是命名空间cv中的函数&#xff0c;其声明如下&#xff…

synchronized的技巧与要点

一、基本概念 目的&#xff1a;解决多线程并发访问共享资源时的数据竞争问题&#xff0c;保证原子性、可见性和有序性&#xff08;JMM内存模型&#xff09;。性质&#xff1a;可重入锁&#xff08;同一线程可重复获取同一把锁&#xff09;、独占锁&#xff08;互斥锁&#xff…

特殊混淆案例还原指南:突破变形控制流与量子加密的技术解析

引言​​ 在JavaScript混淆领域,传统的字符串加密和控制流平坦化已无法满足高端防护需求。2023年Snyk安全报告指出,Top级商业产品已转向​​多态变形控制流​​和​​量子加密技术​​,这类混淆方案占比17%,但导致的反向工程失败率高达94%。本文将通过三个工业级混淆案例(…

基于Python、tkinter、sqlite3 和matplotlib的校园书店管理系统

写一个小例子练习一下python语言。一个基于Python的校园书店管理系统&#xff0c;使用了tkinter库构建图形用户界面&#xff08;GUI&#xff09;&#xff0c;sqlite3 进行数据库管理&#xff0c;matplotlib用于统计分析可视化。系统支持用户登录、书籍管理、客户管理、员工管理…

机器学习×第十四卷:集成学习中篇——她从每次错误中修正自己

&#x1f380;【开场 她终于愿意回看自己贴错的地方了】 &#x1f98a;狐狐&#xff1a;“她贴过你很多次&#xff0c;但每次贴歪了&#xff0c;都只是低头沉默。” &#x1f43e;猫猫&#xff1a;“现在不一样了喵……她开始反思&#xff0c;是不是哪一刻该绕过来贴你背后&…

LeetCode 2537.统计好子数组的数目

给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回 nums 中 好 子数组的数目。 一个子数组 arr 如果有 至少 k 对下标 (i, j) 满足 i < j 且 arr[i] arr[j] &#xff0c;那么称它是一个 好 子数组。 子数组 是原数组中一段连续 非空 的元素序列。 示例 1&#x…

Python 开发环境管理和常用命令

包管理器选择 从轻到重: venv → virtualenv → conda venv: Python 3.3 内置&#xff0c;轻量级虚拟环境virtualenv: 第三方包&#xff0c;支持更多Python版本conda: 科学计算友好&#xff0c;包含包管理和环境管理 Python 版本支持 查看各版本支持状态&#xff1a;Status…

macOS - 根据序列号查看机型、保障信息

文章目录 最近在看 MacBook 二手机&#xff0c;有个咸鱼卖家放个截图 说不清参数&#xff0c;于是想根据 序列号 查看机型。苹果提供了这样的网页&#xff1a; https://checkcoverage.apple.com/ &#xff08;无需登录&#xff09; 结果 2025-06-20&#xff08;五&#xff09;…

数字化项目调研过程中需要的文章

Hello&#xff0c;大家好 &#xff0c;我是东哥说-MES 最近写了不少的文章&#xff0c;为了方便阅读&#xff0c;特意重新整理了数字化相关的文章链接&#xff0c;也便于大家阅读 数字工厂项目启动与业务需求调研执行指南-CSDN博客文章浏览阅读725次&#xff0c;点赞28次&…

LangChain4j之会话功能AiServices工具类的使用(系列二)

概述 LangChain4j 的会话功能 AiServices 工具类&#xff0c;可助力轻松实现智能对话。它能记录对话上下文&#xff0c;让 AI 回答连贯且贴合情境。使用起来&#xff0c;先引入类&#xff0c;配置好相关参数&#xff0c;如模型地址、密钥等。接着&#xff0c;调用相应方法传入…

Qt 中使用 gtest 做单元测试

作者&#xff1a;billy 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 gtest 简介 GoogleTest&#xff08;也称为gtest&#xff09;是由 Google 开发的一个 C 单元测试框架&#xff0c;用于编写、组织和运行…

WPF TreeView 数据绑定完全指南:MVVM 模式实现

WPF TreeView 数据绑定完全指南&#xff1a;MVVM 模式实现 一、TreeView 绑定的核心概念1.1 MVVM 模式下的 TreeView 绑定原理1.2 绑定关系示意图 二、完整实现步骤2.1 创建节点模型类2.2 创建 ViewModel2.3 XAML 绑定配置2.4 设置 Window 的 DataContext 三、关键特性详解3.1 …

坤驰科技QTS4200战鹰(Battle Eagle)系列实时频谱分析记录回放系统

QTS4200战鹰(Battle Eagle)系列 实时频谱分析记录回放系统 精准采集&#xff5c;高效回放&#xff5c;拓展频谱分析新边界 坤驰科技倾力打造新一代集实时频谱分析、高速信号记录与精准信号回放于一体的便携式系统&#xff0c;为无线电监测、无线通信、国防等领域提供全面而高…

Flask(二) 路由routes

文章目录 基本路由定义路由参数路由规则设置请求方法&#xff08;GET/POST&#xff09;路由函数返回静态文件和模板Blueprint&#xff08;模块化路由&#xff09;显示当前所有路由 Flask 路由是 Web 应用程序中将 URL 映射到 Python 函数的机制。 定义路由&#xff1a;使用 app…

在el-image组件的预览中添加打印功能(自定义功能)

思路&#xff1a;给图片添加点击事件&#xff0c;通过js获取预览的工具栏&#xff0c;在工具栏中添加自定义按钮及事件 1、html 中 image标签 <el-image style"width: 139px; height: 89px" :src"fileUrl" :preview-src-list"[fileUrl]" cli…

TongWeb替换tomcat

1、背景 国家近年来大力推进信息技术应用创新产业&#xff08;信创&#xff09;&#xff0c;要求关键领域采用自主可控的国产软硬件。Tomcat作为国外开源产品&#xff0c;存在潜在的安全风险和技术依赖。TongWeb作为国产中间件&#xff0c;符合信创目录要求&#xff0c;满足政府…