AndroidO bluetooth如何上传配对记录和本地信息(及扒掉Bluetooth.apk,用自己的bt stack如何对接)

重点:

配对记录在:/data/misc/bluedroid/bt_config.conf

       本地地址:初始化的时候从HCI获取

       本地设备名:getprop ro.product.model可以获取到

一、如何上传配对记录

1、RemoteDevices.java内有个函数:devicePropertyChangedCallback

会上传:

AbstractionLayer.BT_PROPERTY_BDNAME

AbstractionLayer.BT_PROPERTY_REMOTE_FRIENDLY_NAME

AbstractionLayer.BT_PROPERTY_BDADDR

AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE

AbstractionLayer.BT_PROPERTY_UUIDS

AbstractionLayer.BT_PROPERTY_TYPE_OF_DEVICE

AbstractionLayer.BT_PROPERTY_REMOTE_RSSI:

调用的位置JniCallbacks.java

2、继续往JNI层找可以看到devicePropertyChangedCallback 对应的jmethodID为method_devicePropertyChangedCallback

3、继续找method_devicePropertyChangedCallback,用到的函数是remote_device_properties_callback

4、继续找remote_device_properties_callback。找到2个位置

一个是:

很明显这是搜索设备时的callback。

另一个是:

应该是这里

5、那么如果其他函数要用remote_device_properties_callback,肯定是调用sBluetoothCallbacks的remote_device_properties_cb

6、找remote_device_properties_cb

7、找btif_remote_properties_evt,找到btif_storage_load_bonded_devices,可以看到描述这就是用来上传配对记录的 

8、继续找BTIF_STORAGE_GET_REMOTE_PROP 

9、找btif_storage_get_remote_device_property 

10、找cfg2prop

 11、找btif_config_get_str

12、config里面的数据是怎么来的?看btif_config.cc中的init函数 

可以看到从CONFIG_FILE_PATH里面读到的。即/data/misc/bluedroid/bt_config.conf

这是在我系统上看到的: 

 

二、如何上传本地信息

也是在btif_storage_load_bonded_devices里面

这个函数是这样的:

1、获取本地信息:

这里面有一个需要注意:

这里面把所有已配对设备的地址上传上去了

最后调用btif_adapter_properties_evt把信息上传上去:

2、btif_adapter_properties_evt里面调用adapter_properties_cb

3、adapter_properties_cb就是adapter_properties_callback

4、adapter_properties_callback里面用到jmethodID为method_adapterPropertyChangedCallback,对应的就是adapterPropertyChangedCallback(JniCallbacks.java)

5、继续找到AdapterProperties.java里面的adapterPropertyChangedCallback

6、这里面就把本地信息和已配对的设备的地址进行处理

 7、这里面把已配对设备的地址处理如下:

8、然后再回到btif_storage_load_bonded_devices继续看,下面可以看到开始整理配对记录的信息

9、然后通过btif_remote_properties_evt传上去 

三、扒掉Bluetooth.apk如何对接

我们的sdk是上传本地信息和配对记录是分开的。

1、当收到本地信息时,可以使用AdapterProperties.java的adapterPropertyChangedCallback。只处理本地设备名、本地设备地址、本地设备cod和本地设备UUID。

2、当收到配对记录时

(1)可以先使用AdapterProperties.java的adapterPropertyChangedCallback,可以这样定义

int[] types = new int[1];

byte[][] val = new byte[1][];

types[0] = AbstractionLayer.BT_PROPERTY_ADAPTER_BONDED_DEVICES;

val[0] = Utils.getBytesFromAddress(paired_device.getRemote_Device_Address());

然后使用adapterPropertyChangedCallback(types, val);把一个配对记录的地址进行处理。

(2)再用RemoteDevices.java的devicePropertyChangedCallback把这个配对记录的其他信息进行处理。

(3)然后再处理下一个设备。

四、关于原生蓝牙本地信息的获取分析:

1、btif_storage_load_bonded_devices中获取本地信息用的是BTIF_STORAGE_GET_ADAPTER_PROP:

2、找BTIF_STORAGE_GET_ADAPTER_PROP

3、找btif_storage_get_adapter_property

4、地址使用controller.cc里面的get_address

get_address

地址是初始化的时候获取的(应该是HCI) 

5、配对设备数量,用到btif_in_fetch_bonded_devices 

 

最终其实还是到/data/misc/bluedroid/bt_config.conf

6、UUID(每个协议初始化的时候会设置上)

7、name、scan mode、discovery timeout在btif_dm_get_adapter_property里面获取

(1)name

btif_get_default_local_name

可以看到PROPERTY_PRODUCT_MODEL

所以这个其实是从prop里面获取。

可以直接使用

getprop ro.product.model

(2)scan mode(因为是初始化的时候上报本地信息和配对记录,所以是0)

(3)discovery timeout默认是120

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝牙协议栈(Bluetooth stack)是指在蓝牙设备上运行的软件组件,用于实现蓝牙通信的各个层次。蓝牙协议栈通常由多个层次组成,包括物理层、链路层、协议层和应用层。每个层次都有特定的功能和责任,协同工作以实现蓝牙设备之间的通信。 在Android系统中,蓝牙协议栈被称为bluedroid。它是Android系统中的一个重要组件,负责管理蓝牙设备的连接、数据传输和其他蓝牙相关功能。\[1\]而在Ubuntu系统中,蓝牙协议栈使用的是bluez。它是一个开源的蓝牙协议栈,提供了丰富的API和工具,用于开发和调试蓝牙应用程序。\[1\] 蓝牙协议栈的实现需要遵循蓝牙标准规范,这些规范由蓝牙技术联盟(Bluetooth SIG)制定。蓝牙协议栈的源代码可以通过一些书籍或从蓝牙技术联盟的官方网站下载。例如,《蓝牙协议及其源代码分析》是一本介绍蓝牙协议栈的书籍,其中提供了蓝牙协议栈的源代码分析和相关文档。\[2\] 对于想学习蓝牙协议栈的人来说,拥有一套开发板是非常有帮助的。开发板可以用于实验和调试蓝牙协议栈,帮助理解蓝牙通信的原理和实现。同时,学习蓝牙协议栈也可以为修改和定制现有的协议栈提供基础。\[3\] #### 引用[.reference_title] - *1* [BlueDroid软件协议栈架构](https://blog.csdn.net/mouse1598189/article/details/87858779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [蓝牙协议栈(Bluetooth stack)简介](https://blog.csdn.net/pan0755/article/details/107857793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [吐血推荐历史最全的蓝牙协议栈介绍](https://blog.csdn.net/XiaoXiaoPengBo/article/details/107466841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值