二、蓝牙扫描入口分析
1、JNI层调用开始扫描函数:(jni/com_android_bluetooth_btservice_adaptservice.cpp)中startDiscoveryNative()
上面函数又调用协议栈(btif/src)中bluetooth.c文件中的start_discovery();(开始扫描函数接口,在这层中函数实现)
2、(jni/com_android_bluetooth_btservice_adaptservice.cpp) classinitnative()函数用来:
JNI层从Java层获取回调函数,并从bluetooth.default.so中获取操作接口函数。
其中:Jni从Java层获取蓝牙扫描状态变化的回调函数:method_discoveryStateChangeCallback
(apps/bluetooth/src/com/android/bluetooth/btservice/AdapterProperties.java)
其中:Jni从Java层获取的蓝牙设备的通知回调函数:method_deviceFoundCallback
(apps/bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java)
获取蓝牙操作接口btStack->get_bluetooth_interface();如:enable();disable();等
***蓝牙接口函数位置为:协议栈(btif/src)中bluetooth.c
3、在AdapterService.java初始化时,调用initnative()函数,725行,进行前期初始化。
//alps/vendor/mediatek/proprietary/packages/apps/Bluetooth/src/com/android/bluetooth/btservice/AdapterService.java
initnative()
|该函数实现在jni/com_android_bluetooth_btservice_AdapterService.cpp中,689行。
|此函数中:
调用协议栈的init()函数接口,//bluetooth.c 136行 向协议栈注册回调函数集合。当协议栈发生
状态变化和有消息需要通知上层时,会调用相应的注册回调函数。
|
注册回调函数集合(jni/com_android_bluetooth_btservice_adaptservice.cpp) sBluetoothCallback();
4、当协议栈扫描到设备时会调用:device_found_callback(); //jni/com_android_bluetooth_btservice_AdapterService.cpp
这个函数中最后一句:CallbackEnv->CallVoidMethod();
中method_deviceFoundCallback 是调用java层(apps/bluetooth/src/com/android/bluetooth/btservice/RemoteDevices.java)
的deviceFoundCallback()函数;
总结:在JNI层中调用扫描函数(此函数在协议栈中),start_discovery()进行设备扫描,
扫描到的设备状态变化和获取到的蓝牙设备的通知,
调用java层discoveryStateChangeCallback()和deviceFoundCallback()函数 来实现。
三、蓝牙扫描流程的启动过程
1、入口扫描函数(start_discovery)执行,主要是配置扫描参数,并发消息告诉BT DM search模块参数和启动扫描过程。
start_discovery(扫描入口) btif/src/bluetooth.c
|
|调用btif_dm.c文件中的扫描接口;
|
btif_dm_start_discovery()主要是配置扫描参数(btif api functions (no context switch))
函数实现:清除遗留在索引0上的任何东西、(我们需要同时处理多个查询问题)在索引0上添加 允许所有的过滤器、ble的扫描过滤配置、
发消息给BTA DM 模块进行 配置存储,扫描模式为BR/EDR,BLE全扫,inquiry时间为10秒等等。
|
|调用bta/dm/bta_dm_api.c中的文件
|
BTA_DmSearch()
此函数搜索对等蓝牙设备。它执行查询并获取设备的远程名称。
如果服务不为零,则执行服务发现
|