【android bluetooth 框架分析 04】【bt-framework 層詳解 6】【Properties介紹】

DevicePropertiesAdapterPropertiesStorageModule、以及 bt_config.conf 是 AOSP Bluetooth 棧中 設備屬性管理與持久化系統 的核心組成部分,它們之間關系緊密,但職責各有不同。

下面我將依次講解它們的區別與聯系.

注意:

  • 在代碼里面 還有 BluetoothProperties : 他是管理 藍牙相關的系統屬性的, 和本文討論的 DevicePropertiesAdapterProperties 不是同一個話題。
  • 有興趣可以參看: 【android bluetooth 框架分析 04】【bt-framework 層詳解 1】【BluetoothProperties介紹】

1. 核心組件職責概覽

模塊職責管理對象是否與存儲直接交互
AdapterProperties管理本地藍牙適配器的屬性(如:名稱、可發現性、IO能力)本地適配器? 是,會調用 StorageModule
DeviceProperties管理單個遠程設備的屬性(如名稱、RSSI、UUID、版本信息等)每個遠程設備一套? 是,會調用 StorageModule
StorageModule抽象了屬性的持久化與加載邏輯,負責讀寫 bt_config.conf存儲本地和遠程設備屬性? 是,底層對 bt_config.conf 讀寫
bt_config.conf配置文件,持久化存儲藍牙設備屬性(ini 格式)適配器/已配對的遠程設備? 是,由 StorageModule 管理

2. 各模塊職責與交互細節

1. AdapterProperties

  • 對應的是本地藍牙適配器的屬性,如:

    • 本地藍牙名 (BT_PROPERTY_BDNAME)

    • 適配器地址 (BT_PROPERTY_BDADDR)

    • 可發現性 (BT_PROPERTY_ADAPTER_SCAN_MODE)

    • LE 特性等

  • 存儲方式:

    • 初始化時從 StorageModule 讀取對應項

    • 修改時(如用戶改藍牙名)通過 StorageModule 寫入 bt_config.conf[Adapter]


2. DeviceProperties

  • 對應每一個遠程設備(配對或曾連接)的屬性,如:

    • 名稱、RSSI、UUID、版本、是否支持某功能等

    • 這些屬性通過掃描、配對、連接等過程獲得

  • 管理方式:

    • 每個遠程設備維護一個 DeviceProperties 實例(以地址為 key)

    • 當發現設備、連接、配對或服務發現后更新屬性

  • 寫入存儲:

    • 只有綁定/配對成功的設備才會寫入

      • 如果一個設備只是在掃描時被發現,會創建一個 臨時的 DeviceProperties,保存在內存中。 掉電或者開關藍牙時將丟失。
    • 這些屬性會保存到 bt_config.conf[RemoteDevice] 節,例如:

[RemoteDevice00:11:22:33:44:55]
Name=MyHeadphones
DevType=1
Service=180A 112D ...

3. StorageModule

  • 提供統一接口負責藍牙配置的持久化與讀取。

  • 核心功能:

    • 加載/保存本地適配器屬性

    • 加載/保存配對設備屬性

    • 支持遷移、同步、回寫等操作

  • 底層調用 config.cc 進行 ini 格式文件操作。

我之前寫過一篇 關于 StorageModule 模塊的文章,需要 可以查閱:

  • 【android bluetooth 框架分析 02】【Module詳解 6】【StorageModule 模塊介紹】

4. bt_config.conf 文件

  • 位置:/data/misc/bluedroid/bt_config.conf

  • 權限:系統組件訪問,普通 APP 不可讀

  • 結構:

[Adapter]
Address=00:11:22:33:AA:BB
Name=CarBluetooth
ScanMode=1
DiscoverableTimeout=120[RemoteDevice11:22:33:44:55:66]
Name=Phone
DevType=1
Service=110A 110B

3. 關鍵問題:掃描到的未配對設備會寫入 bt_config.conf 嗎?

掃描到的未配對設備會寫入 bt_config.conf 嗎?

不會!

  • 當僅僅是掃描(inquiry/discovery)到一個設備時,系統可能會臨時創建該設備的 DeviceProperties 實例,但不會寫入 bt_config.conf

  • 只有以下情形會觸發寫入:

    • 配對成功

    • 某些屬性需要持久化(如用戶手動設置了設備名等)

    • 有實際連接歷史 + 存儲條件滿足(具體由 DeviceManager::Add 判斷)

