【android bluetooth 協議分析 01】【HCI 層介紹 1】【hci_packets.pdl 介紹】

在 AOSP 的藍牙協議棧 (Gabeldorsche) 中,hci_packets.pdl?是一個?協議描述語言文件,用于定義 HCI (Host Controller Interface) 層的數據包結構和通信協議。以下是詳細解析:


1. 文件作用

  • system/gd/hci/hci_packets.pdl

  • 協議自動化生成:通過?.pdl?文件定義藍牙 HCI 命令/事件/數據包的二進制格式

  • 跨語言支持:生成 C++/Java 等語言的協議解析/構建代碼

  • 保證一致性:避免手動編寫協議代碼導致的錯誤

關鍵定義示例:


OpCode 枚舉定義

enum OpCode : 16 {RESET = 0x0C03, // 規范定義的原始操作碼
}
  • 作用:定義 HCI 命令的操作碼(OpCode)

  • 語法

    • enum?聲明枚舉類型

    • : 16?表示用 16 位存儲(藍牙規范要求)

    • RESET = 0x0C03

      • 0x0C03?是藍牙規范定義的 Reset 命令碼

      • 高 6 位?0x03?是 OGF(Opcode Group Field)

      • 低 10 位?0x03?是 OCF(Opcode Command Field)

enum OpCodeIndex : 16 {RESET = 57, // 將 RESET 命令映射到索引 57
}
  • : 16:索引值用 16 位整數存儲(實際索引通常遠小于此范圍)
  • RESET = 57:表示?RESET?命令在內部數組中的位置為 57

核心作用

  • 二級映射:將?OpCode(如?0x0C03)轉換為更緊湊的?數組索引(如?57),優化內存和訪問效率

  • 快速查找:通過數字索引快速定位命令處理器(替代哈希表或線性搜索)

  • 代碼生成:為自動生成的代碼提供命令編號與索引的映射關系

和 OpCode 的關系:

