Bluetooth in Android 4.2 and 4.3:Scan remote devices

来源:互联网 发布:淘宝客优惠券采集插件 编辑:程序博客网 时间:2024/06/05 05:53

来源:http://blog.csdn.net/wendell_gong/article/details/16864467

 Enable Bluetooth之后就可以扫描周围的其他discoverable mode的Bluetooth Device。以下简单分析以下Bluetooth BR/EDR设备的扫描过程,然后会谈一下Android 4.2引入的Bluetooth HAL。

    启动scan的调用过程很简单,返回scan结果的过程略为复杂。

    以下是start scan的流程图,从Settings到Frameworks再到Bluedroid。LocalBluetoothAdapter是Settings里面的一个类。BluetoothAdatper定义在frameworks中。AdapterService的实现是在packages/apps/Bluetooth里面。startDiscoveryNative()是JNI的接口。从start_discovery()就进入到Bluedroid中了。start_discovery()实际上是Bluetooth HAL中定义的一个接口。关于BTA_DM_API_SEARCH_EVT消息是如何传递的涉及到Bluedroid的架构,留到以后详细说明。


    启动scan之后,Bluedroid会通过Bluetooth HAL定义的callback函数discovery_state_change_callback通知Android Framework: BT_DISCOVERY_STARTED;然后会多次通过device_found_callback返回扫描到的Bluetooth device给Android Framework;最后扫描完成,会再次通过discovery_state_change_callback通知Android Framework:BT_DISCOVERY_STOPPED。

    Discovery state changed的调用过程如下图所示,整个过程简单清晰。Bluetooth HAL中定义的callback是关键,它把Discovery state从下层Bluetooth stack传递给了上层的Android Framework。AdapterProperties::discoveryStateChangeCallback()会new intent,然后广播出去。Settings就可以通过BluetoothDiscoveryReceiver收到这个intent了。


    Bluedroid返回找到的Bluetooth device的过程如下。需要注意的是,每找到一个device就会有一次device found callback的调用;device_found_callback()在调用JniCallbacks::deviceFoundCallback()之前会通过JniCallbacks::devicePropertyChangedCallback()来注册找到的Bluetooth device。RemoteDevices有一个HashMap<BluetoothDevice, DeviceProperties> mDevices来保存找到过的Bluetooth devices。


    在上面的分析中,无论是从Android Framework调用Bluedroid还是Bluedroid返回结果到Android Framework都要通过Bluetooth HAL接口。这个Bluetooth HAL是在Andorid 4.2中引入的。Bluetooth HAL定义在hardware/libhardware/include/hardware/bluetooth.h中。external/bluetooth/bluedroid/btif实现了该HAL定义的standard Bluetooth DM(Device Management) interface(定义在bt_interface_t)。packages/apps/Bluetooth/jni/com_android_bluetooth_btservice_AdapterService.cpp实现了该HAL定义的Bluetooth DM callback structure: bt_callbacks_t。可以看到,有了Bluetooth HAL之后,Android Framework和Bluetooth stack就可以很清晰的分离开来。下层的Bluetooth stack只要实现了Bluetooth HAL的接口,就可以被Android Framework使用。所以,在Android 4.2及其后续版本中,我们完全可以用其他的Bluetooth stack来替换掉Bluedroid。事实上,已经被Android抛弃的BlueZ正在开发一个Android Bluetooth HAL implementation,这样我们就可以在Android 4.2及其后续版本中使用BlueZ了(从稳定性和功能上来讲,BlueZ目前好于Bluedroid)。有兴趣的同学可以参与到BlueZ Android Bluetooth HAL implementation中,除了对bluetooth.h中定义的接口的实现,还有对bt_*.h(比如bt_av.h, bt_hl.h等)中定义的接口的实现,可以在这里找到BlueZ for Android的介绍http://git.kernel.org/cgit/bluetooth/bluez.git/tree/android/README。


0 0
原创粉丝点击