分类: Android的原生应用分析 7827人阅读 评论(37) 收藏 举报 bluetooth 4.2.2源码 android

目录(?)[+]

  1. 代码分布
  2. 整体结构
  3. 常用类和名词解释
  4. 后续分析

前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾。所以针对4.2.2版本代码整理下相关知识,当然蓝牙工作的主干流程是没有变的,上电、加载驱动这些动作少不了的,只是这些功能的实现代码位置变了不少。希望本文可以让大家对android4.2的蓝牙部分代码有一个初步的了解。


正文开始前,先明确代码版本:android jellyBean4.2.2,后续的蓝牙相关文章同样如此。

另推荐个源码在线阅读网址http://androidxref.com/,已经知道的童鞋无视这行吧。


入手一个新的模块或应用,当然首先要知道它都有什么了,与它相关的代码在那里,所以先一起看下蓝牙代码分布吧。


1. 代码分布:

packages/apps/Bluetooth/

看这路径肯定是蓝牙应用方面的代码了,主要是关于蓝牙应用协议的表现代码,包括opp、hfp、hdp、a2dp、pan等等,这些名词后面再解释。

frameworks/base/core/java/android/server/

4.2以后这个目录虽然还有了,但里面代码已经转移到应用层了,就是前面那个目录,所以4.2.2上的蓝牙这里可以忽略。

framework/base/core/java/android/bluetooth

这个目录里的代码更像一个桥梁,里面有供java层使用一些类,也有对应的aidl文件联系C、C++部分的代码,还是挺重要的。

kernel\drivers\bluetoothBluetooth

具体协议实现。包括hci,hid,rfcomm,sco,SDP等协议

kernel\net\bluetooth Linux kernel

对各种接口的Bluetoothdevice的驱动。例如:USB接口,串口等,上面kernel这两个目录有可能看不到的,但一定会有的。

external\bluetooth\bluedroid BlueZ (应用空间协议),官方蓝牙协议栈。

system\bluetoothBluetooth 适配层代码,和framework那个作用类似,是串联framework与blueZ的工具。

大致代码分布就是这些,初步查看后让我们再来看下蓝牙的整体结构。


2.整体结构:

这部分直接上图了,看着直观些。图中把JNI部分虽然在目前4.2的代码中在packages层,这里还是画在Framework层了,说明下希望

不要引起理解的误会。从图上可以感觉到整体流程和以前变化不大,所以流程方面的文章看4.1或更早的应该问题也不大。



PS:上图关于蓝牙协议栈的说明有误,4.2里已经不再是bluez了,在些更正一下,当然协议栈这一部分还是要有的,新的协议栈看下面英文:


Android 4.2 introduces a new Bluetooth stack optimized for use with Android devices. The new Bluetooth stack developed in

collaboration between Google and Broadcom replaces the stack based on BlueZ and provides improved compatibility and reliability.

google和broadcom合作开发了一个新蓝牙协议栈,老版本的兼容性问题在所难免了。在此感谢网友andger032的提醒。


3.常用类和名词解释:

\packages\apps\Settings\src\com\android\settings\bluetooth 目录下

BluetoothEnabler.java 界面上蓝牙开启、关闭的开关就是它了,

BluetoothSettings.java 主界面,用于管理配对和连接设备

LocalBluetoothManager.java 提供了蓝牙API上的简单调用接口,这里只是开始。

CachedBluetoothDevice.java 描述蓝牙设备的类,对BluetoothDevice的再封装

BluetoothPairingDialog.java 那个配对提示的对话框


/packages/apps/Phone/src/com/android/phone/

BluetoothPhoneService.java 在phone的目录肯定和电话相关了,蓝牙接听挂断电话会用到这个


/packages/apps/Bluetooth/src/com/android/bluetooth/btservice/

AdapterService.java 4.2后才有的代码,蓝牙打开、关闭、扫描、配对都会走到这里,其实更准确的说它替代了4.1之前的BluetoothService.java,原来的工作就由这个类来完成了。说到这里不能不说4.2蓝牙的目录变了,在4.1及以前的代码中packages层的代码只有opp协议相关应用的代码,也就是文件传输那部分,而4.2的代码应用层的代码则丰富了许多,按具体的蓝牙应用协议来区别,分为以下文件夹(这里一并对蓝牙一些名词作个简单解释):

