Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138095
  • 博文数量: 18
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 186
  • 用 户 组: 普通用户
  • 注册时间: 2013-02-04 12:22
文章分类

全部博文(18)

文章存档

2013年(18)

我的朋友

分类: Android平台

2013-03-17 22:30:16

蓝牙(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部分主要围绕IBluetoothA2DP来实现,Service部分通过D-BUS与bluez的Audio部分通信,主要的控制接口是Audio的sink组件,sink用来连接支持A2DP的Headset设备。如果Headset设备支持A2DP,Android可以自动完成SCO和A2DP的切换。
阅读(7169) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~