1. 臨時設備屬性的生命周期:

  • 臨時創建的 DeviceProperties 保存在內存中

  • 斷電或重啟后不保留

  • 若用戶未配對該設備,這些屬性不會持久化


4. 模塊關系圖示意

+-----------------+
| AdapterProperties (本地適配器屬性)
+-----------------+|v
+-----------------+
| StorageModule   | <-------> bt_config.conf (持久化存儲)
+-----------------+^|
+------------------+
| DeviceProperties (遠程設備屬性)
| -- 每個設備一套 --
+------------------+

5. 我們 源碼里面都定義了那些屬性呢?

1. java 側的屬性表

  • android/app/src/com/android/bluetooth/btservice/AbstractionLayer.java
    static final int BT_PROPERTY_BDNAME = 0x01;static final int BT_PROPERTY_BDADDR = 0x02;static final int BT_PROPERTY_UUIDS = 0x03;static final int BT_PROPERTY_CLASS_OF_DEVICE = 0x04;static final int BT_PROPERTY_TYPE_OF_DEVICE = 0x05;static final int BT_PROPERTY_SERVICE_RECORD = 0x06;static final int BT_PROPERTY_ADAPTER_SCAN_MODE = 0x07;static final int BT_PROPERTY_ADAPTER_BONDED_DEVICES = 0x08;static final int BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT = 0x09;static final int BT_PROPERTY_REMOTE_FRIENDLY_NAME = 0x0A;static final int BT_PROPERTY_REMOTE_RSSI = 0x0B;static final int BT_PROPERTY_REMOTE_VERSION_INFO = 0x0C;static final int BT_PROPERTY_LOCAL_LE_FEATURES = 0x0D;static final int BT_PROPERTY_LOCAL_IO_CAPS = 0x0e;static final int BT_PROPERTY_LOCAL_IO_CAPS_BLE = 0x0f;static final int BT_PROPERTY_DYNAMIC_AUDIO_BUFFER = 0x10;static final int BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER = 0x11;

2. native 屬性表

bt_property_type_t

  • system/include/hardware/bluetooth.h
/* Bluetooth Adapter and Remote Device property types */
typedef enum {/* Properties common to both adapter and remote device *//*** Description - Bluetooth Device Name* Access mode - Adapter name can be GET/SET. Remote device can be GET* Data type   - bt_bdname_t*/BT_PROPERTY_BDNAME = 0x1,/*** Description - Bluetooth Device Address* Access mode - Only GET.* Data type   - RawAddress*/BT_PROPERTY_BDADDR,/*** Description - Bluetooth Service 128-bit UUIDs* Access mode - Only GET.* Data type   - Array of bluetooth::Uuid (Array size inferred from property*               length).*/BT_PROPERTY_UUIDS,/*** Description - Bluetooth Class of Device as found in Assigned Numbers* Access mode - Only GET.* Data type   - uint32_t.*/BT_PROPERTY_CLASS_OF_DEVICE,/*** Description - Device Type - BREDR, BLE or DUAL Mode* Access mode - Only GET.* Data type   - bt_device_type_t*/BT_PROPERTY_TYPE_OF_DEVICE,/*** Description - Bluetooth Service Record* Access mode - Only GET.* Data type   - bt_service_record_t*/BT_PROPERTY_SERVICE_RECORD,/* Properties unique to adapter *//*** Description - Bluetooth Adapter scan mode* Access mode - GET and SET* Data type   - bt_scan_mode_t.*/BT_PROPERTY_ADAPTER_SCAN_MODE,/*** Description - List of bonded devices* Access mode - Only GET.* Data type   - Array of RawAddress of the bonded remote devices*               (Array size inferred from property length).*/BT_PROPERTY_ADAPTER_BONDED_DEVICES,/*** Description - Bluetooth Adapter Discoverable timeout (in seconds)* Access mode - GET and SET* Data type   - uint32_t*/BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT,/* Properties unique to remote device *//*** Description - User defined friendly name of the remote device* Access mode - GET and SET* Data type   - bt_bdname_t.*/BT_PROPERTY_REMOTE_FRIENDLY_NAME,/*** Description - RSSI value of the inquired remote device* Access mode - Only GET.* Data type   - int8_t.*/BT_PROPERTY_REMOTE_RSSI,/*** Description - Remote version info* Access mode - SET/GET.* Data type   - bt_remote_version_t.*/BT_PROPERTY_REMOTE_VERSION_INFO,/*** Description - Local LE features* Access mode - GET.* Data type   - bt_local_le_features_t.*/BT_PROPERTY_LOCAL_LE_FEATURES,/*** Description - Local Input/Output Capabilities for classic Bluetooth* Access mode - GET and SET* Data Type - bt_io_cap_t.*/BT_PROPERTY_LOCAL_IO_CAPS,/*** Description - Local Input/Output Capabilities for BLE* Access mode - GET and SET* Data Type - bt_io_cap_t.*/BT_PROPERTY_LOCAL_IO_CAPS_BLE,BT_PROPERTY_DYNAMIC_AUDIO_BUFFER,/*** Description - True if Remote is a Member of a Coordinated Set.* Access mode - GET.* Data Type - bool.*/BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER,BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP = 0xFF,
} bt_property_type_t;