a2dp 蓝牙立体声,和蓝牙耳机听歌有关那些,另还有个avrcp--音频/视频远程控制配置文件,是用来听歌时暂停,上下歌曲选择的。
btservice 这个前面AdapterService.java的描述大家应该能猜到一些,关于蓝牙基本操作的目录,一切由此开始。
hdp 蓝牙关于医疗方面的应用Bluetooth Health Device Profile
hfp 和电话相关,蓝牙接听、挂断电话 Hands-free Profile
hid 人机交互接口,蓝牙鼠标键盘什么的就是这个了
opp 不多解释,以前就有。
pan 描述了两个或更多个 Bluetooth 设备如何构成一个即时网络,和网络有关的还有串行端口功能(SPP),拨号网络功能(DUN)

pbap 电话号码簿访问协议(Phonebook Access Profile)

android 4.2的蓝牙应用层部分代码更丰富了,虽然有些目录还没具体代码,不过说不准哪个版本更新就有了,就像4.0添加了hdp医疗那部分一样。

另外原本在framework的JNI代码也被移到packages/apps/bluetooth当中。

/frameworks/base/core/java/android/bluetooth/目录下


BluetoothA2dp.java A2DP的功能实现
BluetoothAdapter.java 蓝牙action的定义,虚拟设备属性以及操作方法
BluetoothAudioGateway.java 蓝牙语音网关
BluetoothClass.java 蓝牙设备类型的定义
BluetoothDevice.java 蓝牙设备属性
BluetoothDevicePicker.java 定义远程蓝牙设备的特性,比如需要认证,设备类型
BluetoothHeadset.java 定义蓝牙headset功能的属性以及接口
BluetoothInputStream.java 蓝牙流接口的实现(输入流)
BluetoothOutputStream.java 蓝牙流接口的实现(输出流)
BluetoothServerSocket.java 蓝牙socket服务端具备的方法
BluetoothSocket.java 蓝牙socket的封装
BluetoothUuid.java 蓝牙uuid的定义以及uuid的解析

以上java文件在使用具体功能会用到,现在只是简单描述下,至于具体使用在后续文章用到时再给出。同时代码说明部分也就写这些了

对于C、C++部分的代码一方面没看那么多,另一方面根据android JNI的命名习惯,大家找起来也很容易。


4.后续分析:

前面从整体上描述蓝牙的基本知识,落实在具体的代码分析上,我们按几个主线功能来走,蓝牙的开关、搜索配对、蓝牙耳机与电话和文件传输,

这几个也算是蓝牙的常用必备功能了,所以在后续文章中将按着这个顺序来跟一下它们代码调用流程。希望可以让你快速的了解蓝牙,当然如果有失误

写错的地方,欢迎反馈,谢谢。



------------------------修改记录------------------

2013.5.28 23:16 修改蓝牙协议栈说明

更多 1
主题推荐
bluetooth 蓝牙 android 文件传输 linux kernel
猜你在找
查看评论
14楼 默默dede 2014-01-13 15:43发表 [回复] [引用] [举报]
private Map<BluetoothDevice, Integer> mInputDevices;
mInputDevice.get(device);
请问一下这个Map是怎么去定义的?
在哪里定义的?
Re: balmy 2014-01-13 17:42发表 [回复] [引用] [举报]
回复u013252133:你要找的是这个吗?
private Map<BluetoothDevice, Integer> mInputDevices;
protected boolean start() {
mInputDevices = Collections.synchronizedMap(new HashMap<BluetoothDevice, Integer>());
.... return true;
}
代码在这里 /packages/apps/Bluetooth/src/com/android/bluetooth/hid/HidService.java
13楼 默默dede 2013-12-25 17:54发表 [回复] [引用] [举报]
有没有遇到过有些键盘可以连接,但是有些是只能配对不能连接的问题?
12楼 账簿账簿 2013-11-28 22:46发表 [回复] [引用] [举报]
请问较早版本的android系统能实现一个android手机模拟蓝牙耳机并连接另外一个android手机实现接打电话吗?
Re: balmy 2013-11-30 11:30发表 [回复] [引用] [举报]
回复zhangbuzhangbu:才看到你的消息,不过我不是很明白你的问题啊? 把手机当成蓝牙耳机去连另一个手机?
11楼 躺着享受 2013-10-29 09:28发表 [回复] [引用] [举报]
不知道您有没有接触android4.3
请问4.3上用什么抓HCI log?4.1使用hcidump,但是4.3上面没有了。
谢谢!
Re: balmy 2013-10-29 10:37发表 [回复] [引用] [举报]
回复fankyo:你试试这个 把BtSnoopLogOutput=false改成true 应该是你想要hcilog 4.2我抓过有效,4.3没验证过。
external/bluetooth/bluedroid/conf/bt_stack.conf
# Enable BtSnoop logging function
# valid value : true, false
BtSnoopLogOutput=false

