赞
踩
这段时间一直在跟一个BLE相关的项目,之前对BLE基本没怎么接触,所以刚好趁这个机会好好把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的代码结构。
如上面所讲的,我们现在从BLE常见的扫描与连接开始这一流程,强调下,我们在这里只关注与bluedroid层面,不关心Android Application 与Android Framework的实现,因为这样的介绍已经有很多了。CSDN上不少博客都有介绍,就不在这里梳理了。
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 call
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。