精华内容
下载资源
问答
  • 2022-05-18 19:40:40

    同学,别退出呀,我可是全网最牛逼的 Android 蓝牙分析博主,我写了上百篇蓝牙文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。

    Android 蓝牙配对连接源码分析文档大全,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controll - 点击下载

    开始学习蓝牙协议栈的同学,阅读代码时候,遇到的第一个问题就是,当遇到发送event时候,就追踪不到代码了,直接接下来就不知道看啥代码了,小弟曾经初步学习的时候,也遇到过此问题,今天我就根据我多年经验,详细讲解下蓝牙协议栈消息(event)发送机制。


    一、今天以搜索设备为例,讲解下蓝牙协议栈消息机制:

    void BTA_DmSearch(tBTA_DM_SEARCH_CBACK* p_cback, bool is_bonding_or_sdp) {
    81    tBTA_DM_
    更多相关内容
  • Android 蓝牙协议栈消息(bta_sys_sendmsg)发送机制 ---- 全网唯一解析,开始学习蓝牙协议栈的同学,阅读代码时候,遇到的第一个问题就是,当遇到发送event时候,就追踪不到代码了,直接接下来就不知道看啥代码了,...
  • Android 蓝牙 BLE 连接(connect)数据流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据...
  • Android 蓝牙 A2DP协议连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,...
  • 安卓系统蓝牙协议栈 bluedroid 的使能

    千次阅读 2021-05-28 01:27:01
    安卓系统蓝牙协议栈 bluedroid 使能流程分析本文承接上篇文章《安卓中蓝牙系统服务层的使能流程分析》,接续分析协议栈层相关的使能流程,所以蓝牙协议栈bluedroid的使能始于JNI层enableNative()中调用协议栈接口...

    安卓系统蓝牙协议栈 bluedroid 使能流程分析

    00afc3e517d569d9cec33341056d6401.png

    本文承接上篇文章《安卓中蓝牙系统服务层的使能流程分析》,接续分析协议栈层相关的使能流程,所以蓝牙协议栈bluedroid的使能始于JNI层enableNative()中调用协议栈接口enable()函数。

    f3fe48550b7f9ac5ea5ec2497165c924.png

    话不多说,还是按照老规矩我们先从整体上对协议栈的使能有个印象,参考如下时序图。

    229e9b1cd170f7497db8174194dcb0f7.png

    安卓原生的蓝牙协议栈bluedroid在分层上被分为btif、bta、stack、hci这四层,每层的作用各不相同,但实际程序运行是在不同的线程运行的,为了方便大家对使能流程有更为深刻的了解,所以上述的使能时序图是以线程为依据。接下来就按照上述时序分别作出说明。

    蓝牙服务层JNI使能协议栈bluedroid,通过interface函数接口下发指令到达协议栈入口。

    stack_manager_get_interface()->start_up_stack_async();将使能指令下发到协议栈管理模块,模块内部通过线程stack_manage继续处理。

    依次使能btif_config、btsnoop、hci等模块

    1、 btsnoop模块:

    判断snoop开关是否打开,从而决定是否创建snoop文件来记录hci的交互信息。

    snoop开关位置在开发者选项中,打开该关开,则persist.bluetooth.btsnoopenable全局变量会被置为true;反之开关关闭,该变量会被置为false。

    snoop文件默认存储位置:/data/misc/bluetooth/logs/

    由于打开snoop开关的步骤比较复杂,一般用户根本不会进到开发者选项中,连从哪儿打开开发者选项都是一个难题,所以蓝牙开发过程中可以修改源码或重置persist.bluetooth.btsnoopenable的值来达到创建snoop文件记录hci的交互信息的目的。现提供如下两种方法

    方法A:

    修改源码中获取 persist.bluetooth.btsnoopenable 值时设置的错误值

    f2896899ae2854ca8e93cb1a61b5af52.png

    该全局变量是第一次在开发者选项中打开snoop开关时创建的,所以从来没操作过snoop开关,则该全局变量就没有定义。如果操作过开发者选项中的snoop开关,则获取上述全局变量就可以获取到对应的值,从而错误值不再起作用。

    方法B:

    通过指令:adb shell setprop persist.bluetooth.btsnoopenable true,开启蓝牙hci-snoop的开关。

    persist.bluetooth.btsnoopenable 全局变量的存储路径因安卓版本而有些许差异:

    Android 8的存储路径:/data/property/persist.bluetooth.btsnoopenable/

    Android 9的存储路径:/data/property/persistent_properties/

    2、 HCI模块:

    创建hci_thread线程,专门处理hci相关的流程,并同时初始化蓝牙芯片。

    通过HIDL技术获取芯片Controller模块对外提供的接口:

    1. btHci = IBluetoothHci::getService();

    2. android::sp callbacks = new BluetoothHciCallbacks();

    3. btHci->initialize(callbacks);

    HIDL:全称是HAL interface definition language(硬件抽象层接口定义语言),在此之前Android 有AIDL,架构在Android binder 之上,用来定义Android 基于Binder通信的Client 与Service之间的接口。HIDL也是类似的作用,只不过定义的是Android Framework与Android HAL实现之间的接口。

    Android HAL的实现方式由于芯片厂商的不同而有差异,实现内容都是类似于安卓源码中hardware\interfaces\bluetooth\1.0\中的实现方式。厂商再在HAL的实现中与自家芯片进行交互。这样通过统一的HAL接口就可以实现软硬件分离,安卓系统就可以集成不同厂家的蓝牙芯片。

    芯片模块初始化完成后会通过回调告知android层,这样蓝牙协议栈才会继续后面的使能流程。

    随着HCI模块使能完成就进入BTU_StartUp( )函数中开始初始化BTU控制模块,包括BTU、BTM、L2CAP、SDP等协议栈关键模块

    使能controller模块,实际上就是通过一组HCI命令从芯片层获取支持的功能参数

    typedef struct {

    BT_HDR* (*make_reset)(void);

    BT_HDR* (*make_read_buffer_size)(void);

    BT_HDR* (*make_host_buffer_size)(uint16_t acl_size, uint8_t sco_size, uint16_t acl_count, uint16_t sco_count);

    BT_HDR* (*make_read_local_version_info)(void);

    BT_HDR* (*make_read_bd_addr)(void);

    BT_HDR* (*make_read_local_supported_commands)(void);

    BT_HDR* (*make_read_local_extended_features)(uint8_t page_number);

    BT_HDR* (*make_write_simple_pairing_mode)(uint8_t mode);

    BT_HDR* (*make_write_secure_connections_host_support)(uint8_t mode);

    BT_HDR* (*make_set_event_mask)(const bt_event_mask_t* event_mask);

    BT_HDR* (*make_ble_write_host_support)(uint8_t supported_host, uint8_t simultaneous_host);

    BT_HDR* (*make_ble_read_white_list_size)(void);

    BT_HDR* (*make_ble_read_buffer_size)(void);

    BT_HDR* (*make_ble_read_supported_states)(void);

    BT_HDR* (*make_ble_read_local_supported_features)(void);

    BT_HDR* (*make_ble_read_resolving_list_size)(void);

    BT_HDR* (*make_ble_read_suggested_default_data_length)(void);

    BT_HDR* (*make_ble_read_maximum_data_length)(void);

    BT_HDR* (*make_ble_read_maximum_advertising_data_length)(void);

    BT_HDR* (*make_ble_read_number_of_supported_advertising_sets)(void);

    BT_HDR* (*make_ble_set_event_mask)(const bt_event_mask_t* event_mask);

    BT_HDR* (*make_read_local_supported_codecs)(void);

    }

    HCI层的交互如下图:

    0f6b0bcd4e902bf31e1a168436034a8f.png

    Reset完成后协议栈会主动下发HCI命令读取本端的蓝牙名字,并将新的名字下发给芯片,同时通过JNI层的回调将本端的蓝牙名字和地址上报给服务层。如果存在配对的蓝牙设备,也会将该设备信息上报。

    紧接着会初始化协议栈的socket模块,这部分主要是为建立OBEX连接和数据交互做准备的。

    协议栈所有使能工作完成,通过HAL bt_hal_cbacks->adapter_state_changed_cb回调将蓝牙使能成功的消息上报到JNI层。至此蓝牙协议栈bluedroid的使能流程的全部过程就分析完毕。

    本篇协议栈使能的分析就到这儿了,感兴趣的小伙伴欢迎私信留言一起讨论。

    展开全文
  • Android 蓝牙HFP 连接、SCO连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发...
  • android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android 蓝牙A2dp-Avrcp初始化-连接-播放源码分析文档大全-点击下载 一、蓝牙框架介绍 1.1相关名词解释 HAL: Hardware Abstraction Layer

    android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程

    Android 蓝牙A2dp-Avrcp初始化-连接-播放源码分析文档大全-点击下载

    一、蓝牙框架介绍

    1.1相关名词解释

    HAL: Hardware Abstraction Layer

    BTIF: Bluetooth Interface

    BTA: Bluetooth Application

    BTU: Bluetooth Upper layer

    BTE: Bluetooth Embedded layer

    展开全文
  • Android 蓝牙L2cap协议初始化、连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据...
  • Android 蓝牙设备配对pair流程(协议栈)图,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,...
  • 蓝牙协议栈分析

    千次阅读 2015-10-12 16:34:37
    蓝牙协议栈架构: 描述了协议栈Bluedroid,HAL层蓝牙适配库以及上层应用类 Bluedroid 分为两层: - BTE: Bluetooth Embedded System // 实现核心的蓝牙功能 - BTA: Bluetooth Application Layer //
     协议栈源码位置:external/bluetooth/bluedroid

    蓝牙协议栈架构:

    描述了协议栈Bluedroid,HAL层蓝牙适配库以及上层应用类

    模块及应用程序接口



    Bluedroid 分为两层:
    - BTE: Bluetooth Embedded System  // 实现核心的蓝牙功能
    - BTA: Bluetooth Application Layer // 与框架的应用程序进行通信

    framework :与蓝牙设备交互原理是通过Binder IPC机制使用蓝牙服务 ,代码位置 framework/base/core/java/android/bluetooth  

    Bluetooth Process:一个Android应用程序通过JNI与蓝牙协议栈交互,在Android框架层实现了蓝牙的服务和Profiles

    JNI: 通过回调的方式, 使用HAL层接口对蓝牙设备进行进行操作。

    HAL:定义了各种Profiles下使用蓝牙的标准接口,头文件位于hardware/libhardware/include/hardware
         bluetooth.h: Contains the HAL for the Bluetooth hardware on the device 
         bt_av.h:     Contains the HAL for the advanced audio profile. 
         bt_hf.h:     Contains the HAL for the handsfree profile. 
         bt_hh.h:     Contains the HAL for the HID host profile 
         bt_hl.h:     Contains the HAL for the health profile 
         bt_pan.h:    Contains the HAL for the pan profile 
         bt_sock.h:   Contains the HAL for the socket profile

    Bluetooth Stack: 蓝牙协议栈,实现了通用的蓝牙HAL及可配置的组件

    Vendor extensions: 厂商通过libbt-vendor模块来自定义扩展接口和HCI来方便调试


    Bluetooth profile interface 能力获取:

    (1)JNI层通过hw_get_module打开蓝牙协议库; // com_android_bluetooth_btservice_AdapterService.cpp 调用hw_get_module
    (2)通过open方法得到一个hw_device_t对象; // open方法即external\bluetooth\bluedroid\btif\src\bluetooth.c 的open_bluetooth_stack
    (3)获取到的hw_device_t对象也即协议栈对象bluetooth_module_t指针btStack
    (4)接着btStack->get_bluetooth_interface获取到bt_interface_t指针sBluetoothInterface
    (5)得到bt_interface_t就可以对蓝牙协议模块就行初始化,获取profiles id
    (6)初始化,注册回调
             sBluetoothInterface->init(&sBluetoothCallbacks); 
             // 回调
            bt_callbacks_t sBluetoothCallbacks = {
                sizeof(sBluetoothCallbacks),
                adapter_state_change_callback,
                adapter_properties_callback,
                remote_device_properties_callback,
                device_found_callback,
                discovery_state_changed_callback,
                pin_request_callback,
                ssp_request_callback,
                bond_state_changed_callback,
                acl_state_changed_callback,
                callback_thread_event,
                dut_mode_recv_callback,

                le_test_mode_recv_callback
            };
    (7)获取profiles
             sBluetoothInterface->get_profile_interface(BT_PROFILE_ XXXXXX_ID); 
             // BT_PROFILE_ XXXXXX_ID定义在external\bluetooth\bluedroid\btif\src\bluetooth.h
            如下:
    #define BT_HARDWARE_MODULE_ID "bluetooth"
    #define BT_STACK_MODULE_ID "bluetooth"
    #define BT_STACK_TEST_MODULE_ID "bluetooth_test"

    /* Bluetooth profile interface IDs */
    #define BT_PROFILE_HANDSFREE_ID "handsfree"
    #define BT_PROFILE_ADVANCED_AUDIO_ID "a2dp"
    #define BT_PROFILE_HEALTH_ID "health"
    #define BT_PROFILE_SOCKETS_ID "socket"
    #define BT_PROFILE_HIDHOST_ID "hidhost"
    #define BT_PROFILE_PAN_ID "pan"
    // proting from brcm
    #define BT_PROFILE_ADVANCED_AUDIO_SINK_ID "a2dpsink"
    #define BT_PROFILE_3D_SYNC_ID "3ds"

    #define BT_PROFILE_GATT_ID "gatt"
    #define BT_PROFILE_AV_RC_ID "avrcp"
    // proting from brcm
    #define BT_PROFILE_HIDDEVICE_ID "hiddevice"
         例如:音视频播放时的按键控制:#define BT_PROFILE_AV_RC_ID "avrcp"


    展开全文
  • bluedroid\bta\fs\bta_fs_ci.cbluedroid\bta\fs\bta_fs_cfg.cbluedroid\bta\mce\bta_mce_api.cbluedroid\bta\mce\bta_mce_act.cbluedroid\bta\mce\bta_mce_cfg.cbluedroid\bta\mce\bta_mce_main.cbluedroid\bta\mce\...
  • Android 蓝牙 BLE 数据从host发数据到controller,数据流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...
  • void l2c_rcv_acl_data(BT_HDR* p_msg) { L2CAP_TRACE_WARNING("L2CAP - l2c_rcv_acl_data"); uint8_t* p = (uint8_t*)(p_msg + 1) + p_msg->offset; //指向消息的数据域 macdbg_dmphex_kernel((const char*)...
  • Android 蓝牙AVRCP连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,代码...
  • BTU 层主要负责蓝牙主机底层协议栈的处理,包括L2CAP、GATT/ATT、SMP、GAP 以及部分规范等,并向上提供以“bta”为前缀的接口; BTC 层主要负责向应⽤用层提供接⼝支持、处理理基于 GATT 的规范、处理杂项等,并向...
  • Bluedroid: 蓝牙协议栈源码剖析

    千次阅读 2019-07-30 11:29:56
    一、 基础知识介绍 1.缩略语 BTIF: Bluetooth Interface BTU: Bluetooth Upper Layer BTM: Bluetooth Manager BTE: Bluetooth embedded ...BTA:Blueetooth application layer CO: call out\CI: call in HF...
  • Android 蓝牙 BLE 广播(advertising)数据流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚...
  • Android 蓝牙 BLE 扫描(scan)数据流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据...
  • Android 蓝牙 HPF中的rfcomm连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发...
  • Android 蓝牙设备配对pair流程(协议栈)图,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,...
  • Android 蓝牙A2DP初始化init流程(协议栈)图,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,...
  • Android 蓝牙 HPF中的rfcomm数据收发流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据...
  • 本文详细的将Android 蓝牙扫描周围设备流程进行了梳理,从UI开始扫描到协议栈发送扫描命令到controller,进行了源码分析。 更多源码分析: android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程 Android ...
  • Android 蓝牙hfp连接(java-framework层),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发走向,...
  • Android 蓝牙配对、协议栈使能、inquiry、discovery、hci发送数据、等等详细源码流程图,非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,...
  • 为了分析ESP32的蓝牙接口,是如何在协议栈上运行的,现在以最简单的启动广播为例,分析Bluedroid蓝牙协议栈整体流程。 具体过程如下: esp_ble_gap_start_advertising() esp_err_t esp_ble_gap_start_...
  • Android SDP服务发现初始化、连接流程图(协议栈),非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙开发者更清楚数据收发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 381
精华内容 152
关键字:

bta 蓝牙协议栈

友情链接: kejian.rar