Android BlueDroid 分析之扫描

本文探讨了Android BlueDroid中的BLE设备扫描流程,从代码结构、调用流程到重要数据结构进行详细分析。扫描流程始于Android Application的startLeScan(),经过BTIF、BTA、BTM、HCI层层传递,最终由HCI发送扫描命令,并将结果返回。重点介绍了tBTA_DM_SEARCH_CB和tBTM_CB数据结构在存储和处理扫描结果中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间一直在跟一个BLE相关的项目,之前对BLE基本没怎么接触,所以刚好趁这个机会好好把bluedroid好好梳理一遍。要完全分析清楚估计得花老长时间了,先一步步来吧,

  • BlueDroid 代码结构
  • BlueDroid 扫描的调用流程
  • BlueDroid 的一些重要数据结构

BlueDroid 代码结构

先看下Android 里BlueDroid里的代码结构:
这里写图片描述

很多目录吧,究竟从哪里看起很头疼吧。。

BlueDroid的入口在main目录中的bte_main.c中:

void bte_main_enable()
{
    APPL_TRACE_DEBUG("%s", __FUNCTION__);

    module_start_up(get_module(BTSNOOP_MODULE));
    module_start_up(get_module(HCI_MODULE));

    BTU_StartUp();
}

所有的启动都在后续进行。具体的初始化啥,启动啥,需要自己去研究咯。为了更熟悉bluedroid的代码,一般建议从一些特定的场景开始入手,这次我从BLE常见的扫描到连接这样一个使用场景先来看看bluedroid的代码结构。

BlueDroid 的一般调用流程

如上面所讲的,我们现在从BLE常见的扫描与连接开始这一流程,强调下,我们在这里只关注与bluedroid层面,不关心Android Application 与Android Framework的实现,因为这样的介绍已经有很多了。优快云上不少博客都有介绍,就不在这里梳理了。

BLE 设备扫描流程

Android Application在上层调用 startLeScan()来启动扫描流程,我们关注下BlueDroid里如何来响应这样一个扫描流程。

BlueDroid里提供给上层的接口:

static const btgatt_interface_t btgattInterface = {
    sizeof(btgattInterface),

    btif_gatt_init,
    btif_gatt_cleanup,

    &btgattClientInterface,
    &btgattServerInterface,
};

这个btgattInterface的接口就是提供给Android framework使用的,两个接口函数,一个初始化函数,一个清理函数。另外就是两个接口指针,一个给GattClient调用,一个给GattServer调用。 先只关注GattClient的接口吧。

const btgatt_client_interface_t btgattClientInterface = {
    btif_gattc_register_app,
    btif_gattc_unregister_app,
    btif_gattc_scan,
    btif_gattc_open,
    btif_gattc_close,
    。。。。。。。。。
    。。。。。。。。。
    }

这个接口里定义函数很多,先只摘录一小部分。btif_gattc_scan 会最终响应上层的startLeScan函数,为什么呢?自己起找对应关系吧,Android里framework分析的基本功哈。
接下来流程会是这样的:

BTIF                                  btif_gattc_scan

                                      BTIF_GATTC_SCAN_START

BTA                                   BTA_DmBleObserve

                                      bta_dm_ble_observe

BTM                                   BTM_BleObserve

                                      btm_ble_start_scan

HCI                                 btsnd_hcic_ble_set_scan_enable

上面左边代表bluedroid里的逻辑分层,右边代表是在每个逻辑层具体走过的函数。等下我们过下具体的函数逻辑。从左边来看逻辑上bluedroid上可以分成BTIF,BTA,BTM,HCI四个层次,但是其实应该还可以加上BTU等层,从字面上看BTIF是接口层,具体应该就是与Android之间的接口,BTA指应用层,BTM指Bluedroid中的管理层,HCI是指HOST Control Interface,即主机与BT控制器之间的接口。

我们来一个个过下这上面提到的函数的一些重要逻辑:
前面的btif_gattc_scan与BTA_DmBleObserve都没啥好说的。都是简单的把事件包装往下发送。
bta_dm_ble_observe:

void bta_dm_ble_observe (tBTA_DM_MSG *p_data)
{
    tBTM_STATUS status;
    if (p_data->ble_observe.start)
    {
        /*Save the  callback to be called when a scan results are available */
        bta_dm_search_cb.p_scan_cback = p_da
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值