3. 屬性使用場景介紹

1. AdapterProperties 和 DeviceProperties 共同使用

枚舉常量說明使用范圍數據類型訪問權限
🔁 適用于 Adapter 和 Remote Device
BT_PROPERTY_BDNAME設備名稱Adapter: 讀/寫Remote Device: 只讀bt_bdname_tGET / SET(Adapter)GET(Remote)
BT_PROPERTY_BDADDR設備地址Adapter & Remote DeviceRawAddressGET
BT_PROPERTY_UUIDS支持的服務 UUID 列表Remote Devicebluetooth::Uuid[]GET
BT_PROPERTY_CLASS_OF_DEVICE類別碼Remote Deviceuint32_tGET
BT_PROPERTY_TYPE_OF_DEVICE設備類型(BR/EDR/LE)Remote Devicebt_device_type_tGET
BT_PROPERTY_SERVICE_RECORD服務記錄Remote Devicebt_service_record_tGET

2. 僅 AdapterProperties 使用

枚舉常量說明使用范圍數據類型訪問權限
🧭 僅適用于 Adapter(本地適配器)
BT_PROPERTY_ADAPTER_SCAN_MODE掃描模式(可發現性)Adapterbt_scan_mode_tGET / SET
BT_PROPERTY_ADAPTER_BONDED_DEVICES已綁定設備地址列表AdapterRawAddress[]GET
BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT可發現超時時間Adapteruint32_tGET / SET
BT_PROPERTY_LOCAL_LE_FEATURES本地 LE 特性Adapterbt_local_le_features_tGET
BT_PROPERTY_LOCAL_IO_CAPS本地 IO 能力(經典藍牙)Adapterbt_io_cap_tGET / SET
BT_PROPERTY_LOCAL_IO_CAPS_BLE本地 IO 能力(BLE)Adapterbt_io_cap_tGET / SET
BT_PROPERTY_DYNAMIC_AUDIO_BUFFER音頻緩沖設置(動態)Adapter自定義類型(未明確)

3. 僅 DeviceProperties 使用

枚舉常量說明使用范圍數據類型訪問權限
📡 僅適用于 Remote Device(遠程設備)
BT_PROPERTY_REMOTE_FRIENDLY_NAME遠程設備名稱(用戶設定)Remote Devicebt_bdname_tGET / SET
BT_PROPERTY_REMOTE_RSSI遠程設備 RSSIRemote Deviceint8_tGET
BT_PROPERTY_REMOTE_VERSION_INFO遠程設備協議版本信息Remote Devicebt_remote_version_tGET / SET
BT_PROPERTY_REMOTE_IS_COORDINATED_SET_MEMBER是否是協同設備成員Remote DeviceboolGET
BT_PROPERTY_REMOTE_DEVICE_TIMESTAMP屬性刷新時間戳Remote Deviceint64_t(或自定義)GET

4. 小結

分類枚舉項
Adapter 專屬屬性ADAPTER_SCAN_MODE, ADAPTER_BONDED_DEVICES, ADAPTER_DISCOVERABLE_TIMEOUT, LOCAL_LE_FEATURES, LOCAL_IO_CAPS, LOCAL_IO_CAPS_BLE, DYNAMIC_AUDIO_BUFFER
Remote Device 專屬屬性REMOTE_FRIENDLY_NAME, REMOTE_RSSI, REMOTE_VERSION_INFO, REMOTE_IS_COORDINATED_SET_MEMBER, REMOTE_DEVICE_TIMESTAMP, CLASS_OF_DEVICE, TYPE_OF_DEVICE, SERVICE_RECORD, UUIDS
Adapter 與 Remote 共用屬性BDNAME, BDADDR

