Android系统去掉蓝牙应用,Android中的蓝牙系统

蓝牙(Bluetooth)提供移动设备及其配件之间低功耗、低成本的无线通信连接。蓝牙技术的核心,是根据蓝牙标准所实现的蓝牙协议栈。蓝牙能同时进行异步数据及同步语音传输,它的底层协议层包括众多协议,如逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串口模拟协议(RFCOMM)等,一起为上层提供传输支持。而主要控制接口则由主机控制接口层(HCI)体现,它是蓝牙协议中软硬件之间的接口。在各种协议及HCI之上,是蓝牙的上层应用框架,框架里每个应用模式称之为一个Profile,供给外部不同的设备访问,如无线立体声耳机使用的A2DP(Advanced Audio Distribution Profile)以及打印机使用的无线打印机服务等,服务有数十种之多。

1.蓝牙基本架构

Android提供了对蓝牙的支持。蓝牙系统的内容包括:

·Linux内核的蓝牙驱动程序

·Linux内核的蓝牙协议层

·bluez(蓝牙在用户空间的库)

·bluez适配层

·android.bluetooth包中的各个类(蓝牙在框架层的内容)

·蓝牙相关的应用程序

Android的蓝牙部分的结构如下:

uid-29985605-id-4577105.html    2.蓝牙用户空间库bluez

Android所采用的蓝牙用户空间库是bluez,它是Linux平台上一套完整的蓝牙协议栈开源实现。在Android中,bluez提供了很多分散的应用,包括守护进程和一些工具;bluez通过D-BUS IPC机制来提供应用层接口。需要注意的是,bluez的底层协议实现在kernel代码中,并不属于用户空间。

D-BUS是一套应用广泛的进程间通信机制,相对于Socket等底层IPC,它是更加复杂的IPC机制,支持更系统化的服务名、函数名等,同时也能对众多服务进程和客户端进行管理,调度通信消息的传递。D-BUS和Binder类似,但是应用范围更广泛。

bluez的主要体现结构如下:

uid-29985605-id-4577105.html    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部分和底层的关系如下:

uid-29985605-id-4577105.html    ②耳机及免提服务

对于服务实现部分的代码,主要是耳机和免提。两者都支持通话,区别在于免提可以支持一些操作按键,如拒接电话等,而耳机则不行。Android要支持这两个服务,则需要支持两种途径:一是通过SDP发布这两个服务,让配对的蓝牙设备可以发现这两个服务并主动进行连接;二是Android通过SDP判断设备是否支持连接到这两个服务,如果支持则主动去连接设备。连接方式都是通过RFCOMM协议完成的。最终的音频通道数据则由SCO协议传输。Android蓝牙的耳机及免提服务的结构如下:

uid-29985605-id-4577105.html    ③A2DP服务

A2DP服务对蓝牙立体声耳机提供支持,相比SCO,它能传输更好音质的音频数据。A2DP更多地用在音乐播放方面,而SCO则更多地用在电话语音等方面。A2DP结构如下:

uid-29985605-id-4577105.html    bluez对A2DP的支持很好,A2DP部分主要围绕IBluetoothA2DP来实现,Service部分通过D-BUS与bluez的Audio部分通信,主要的控制接口是Audio的sink组件,sink用来连接支持A2DP的Headset设备。如果Headset设备支持A2DP,Android可以自动完成SCO和A2DP的切换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值