当前位置:   article > 正文

Android BlueDroid 分析之扫描_ble扫描btsnoop

ble扫描btsnoop

这段时间一直在跟一个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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

BlueDroid 的一般调用流程

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

BLE 设备扫描流程

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

BlueDroid里提供给上层的接口:

static const btgatt_interface_t btgattInterface = {
    sizeof(btgattInterface),

    btif_gatt_init,
    btif_gatt_cleanup,

    &btgattClientInterface,
    &btgattServerInterface,
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这个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,
    。。。。。。。。。
    。。。。。。。。。
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这个接口里定义函数很多,先只摘录一小部分。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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

上面左边代表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 call
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/820286
推荐阅读
相关标签
  

闽ICP备14008679号