蓝牙(Bluetooth)提供移动设备及其配件之间低功耗、低成本的无线通信连接。蓝牙技术的核心,是根据蓝牙标准所实现的蓝牙协议栈。蓝牙能同时进行异步数据及同步语音传输,它的底层协议层包括众多协议,如逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串口模拟协议(RFCOMM)等,一起为上层提供传输支持。而主要控制接口则由主机控制接口层(HCI)体现,它是蓝牙协议中软硬件之间的接口。在各种协议及HCI之上,是蓝牙的上层应用框架,框架里每个应用模式称之为一个Profile,供给外部不同的设备访问,如无线立体声耳机使用的A2DP(Advanced Audio Distribution Profile)以及打印机使用的无线打印机服务等,服务有数十种之多。
1.蓝牙基本架构
Android提供了对蓝牙的支持。蓝牙系统的内容包括:
·Linux内核的蓝牙驱动程序
·Linux内核的蓝牙协议层
·bluez(蓝牙在用户空间的库)
·bluez适配层
·android.bluetooth包中的各个类(蓝牙在框架层的内容)
·蓝牙相关的应用程序
Android的蓝牙部分的结构如下:
![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中的蓝牙系统 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中的蓝牙系统]()
②耳机及免提服务
对于服务实现部分的代码,主要是耳机和免提。两者都支持通话,区别在于免提可以支持一些操作按键,如拒接电话等,而耳机则不行。Android要支持这两个服务,则需要支持两种途径:一是通过SDP发布这两个服务,让配对的蓝牙设备可以发现这两个服务并主动进行连接;二是Android通过SDP判断设备是否支持连接到这两个服务,如果支持则主动去连接设备。连接方式都是通过RFCOMM协议完成的。最终的音频通道数据则由SCO协议传输。Android蓝牙的耳机及免提服务的结构如下:
![Android中的蓝牙系统 Android中的蓝牙系统]()
③A2DP服务
A2DP服务对蓝牙立体声耳机提供支持,相比SCO,它能传输更好音质的音频数据。A2DP更多地用在音乐播放方面,而SCO则更多地用在电话语音等方面。A2DP结构如下:
![Android中的蓝牙系统 Android中的蓝牙系统]()
bluez对A2DP的支持很好,
A2DP部分主要围绕IBluetoothA2DP来实现,Service部分通过D-BUS与bluez的Audio部分通信,主要的控制接口是Audio的sink组件,sink用来连接支持A2DP的Headset设备。如果Headset设备支持A2DP,Android可以自动完成SCO和A2DP的切换。
阅读(811) | 评论(0) | 转发(0) |