# BtSnoop log output file
BtSnoopFileName=/sdcard/btsnoop_hci.log
Re: 躺着享受 2013-10-29 11:16发表 [回复] [引用] [举报]
回复baimy1985:这个试过没成功就放弃了,看你这么一说还得再试下,可能哪里没搞对,谢谢!
Re: 默默dede 2013-12-31 11:08发表 [回复] [引用] [举报]
回复fankyo:hcidump这个log得用什么打开,因为我用vim打开是乱码?
Re: balmy 2013-12-31 11:42发表 [回复] [引用] [举报]
回复u013252133:wireshark 这个可以的,能看网络数据包的工具应该可以
Re: 默默dede 2013-12-31 15:50发表 [回复] [引用] [举报]
回复baimy1985:这个log跟一般的不是一样吗?为什么要用网络数据分析工具打开?
Re: balmy 2014-01-02 14:15发表 [回复] [引用] [举报]
回复u013252133:对于你提到的关键要看哪些东西如何分析,目前我也不明确,也在探索中,暂时是帮不上忙了,论坛发帖问下吧。
Re: 默默dede 2013-12-31 14:09发表 [回复] [引用] [举报]
回复baimy1985:谢谢,怎么去分析?关键看什么?hci command 跟hci event有反应就行吗?
Re: 躺着享受 2014-01-03 16:27发表 [回复] [引用] [举报]
回复u013252133:要看蓝牙协议了
10楼 躺着享受 2013-10-25 16:15发表 [回复] [引用] [举报]
请问xref上的代码为啥没kernel目录啊?
Re: balmy 2013-10-25 21:52发表 [回复] [引用] [举报]
回复fankyo:猜测kernal那部分基本上都是linux的东西,直接看linux的源码就好了,估计网站上觉得没必要加了吧,
Re: 躺着享受 2013-10-28 10:31发表 [回复] [引用] [举报]
回复baimy1985:kernel source 和android source 是分开在主页上列出的。同一哥安卓版本可以搭配不同的kernel版本
Re: balmy 2013-10-28 11:46发表 [回复] [引用] [举报]
回复fankyo:多谢分享
9楼 chenshijun0101 2013-09-24 10:00发表 [回复] [引用] [举报]
谢谢LZ关于android4.2的蓝牙分析,最近在学习android4.1的蓝牙模块,发现两者差别很大的有这方面的资料吗?先谢过了,308069028@qq.com
Re: balmy 2013-09-24 11:08发表 [回复] [引用] [举报]
回复chenshijun0101:4.1的协议栈是BlueZ,4.2以后的代码是新协议栈,变化的确不小,如果你是学习4.1的,参考BlueZ的资料应该是可以的,至于新的协议相关资料我也在寻找中
Re: chenshijun0101 2013-09-24 14:10发表 [回复] [引用] [举报]
回复baimy1985:那也非常感谢你,时刻关注你的分享
8楼 xyp5299 2013-09-01 14:34发表 [回复] [引用] [举报]
还有后续有关Bluetooth 精彩的文章么? 关注中。
谢谢。
7楼 jaicy316 2013-08-23 11:47发表 [回复] [引用] [举报]
LZ,BluetoothPairingDialog.java这个弹出框弹出后不操作,30秒后自动关闭,怎么设置这个关闭的时间长一点,40秒等等。。
Re: balmy 2013-08-25 09:11发表 [回复] [引用] [举报]
回复jaicy316:你这个需求和蓝牙关系不大吧,给dialog添加延时关闭应该可以啊
Re: jaicy316 2013-08-29 10:45发表 [回复] [引用] [举报]
回复baimy1985:应该是哪里有修改的吧,添加的线程睡眠是不行的啊,LZ怎么怎么添加吗
6楼 xyp5299 2013-08-16 18:25发表 [回复] [引用] [举报]
看了你有关bluetooth 的文章,很有启发,谢谢。希望能继续分享。
5楼 司夜刺客 2013-08-08 14:44发表 [回复] [引用] [举报]
楼主分析的不错啊。先顶一个
Android 4.2使用的是博通开发的bluedroid协议栈,整个蓝牙的代码结构可以说变化很大。代码交互流程没有BlueZ的DBUS那么繁琐了,但是由于实现了好多的profile,整体代码量还是相当大的,全靠大家自己分析的话还是相当费时间的,希望大家能够一起多多交流
4楼 windjkl 2013-06-17 08:26发表 [回复] [引用] [举报]
谢谢楼主!
3楼 windjkl 2013-06-14 21:13发表 [回复] [引用] [举报]
版主你好!我要在4.2上添加USB外置蓝牙模块的驱动。USB外置蓝牙模块插入平台时已经识别出来,接下去要如何跟踪下去?目前就卡这边,谢谢!
Re: vicalwu 2014-01-08 16:36发表 [回复] [引用] [举报]
回复windjkl:楼上这个问题解决了吗 能否支持我一下蓝牙USB相关问题 QQ 330785972 提前谢谢了
Re: balmy 2013-06-16 22:45发表 [回复] [引用] [举报]
回复windjkl:抱歉,和驱动相关的东东我不熟悉,这个问题我也只能帮你问下别人了,
2楼 andger032 2013-05-29 08:48发表 [回复] [引用] [举报]
恩,有问题一起讨论。我会一直关注你的android4.2 bluetooth的文章的,呵呵
1楼 andger032 2013-05-28 14:12发表 [回复] [引用] [举报]
4.2上蓝牙不是bluez协议栈了,BluetoothAudioGateway.java 也没有了。呵呵不过版主还是写的挺好的,期待更新。
Re: balmy 2013-05-28 21:08发表 [回复] [引用] [举报]
回复andger032:谢谢你的提醒,协议栈那部分还没来得及看,bluez那个文件夹是没有了,当时想着这块核心的东西应该没有换,只是换形式了,所以就写在这里了。4.2的蓝牙相比以前变了不少,还要看好多东西。欢迎交流,呵呵。
Re: xuexingyang 2013-06-20 19:15发表 [回复] [引用] [举报]
回复baimy1985:4.2 上蓝牙是broadcom的bluedroid的实现方案,相对来说比blueZ难很多,都在kernel中实现了,包括bta,btif, stack和hci几个部分,正在看,求同行。。。
Re: balmy 2013-06-20 21:28发表 [回复] [引用] [举报]
回复xuexingyang:我也是最近才开始看,项目不忙的时候看下,对以前蓝牙还不熟,冏。咨询过broadcom的FAE得到的答复是蓝牙部分broadcom做得比较完善了,留过我们改动的一般是应用交互上,据说broadcom有一个专门的小组在做BT这部分。现在只能看bluedroid文档了一点点学习,一起学习交流吧
Re: xuexingyang 2013-06-21 09:39发表 [回复] [引用] [举报]
回复baimy1985:有机会一起学习,我最近在看OPP的pipeline

更多相关文章

  1. Android中蓝牙模块的使用
  2. Android蓝牙开发浅谈
  3. android蓝牙模块
  4. [Android(安卓)GMS 认证] CTS 问题列表之 CtsBluetoothTestCases
  5. Android中Broadcast的Intent大全
  6. Android(安卓)官方Sample
  7. https://source.android.com/devices/bluetooth/ - 蓝牙 Android
  8. [Android(安卓)新特性] 15项大改进 Android(安卓)4.4新特性解析
  9. AirPods怎么连接Android设备 AirPods与安卓设备连接方法

随机推荐

  1. rsync daemon模式实战
  2. AEnM:兴利除弊—实现高性能织物基柔性电化
  3. 记一次失败的Perl + Nginx + FastCGI 配
  4. 执行 Application.Terminate 后, OnDestr
  5. Perl Dancer 学习(一)
  6. 关于字符串, 之前没这样用过
  7. 以接口为主导的设计中, 我在使用的框架模
  8. php 中的for and foreach遍历数组
  9. php之数组键名更换,快速生成数组与数组过
  10. 0429作业