首页 > 编程语言 >【蓝牙】Android 13 蓝牙源码分析

【蓝牙】Android 13 蓝牙源码分析

时间:2024-07-19 09:57:14浏览次数:15  
标签:AdapterService 适配器 蓝牙 连接 源码 Android public 属性

Android 13在蓝牙模块中进行了多项改进和优化。本文将详细分析其核心组件及其工作原理,包括BluetoothManagerServiceAdapterServiceAdapterProperties、蓝牙连接管理和JNI接口。

1. BluetoothManagerService

BluetoothManagerService是蓝牙管理的核心类,负责启动和停止蓝牙、管理蓝牙状态、处理蓝牙事件等。其主要职责如下:

  • 启动流程
    • 系统启动后,通过registerActivityLifecycleCallbacksregisterFragmentLifecycleCallbacks初始化并绑定AdapterService
    • 如果系统关机前蓝牙是开启状态,恢复蓝牙状态并启动适配器服务。
  • 状态管理
    • 通过getNameAndAddress方法获取蓝牙名称和地址,并存储到数据库中。
    • 根据系统配置和用户设置,决定蓝牙的初始状态(开/关)。
  • 事件处理
    • 处理蓝牙状态变化、设备连接/断开、数据传输等事件。
    • 利用Handler机制处理异步消息,例如MESSAGE_GET_NAME_AND_ADDRESS
public class BluetoothManagerService extends IBluetoothManager.Stub {
    // 初始化BluetoothAdapter
    private BluetoothAdapter mAdapter;
    // 处理系统启动后的蓝牙初始化
    private void handleOnBootPhase() {
        if (isBluetoothPersistedStateOnBluetooth() || isBluetoothPersistedStateOnAirplane()) {
            mAdapter.enable();
        } else {
            // 获取蓝牙名称和地址
            getNameAndAddress();
        }
    }
    // 获取蓝牙名称和地址
    private void getNameAndAddress() {
        Message msg = mHandler.obtainMessage(MESSAGE_GET_NAME_AND_ADDRESS);
        mHandler.sendMessage(msg);
    }
}

2. AdapterService

AdapterService是蓝牙适配器的服务类,负责蓝牙适配器的初始化、配置和操作。其主要功能包括:

  • 适配器初始化
    • 在服务创建时,通过onCreate方法加载适配器属性,包括设备名称、地址、支持的协议等。
    • 使用getAdapterPropertyNative方法从底层协议栈获取适配器属性。
  • 属性获取
    • 通过JNI接口与底层蓝牙协议栈通信,获取适配器的属性,如名称、地址、设备类型等。
    • 使用AdapterProperties类存储和管理这些属性。
  • 事件回调
    • 处理底层协议栈的回调事件,如adapterPropertyChangedCallback,并将结果传递给上层。

3. AdapterProperties

AdapterProperties用于存储和管理蓝牙适配器的属性,包括设备名称、地址、配对设备列表等。其关键点包括:

  • 属性存储
    • 存储适配器的名称、地址、配对设备列表等属性。
    • 通过getNamegetAddress方法获取属性值。
  • 回调处理
    • 接收底层协议栈的属性更新回调,如adapterPropertyChangedCallback
    • 更新内部存储的属性值,并通知AdapterService进行相应处理。
public class AdapterService extends Service {
    // 获取适配器名称
    public String getName() {
        return mAdapterProperties.getName();
    }
    // 在服务创建时加载适配器属性
    @Override
    public void onCreate() {
        // 加载名称和地址
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDADDR);
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME);
    }
}

4. 蓝牙连接管理

蓝牙连接管理涉及设备扫描、配对、连接建立等过程。其主要流程如下:

  • 扫描和配对
    • BluetoothScanner类负责设备扫描,BluetoothBondStateMachine类管理设备配对状态。
    • 通过startScancreateBond方法实现设备扫描和配对。
  • 连接建立
    • 在成功配对后,BluetoothGatt类负责建立连接,并管理连接状态。
    • 使用connectdisconnect方法管理连接的建立和断开。
  • 数据传输
    • 通过GATT协议进行数据传输,BluetoothGattServiceBluetoothGattCharacteristic定义了传输的数据结构。
    • 使用readCharacteristicwriteCharacteristic方法进行数据读写。
public class BluetoothGatt {
    // 建立连接
    public boolean connect() {
        return connectNative();
    }
    // 断开连接
    public void disconnect() {
        disconnectNative();
    }
}

5. JNI接口

JNI 接口是 Java 层与底层蓝牙协议栈通信的桥梁。

关键点:

  1. 方法调用:通过 JNI 方法调用底层蓝牙协议栈的函数,获取或设置蓝牙属性。

    JNIEXPORT jstring JNICALL
    Java_com_android_bluetooth_btservice_AdapterService_getNameNative(JNIEnv* env, jobject obj) {
        // 调用底层函数获取适配器名称
        return env->NewStringUTF(btif_get_adapter_name());
    }
    
    
  2. 回调处理:底层协议栈通过回调机制,将结果返回给 Java 层。

    static void adapter_properties_callback(bt_status_t status, int num_properties,
                                            bt_property_t* properties) {
        // 将属性变化通知 Java 层
        JNIEnv* env = getJNIEnv();
        env->CallVoidMethod(mCallbacksObj, method_onAdapterPropertyChanged, num_properties, properties);
    }
    
    

通过详细分析 Android 13 的蓝牙源码,我们可以看到其在蓝牙管理、适配器服务、属性管理、连接管理和 JNI 接口等方面的设计和实现。理解这些关键模块和流程,有助于我们更好地开发和调试蓝牙相关应用。

请使用微信扫一扫,关注公众号及时获取更多文章

请添加图片描述

标签:AdapterService,适配器,蓝牙,连接,源码,Android,public,属性
From: https://blog.csdn.net/u010870679/article/details/140504014

相关文章