6. 總結重點

關鍵點說明
AdapterProperties管理本地適配器的屬性,初始化時加載并可寫入 bt_config.conf
DeviceProperties管理遠程設備屬性,僅在配對后寫入 bt_config.conf
StorageModule所有屬性存儲的中間橋梁
bt_config.conf存儲持久化藍牙信息的文件,位于 /data/misc/bluedroid
掃描行為是否寫入文件?? 不會,只有綁定/配對設備才寫入

接下來我會出單獨的文章來總結 DevicePropertiesAdapterProperties.

敬請期待!!!

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

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

相關文章

@Resource vs @Autowired 在Spring中的使用和區別

Resource vs Autowired 在Spring中的使用和區別 在Spring開發中&#xff0c;我們常會接觸兩個用于實現引用模塊注入的注解&#xff1a;Resource 和 Autowired。它們在使用上有些相似之處&#xff0c;但本質上來看&#xff0c;有所區別。本文將給出兩者的詳細介紹和對比&#x…

Mac M4 芯片運行大模型指南,包括模型微調與推理

Mac M4 芯片運行大模型指南&#xff0c;模型微調與推理 背景模型推理 Ollama&#x1f50d; 舉例說明&#xff1a;踩坑 模型微調 unsloth 背景 在國補、教育優惠、京東會員500優惠券等眾多優惠之下。 我拿下了Macmini M4 16G 內存萬兆網卡。在機器到手的第一時間&#xff0c;馬…

微信小程序中安裝vant

以下是微信小程序中安裝 Vant 的詳細步驟&#xff1a; 1. 初始化項目 在微信小程序項目目錄下&#xff0c;打開終端&#xff0c;執行以下命令進行項目初始化&#xff1a; npm init -y該命令會快速生成一個默認的package.json文件&#xff0c;-y參數表示直接使用默認配置&…

今天做的力扣SQL

我本地markdown的東西直接復制出來了。 多說一嘴&#xff0c;今天早上六點醒了&#xff0c;然后被外面吵&#xff0c;心里也擔心找實習就一直睡不著了。索性直接來實驗室&#xff0c;這一上午感覺好快啊。幸運的是&#xff0c;自己也沒有浪費時間&#xff0c;還行吧。SQL欠的賬…

【開發常用命令】:docker常用命令

docker常用命令 基礎命令 # 啟動docker systemctl start docker # 關閉docker systemctl stop docker # 重啟docker systemctl restart docker # 設置開機自啟動 systemctl enable docker # 查看docker運行狀態 systemctl status docker # 查看docker版本號信息 docker versi…

安裝配置以太鏈錢包工具

安裝go語言環境 1、官網下載go安裝包并上傳到指定機器 https://golang.google.cn/dl/ 2、解壓縮至指定位置&#xff1a; tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz 3、將 /usr/local/go/bin 目錄添加至 PATH 環境變量&#xff1a; export PATH$PATH:/usr/local/g…

論文閱讀:speculative decoding

Fast Inference from Transformers via Speculative Decoding 論文地址&#xff1a;https://arxiv.org/pdf/2211.17192 speculative sampling 為了從分布 p ( x ) p(x) p(x) 中采樣&#xff0c;我們實際上是從分布 q ( x ) q(x) q(x) 中采樣 x x x&#xff0c;如果 q ( …

java操作word里的表格

依賴&#xff1a; <dependency><groupId>com.techCoLtd</groupId><artifactId>aspose-words-16.4.0-jdk16</artifactId><classifier>jdk16</classifier> </dependency>/*** 刪除表格及表格的行* throws Exception*/ private s…

單鏈表經典算法題之分割鏈表

給定一個頭結點和一個值x&#xff0c;是鏈表中所有小于x的值都在x前面 typedef struct ListNode ListNode; struct ListNode* partition(struct ListNode* head, int x) { //思路一&#xff1a;在原鏈表上進行修改 //思路二&#xff1a;創建新鏈表&#xff0c;使用哨兵位&…

Modbus TCP轉DeviceNet網關連接ABB變頻器配置案例