enum OpCode : 16 {RESET = 0x0C03,  // 規范定義的原始操作碼
}packet Reset : Command (op_code = RESET, op_code_index = RESET) {}
  • 雙綁定機制

    1. op_code:協議規范定義的原始值(如?0x0C03

    2. op_code_index:內部優化的數組索引(如?57

  • 編譯時關聯:代碼生成工具會確保兩者正確匹配


packet Reset : Command (op_code = RESET) {
}
  • 作用:聲明 Reset 命令的數據結構

  • 語法

    • packet?聲明一個協議數據包

    • : Command?表示這是 HCI 命令類型

    • (op_code = RESET)?綁定到前面定義的枚舉值

    • 空?{}?表示此命令無附加參數

test Reset {"\x03\x0c\x00",
}
  • 二進制解釋

    • 03 0c:小端格式的?0x0C03(Reset 命令碼)

    • 00:無參數填充

packet ResetComplete : CommandComplete (command_op_code = RESET) {status : ErrorCode,
}
  • 作用:定義命令完成事件的數據結構

  • 語法

    • : CommandComplete?表示這是命令完成事件

    • (command_op_code = RESET)?關聯對應的命令

    • status : ErrorCode

      • 字段名?status

      • 類型?ErrorCode(通常是 8 位錯誤碼枚舉)

test ResetComplete {"\x0e\x04\x01\x03\x0c\x00","\x0e\x04\x01\x03\x0c\x01", // unknown command
}
  • 二進制解釋

    • 0e:事件碼(Command Complete)

    • 04:參數總長度

    • 01:允許發送的 HCI 命令數

    • 03 0c:對應的命令碼(小端)

    • 00/01:狀態碼(成功/未知命令)

關鍵語法規則

語法元素說明
enum Name : bits定義枚舉類型,指定存儲位數
packet Name : Type定義數據包,繼承特定基類(Command/Event等)
field : Type定義字段,類型可以是基礎類型或自定義枚舉
test定義二進制測試用例
(key=value)屬性綁定(如關聯命令與操作碼)

2. 編譯流程

.pdl?文件通過?Packet Framework?工具鏈處理,具體步驟:

編譯階段

system/gd/Android.bp

genrule {name: "BluetoothGeneratedPackets_h",tools: ["bluetooth_packetgen",],cmd: "$(location bluetooth_packetgen) --include=packages/modules/Bluetooth/system/gd --out=$(genDir) $(in)",srcs: ["hci/hci_packets.pdl","l2cap/l2cap_packets.pdl","security/smp_packets.pdl",],out: ["hci/hci_packets.h","l2cap/l2cap_packets.h","security/smp_packets.h",],
}
字段說明
name規則名稱:BluetoothGeneratedPackets_h
tools使用的工具:bluetooth_packetgen?(協議代碼生成器)
cmd實際執行的命令,包含:
? 工具路徑?$(location)
? 輸入參數?--include
? 輸出目錄?--out
? 輸入文件?$(in)
srcs輸入的協議描述文件:
? HCI 層 (hci_packets.pdl)
? L2CAP 層 (l2cap_packets.pdl)
? 安全層 (smp_packets.pdl)
out生成的頭文件輸出路徑
Build System bluetooth_packetgen hci_packets.pdl l2cap_packets.pdl smp_packets.pdl genDir 調用工具 解析協議描述 解析協議描述 解析協議描述 生成 h/l2cap/smp_packets.h Build System bluetooth_packetgen hci_packets.pdl l2cap_packets.pdl smp_packets.pdl genDir
  1. 輸入.pdl?文件定義協議格式(字段、長度、類型等)

  2. 處理bluetooth_packetgen?工具解析描述文件

  3. 輸出:生成類型安全的 C++ 頭文件

其他模塊通過?generated_headers?依賴這些生成的頭文件:

cc_library {name: "libbluetooth_gd",defaults: ["libbluetooth_gd_defaults", # 依賴它],apex_available: ["com.android.bluetooth",],min_sdk_version: "31",
}cc_defaults {name: "libbluetooth_gd_defaults",generated_headers: ["BluetoothGeneratedPackets_h", # 這里],
}

3. 生成代碼結構

  • out/soong/.intermediates/packages/modules/Bluetooth/system/gd/BluetoothGeneratedPackets_h/gen/hci/hci_packets.h

生成的代碼會包含:

class ResetBuilder : public CommandBuilder
{
public:virtual ~ResetBuilder() = default;static std::unique_ptr<ResetBuilder> Create(){auto builder = std::unique_ptr<ResetBuilder>(new ResetBuilder());return builder;}#if defined(PACKET_FUZZ_TESTING) || defined(PACKET_TESTING) || defined(FUZZ_TARGET)static std::unique_ptr<ResetBuilder> FromView(ResetView view) { return ResetBuilder::Create(); }
#endifprotected:void SerializeHeader(BitInserter &i) const { CommandBuilder::SerializeHeader(i); }void SerializeFooter(BitInserter &i) const { CommandBuilder::SerializeFooter(i); }public:virtual void Serialize(BitInserter &i) const override{SerializeHeader(i);SerializeFooter(i);}protected:size_t BitsOfHeader() const { return 0 + CommandBuilder::BitsOfHeader(); }size_t BitsOfFooter() const { return 0 + CommandBuilder::BitsOfFooter(); }public:virtual size_t size() const override { return (BitsOfHeader() / 8) + (BitsOfFooter() / 8); }protected:explicit ResetBuilder() : CommandBuilder(OpCode::RESET /* op_code_ */) {}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77610.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77610.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77610.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

操作系統 4.2-鍵盤

鍵盤中斷初始化和處理 提取的代碼如下&#xff1a; // con_init 函數&#xff0c;初始化控制臺&#xff08;包括鍵盤&#xff09;的中斷 void con_init(void) {set_trap_gate(0x21, &keyboard_interrupt); } ? // 鍵盤中斷處理函數 .globl _keyboard_interrupt _keyboard…

深入理解Softmax函數及其在PyTorch中的實現

Softmax函數簡介 Softmax函數在機器學習和深度學習中&#xff0c;被廣泛用于多分類問題的輸出層。它將一個實數向量轉換為概率分布&#xff0c;使得每個元素介于0和1之間&#xff0c;且所有元素之和為1。 Softmax函數的定義 給定一個長度為 K K K的輸入向量 z [ z 1 , z 2 …

Vue 3 響應式更新問題解析

在 Vue 3 中&#xff0c;即使使用 reactive 或 ref 創建的響應式數據&#xff0c;當數據量很大時也可能出現更新不及時的情況。以下是原因和解決方案&#xff1a; 核心原因 ??響應式系統優化機制??&#xff1a; Vue 3 使用 Proxy 實現響應式&#xff0c;比 Vue 2 更高效但為…

異形遮罩之QML中的 `OpacityMask` 實戰

文章目錄 &#x1f327;? 傳統實現的問題&#x1f449; 效果圖 &#x1f308; 使用 OpacityMask 的理想方案&#x1f449;代碼如下&#x1f3af; 最終效果&#xff1a; ? 延伸應用&#x1f9e0; 總結 在 UI 設計中&#xff0c;經常希望實現一些“異形區域”擁有統一透明度或顏…

數據可視化 —— 堆形圖應用(大全)

一、案例一&#xff1a;溫度堆積圖 # 導入 matplotlib 庫中的 pyplot 模塊&#xff0c;這個模塊提供了類似于 MATLAB 的繪圖接口&#xff0c; # 方便我們創建各種類型的可視化圖表&#xff0c;比如折線圖、柱狀圖、散點圖等 import matplotlib.pyplot as plt # 導入 numpy 庫&…

python工程中的包管理(requirements.txt)

pip install -r requirements.txtpython工程通過requirements.txt來管理依賴庫版本&#xff0c;上述命令&#xff0c;可以一把安裝依賴庫&#xff0c;類似java中maven的pom.xml文件。 參考 [](

操作系統 3.4-段頁結合的實際內存管理

段與頁結合的初步思路 虛擬內存的引入&#xff1a; 為了結合段和頁的優勢&#xff0c;操作系統引入了虛擬內存的概念。虛擬內存是一段地址空間&#xff0c;它映射到物理內存上&#xff0c;但對用戶程序是透明的。 段到虛擬內存的映射&#xff1a; 用戶程序中的段首先映射到虛…

【Amazon EC2】為何基于瀏覽器的EC2 Instance Connect 客戶端連接不上EC2實例

文章目錄 前言&#x1f4d6;一、報錯先知?二、問題復現&#x1f62f;三、解決辦法&#x1f3b2;四、驗證結果&#x1f44d;五、參考鏈接&#x1f517; 前言&#x1f4d6; 這篇文章將講述我在 Amazon EC2 上使用 RHEL9 AMI 時無法連接到 EC2 實例時所遇到的麻煩&#x1f616; …

Python學習筆記(二)(字符串)

文章目錄 編寫簡單的程序一、標識符 (Identifiers)及關鍵字命名規則&#xff1a;命名慣例&#xff1a;關鍵字 二、變量與賦值 (Variables & Assignment)變量定義&#xff1a;多重賦值&#xff1a;變量交換&#xff1a;&#xff08;很方便喲&#xff09; 三、輸入與輸出 (In…

Hydra Columnar:一個開源的PostgreSQL列式存儲引擎

Hydra Columnar 是一個 PostgreSQL 列式存儲插件&#xff0c;專為分析型&#xff08;OLAP&#xff09;工作負載設計&#xff0c;旨在提升大規模分析查詢和批量更新的效率。 Hydra Columnar 以擴展插件的方式提供&#xff0c;主要特點包括&#xff1a; 采用列式存儲&#xff0c…

es的告警信息

Elasticsearch&#xff08;ES&#xff09;是一個開源的分布式搜索和分析引擎&#xff0c;在運行過程中可能會產生多種告警信息&#xff0c;以提示用戶系統中存在的潛在問題或異常情況。以下是一些常見的 ES 告警信息及其含義和處理方法&#xff1a; 集群健康狀態告警 信息示例…

健康與好身體筆記

文章目錄 保證睡眠飯后百步走&#xff0c;活到九十九補充鈣質一副好腸胃肚子咕咕叫 健康和工作的取舍 以前對健康沒概念&#xff0c;但是隨著年齡增長&#xff0c;健康問題凸顯出來。 持續維護該文檔&#xff0c;健康是個永恒的話題。 保證睡眠 一是心態要好&#xff0c;沾枕…

vue實現在線進制轉換

vue實現在線進制轉換 主要功能包括&#xff1a; 1.支持2-36進制之間的轉換。 2.支持整數和浮點數的轉換。 3.輸入驗證&#xff08;雖然可能存在不嚴格的情況&#xff09;。 4.錯誤提示。 5.結果展示&#xff0c;包括大寫字母。 6.用戶友好的界面&#xff0c;包括下拉菜單、輸…

智體知識庫:poplang編程語言是什么?

問&#xff1a;poplang語言是什么 Poplang 語言簡介 Poplang&#xff08;OPCode-Oriented Programming Language&#xff09;是一種面向操作碼&#xff08;Opcode&#xff09;的輕量級編程語言&#xff0c;主要用于智體&#xff08;Agent&#xff09;系統中的自動化任務處理、…

二分查找5:852. 山脈數組的峰頂索引

鏈接&#xff1a;852. 山脈數組的峰頂索引 - 力扣&#xff08;LeetCode&#xff09; 題解&#xff1a; 事實證明&#xff0c;二分查找不局限于有序數組&#xff0c;非有序的數組也同樣適用 二分查找主要思想在于二段性&#xff0c;即將數組分為兩段。本體就可以將數組分為ar…

下列軟件包有未滿足的依賴關系: python3-catkin-pkg : 沖突: catkin 但是 0.8.10-

下列軟件包有未滿足的依賴關系: python3-catkin-pkg : 沖突: catkin 但是 0.8.10- 解決&#xff1a; 1. 確認當前的包狀態 首先&#xff0c;運行以下命令來查看當前安裝的catkin和python3-catkin-pkg版本&#xff0c;以及它們之間的依賴關系&#xff1a; dpkg -l | grep ca…

深度學習:AI 大模型時代的智能引擎

當 Deepspeek 以逼真到難辨真假的語音合成和視頻生成技術橫空出世&#xff0c;瞬間引發了全球對 AI 倫理與技術邊界的激烈討論。從偽造名人演講、制造虛假新聞&#xff0c;到影視行業的特效革新&#xff0c;這項技術以驚人的速度滲透進大眾視野。但在 Deepspeek 強大功能的背后…

醫學分割新標桿!雙路徑PGM-UNet:CNN+Mamba實現病灶毫厘級捕捉

一、引言&#xff1a;醫學圖像分割的挑戰與機遇 醫學圖像分割是輔助疾病診斷和治療規劃的關鍵技術&#xff0c;但傳統方法常受限于復雜病理特征和微小結構。現有深度學習模型&#xff08;如CNN和Transformer&#xff09;雖各有優勢&#xff0c;但CNN難以建模長距離依賴&…

CV - 目標檢測

物體檢測 目標檢測和圖片分類的區別&#xff1a; 圖像分類&#xff08;Image Classification&#xff09; 目的&#xff1a;圖像分類的目的是識別出圖像中主要物體的類別。它試圖回答“圖像是什么&#xff1f;”的問題。 輸出&#xff1a;通常輸出是一個標簽或一組概率值&am…

高并發秒殺系統設計:關鍵技術解析與典型陷阱規避

電商、在線票務等眾多互聯網業務場景中&#xff0c;高并發秒殺活動屢見不鮮。這類活動往往在短時間內會涌入海量的用戶請求&#xff0c;對系統架構的性能、穩定性和可用性提出了極高的挑戰。曾經&#xff0c;高并發秒殺架構設計讓許多開發者望而生畏&#xff0c;然而&#xff0…