Android中的蓝牙系统

蓝牙(Bluetooth)提供移动设备及其配件之间低功耗、低成本的无线通讯链接。蓝牙技术的核心,是根据蓝牙标准所实现的蓝牙协议栈。蓝牙能同时进行异步数据及同步语音传输,它的底层协议层包括众多协议,如逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串口模拟协议(RFCOMM)等,一块儿为上层提供传输支持。而主要控制接口则由主机控制接口层(HCI)体现,它是蓝牙协议中软硬件之间的接口。在各类协议及HCI之上,是蓝牙的上层应用框架,框架里每一个应用模式称之为一个Profile,供给外部不一样的设备访问,如无线立体声耳机使用的A2DP(Advanced Audio Distribution Profile)以及打印机使用的无线打印机服务等,服务有数十种之多。
    1.蓝牙基本架构
    Android提供了对蓝牙的支持。蓝牙系统的内容包括:
    ·Linux内核的蓝牙驱动程序
    ·Linux内核的蓝牙协议层
    ·bluez(蓝牙在用户空间的库)
    ·bluez适配层
    ·android.bluetooth包中的各个类(蓝牙在框架层的内容)
    ·蓝牙相关的应用程序
    Android的蓝牙部分的结构以下:
Android中的蓝牙系统    2.蓝牙用户空间库bluez
    Android所采用的蓝牙用户空间库是bluez,它是Linux平台上一套完整的蓝牙协议栈开源实现。在Android中,bluez提供了不少分散的应用,包括守护进程和一些工具;bluez经过D-BUS IPC机制来提供应用层接口。须要注意的是,bluez的底层协议实如今kernel代码中,并不属于用户空间。
    D-BUS是一套应用普遍的进程间通讯机制,相对于Socket等底层IPC,它是更加复杂的IPC机制,支持更系统化的服务名、函数名等,同时也能对众多服务进程和客户端进行管理,调度通讯消息的传递。D-BUS和Binder相似,可是应用范围更普遍。
    bluez的主要体现结构以下:
Android中的蓝牙系统    3.bluez适配层
    bluez在Android中的使用,须要通过Android的bluez适配层的封装来实现,bluez适配层源代码及头文件路径为:system/bluetooth/。该目录除了包含生成适配层库libbluedroid.so的源码以外,还包含bluez头文件、bluez配置文件等目录。因为bluez使用D-BUS做为与上层沟通的接口,所以适配层构造比较简单,封装了蓝牙的开关功能以及射频开关。
    4.蓝牙的JNI和Java部分
    蓝牙的JNI源代码文件为:frameworks/base/core/jni/android_bluetooth_*.cpp。蓝牙部分的JNI带有android_bluetooth_前缀,它们将提供android.bluetooth包中多个类的支持,这些内容会与其它模块JNI部分一块儿生成libandroid_runtime.so。
    蓝牙的Java源代码路径为:
    · frameworks/base/core/java/android/server:蓝牙的服务部分
    · frameworks/base/core/java/android/bluetooth/:Android的蓝牙类
    Android支持蓝牙设备的发现、配对、服务查找等基础功能,服务方面支持耳机(Headset)、免提(Handsfree)和立体声(A2DP)等部分。
    ①核心组成
    框架核心组成部分是android.bluetooth包中以IBluetoothDevice.aidl为接口的IBinder服务器端BluetoothDeviceService、客户端BluetoothDevice以及android.server包中的BluetoothEventLoop。
     BluetoothDeviceService实现蓝牙功能的开启/关闭、设备的发现和配对、服务的发现和绑定等功能,android_server_BluetoothDeviceService.cpp对其提供JNI本地代码支持。
    ·开关功能经过直接调用bluez适配层提供的开关功能来实现
    ·服务发现和绑定等功能,均经过D-BUS调用bluez接口来实现。BluetoothDevice中其它的访问服务流程与此相似。
    Android蓝牙Java部分和底层的关系以下:
Android中的蓝牙系统    ②耳机及免提服务
    对于服务实现部分的代码,主要是耳机和免提。二者都支持通话,区别在于免提能够支持一些操做按键,如拒接电话等,而耳机则不行。Android要支持这两个服务,则须要支持两种途径:一是经过SDP发布这两个服务,让配对的蓝牙设备能够发现这两个服务并主动进行链接;二是Android经过SDP判断设备是否支持链接到这两个服务,若是支持则主动去链接设备。链接方式都是经过RFCOMM协议完成的。最终的音频通道数据则由SCO协议传输。Android蓝牙的耳机及免提服务的结构以下:
Android中的蓝牙系统    ③A2DP服务
    A2DP服务对蓝牙立体声耳机提供支持,相比SCO,它能传输更好音质的音频数据。A2DP更多地用在音乐播放方面,而SCO则更多地用在电话语音等方面。A2DP结构以下:
Android中的蓝牙系统    bluez对A2DP的支持很好, A2DP部分主要围绕IBluetooth A2DP来实现,Service部分经过D-BUS与bluez的Audio部分通讯,主要的控制接口是Audio的sink组件,sink用来链接支持 A2DP的Headset设备。若是Headset设备支持 A2DP,Android能够自动完成SCO和 A2DP的切换。
相关文章
相关标签/搜索