某工廠需要將支持Modbus TCP協議的上位機控制系統&#xff08;如PLC或SCADA&#xff09;與支持DeviceNet協議的變頻器&#xff08;如ABB ACS880、施耐德ATV320等&#xff09;進行通信。為實現協議轉換&#xff0c;采用開疆智能Modbus TCP轉DeviceNet網關KJ-DVCZ-MTCPS作為中間設…

【力扣 簡單 C++】206. 反轉鏈表

目錄 題目 解法一&#xff1a;迭代 解法二&#xff1a;遞歸 題目 待添加 解法一&#xff1a;迭代 class Solution { private:ListNode* reverse(ListNode* head){ListNode* newHead {};while (head){ListNode* nextNode {head->next};head->next newHead;newHead …

計算機視覺之三維重建(深入淺出SfM與SLAM核心算法)—— 1. 攝像機幾何

文章目錄 1. 針孔相機1.1. 針孔成像1.2. 光圈對成像的影響 2. 透視投影相機2.1. 透鏡成像2.2. 失焦2.3. 徑向畸變2.4. 透視投影的性質 3. 世界坐標系到像素坐標系的變換4. 其它相機模型4.1. 弱透視投影攝像機4.2. 正交投影攝像機4.3. 各種攝像機模型的應用場合 課程視頻鏈接&am…

第十三節:第七部分:Stream流的中間方法、Stream流的終結方法

Stream流常見的中間方法 Stream流常見的終結方法 代碼 學生類&#xff08;代碼一與代碼二共涉及到的類&#xff09; package com.itheima.day28_Stream;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private i…

深入理解 Go 中的字節序(Endianness)檢測代碼

深入理解 Go 中的字節序&#xff08;大小端&#xff09;檢測代碼 在計算機系統中&#xff0c;字節序&#xff08;Endianness&#xff09; 是指多字節數據類型&#xff08;如 int16、int32 等&#xff09;在內存中的存儲順序。Go 語言標準庫提供了對大端&#xff08;Big-endian&…

JAVA:RabbitMQ 消息持久化機制的技術指南

?? 1、簡述 在使用 RabbitMQ 構建可靠消息系統時,消息丟失是必須避免的問題。為此,RabbitMQ 提供了消息持久化機制(Message Durability),可以保障在 Broker 異常宕機后數據不會丟失。 本篇博客將從原理出發,結合 Spring Boot 實戰講解如何正確實現 RabbitMQ 消息持久…

tabs頁簽嵌套表格,切換表格保存數據不變并回勾

需求&#xff1a;點擊左邊的tab頁簽&#xff0c;請求右側表格數據&#xff1b;如果返回的接口數據存在taskuser字段并不為null&#xff0c;那么按照這個字段去回勾數據。如果存在數據&#xff0c;但與后面所勾選的數據項不同&#xff0c;按照后面勾選的為主。 <el-tabs tab-…

Java Kafka消費者

基礎 Java Kafka消費者主要通過以下核心類實現&#xff1a; KafkaConsumer&#xff1a;消費者的核心類&#xff0c;用于創建消費者對象進行數據消費1ConsumerConfig&#xff1a;獲取各種配置參數&#xff0c;如果不配置就使用默認值1ConsumerRecord&#xff1a;每條數據都要封…

Git操作問題及解決方案-記錄5

Git操作問題及解決方案 問題一&#xff1a;本地更改與遠程更新沖突 問題描述 當本地文件有未提交的更改&#xff0c;同時遠程倉庫也有更新時&#xff0c;執行git pull會導致沖突。 $ git pull origin main error: Your local changes to the following files would be overw…

一[3]、ubuntu18.04環境 利用 yolov8 訓練開源列車數據集,并實現列車軌道檢測

一、開源車載數據集地址 (7 封私信) 軌道交通數據集-OSDaR23: Open Sensor Data for Rail 2023 - 知乎 二、參考資料 https://zhuanlan.zhihu.com/p/692608487 YOLOv8訓練自己的數據集-CSDN博客 https://download.csdn.net/blog/column/12710137/140991739

C語言數據結構筆記5:Keil 編譯器優化行為_malloc指針內存分配問題

記錄倆個keil5 STM32 的c語言編程中 &#xff0c;編譯器優化行為 和 指針內存分配問題。 目錄 關閉Keil 編譯器優化行為&#xff1a; malloc指針內存分配問題 多層嵌套的結構體&#xff1a; 用指針取值&#xff1a; 發現問題&#xff1a; 解決問題&#xff1a; 示例代碼 關閉Ke…