【android bluetooth 協議分析 01】【HCI 層介紹 27】【LeReadRemoteFeatures命令介紹】

深入理解 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;滿足政府…