ZT android -- 蓝牙 bluetooth (一) 入门
android -- 蓝牙 bluetooth (一) 入门
前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着 4.2.2的代码看起来总是有些遗憾。所以针对4.2.2版本代码整理下相关知识,当然蓝牙工作的主干流程是没有变的,上电、加载驱动这些动作少不了的, 只是这些功能的实现代码位置变了不少。希望本文可以让大家对android4.2的蓝牙部分代码有一个初步的了解。
正文开始前,先明确代码版本:android jellyBean 4.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.javaA2DP的功能实现
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 修改蓝牙协议栈说明
ZT android -- 蓝牙 bluetooth (一) 入门的更多相关文章
- ZT android -- 蓝牙 bluetooth (四)OPP文件传输
android -- 蓝牙 bluetooth (四)OPP文件传输 分类: Android的原生应用分析 2013-06-22 21:51 2599人阅读 评论(19) 收藏 举报 4.2源码AND ...
- ZT android -- 蓝牙 bluetooth (二) 打开蓝牙
android -- 蓝牙 bluetooth (二) 打开蓝牙 分类: Android的原生应用分析 2013-05-23 23:57 4773人阅读 评论(20) 收藏 举报 androidblu ...
- ZT android -- 蓝牙 bluetooth (五)接电话与听音乐
android -- 蓝牙 bluetooth (五)接电话与听音乐 分类: Android的原生应用分析 2013-07-13 20:53 2165人阅读 评论(9) 收藏 举报 蓝牙android ...
- ZT android -- 蓝牙 bluetooth (三)搜索蓝牙
android -- 蓝牙 bluetooth (三)搜索蓝牙 分类: Android的原生应用分析 2013-05-31 22:03 2192人阅读 评论(8) 收藏 举报 bluetooth蓝牙s ...
- android -- 蓝牙 bluetooth (四)OPP文件传输
在前面android -- 蓝牙 bluetooth (一) 入门文章结尾中提到了会按四个方面来写这系列的文章,前面已写了蓝牙打开和蓝牙搜索,这次一起来看下蓝牙文件分享的流程,也就是蓝牙应用opp目录 ...
- android -- 蓝牙 bluetooth (三)搜索蓝牙
接上篇打开蓝牙继续,来一起看下蓝牙搜索的流程,触发蓝牙搜索的条件形式上有两种,一是在蓝牙设置界面开启蓝牙会直接开始搜索,另一个是先打开蓝牙开关在进入蓝牙设置界面也会触发搜索,也可能还有其它触发方式,但 ...
- 深入了解Android蓝牙Bluetooth——《进阶篇》
在 [深入了解Android蓝牙Bluetooth--<基础篇>](http://blog.csdn.net/androidstarjack/article/details/6046846 ...
- 深入了解Android蓝牙Bluetooth ——《总结篇》
在我的上两篇博文中解说了有关android蓝牙的认识以及API的相关的介绍,蓝牙BLE的搜索,连接以及读取. 没有了解的童鞋们请參考: 深入了解Android蓝牙Bluetooth--<基础篇& ...
- android -- 蓝牙 bluetooth (一) 入门
前段时间在 网上看了一些关于android蓝牙的文章,发现大部分是基于老版本(4.1以前含4.1)的源码,虽然无碍了解蓝牙的基本原理和工作流程,但对着4.2.2的代码看起来总是有些遗憾.所以针对4.2 ...
随机推荐
- maven备忘
maven常见命令 mvn clean mvn compile mvn package mvn clean compile package mvn -Djetty.port= jetty:run mv ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- Android四大组件--活动(Activity)
1. 概念 说明: 1). 创建和销毁 onCreate 和 onDestory 应用场景:当界面销毁的时候存储一些数据,在onCreate创建的时候回显数据: 例如:发短信:写短信写到一半,按hom ...
- linux改目录权限和宿主。
改宿主. [sudo chown 用户名:用户组 ./目录/*] 改权限 [ sudo chmod -R 775 ./目录]
- 使用T-SQL语句创建数据库2
创建多个数据文件和多个日志文件 use master GO create database book on primaty --主文件组 ( name=‘book_data’, --主文件逻辑文件名 ...
- CSS 基础点
Part1:font:inherit 字体的设置 设置所有元素的字体保持一致: 所有元素:*{font:inherit;} /* IE8+ */ body体用percent:body{font:100 ...
- Spring 中的Enum HttpStatus 及HTTP状态码
官方API https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.htm ...
- ORB-SLAM2实现(kinect V1/ROS)
实验室电脑环境ubuntu14.04和ROS indigo已经装好. 1. 构建工作空间[非常重要的一步] mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catki ...
- SQLHappy微软数据库连接查询操作,对数据的处理和查询
(软件已更新,部分介绍与新版软件有出处) 1.服务连接界面介绍 2.主界面介绍 3.表搜索介绍 4.命令菜单部分介绍 5.插件介绍 6.帮助菜单介绍 7.数据库列表右键菜单 8.数据库结构和数据操作( ...
- thinkphp点击导航变色
1.从该处进入导航页面,点击分贝进入点击的页面. 2.点击1处进入对应的导航栏,导航栏变色. 3.在1图图片点击跳转是给地址添加参数status. 4.在后台IndexController.class ...