【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…