既然我们想要系统地进行分析一下Androidbluetooth,那么就有必要首先来从总体架构上看一下bluetoothAndroid中是处于哪些层次,做到手中有枪,心里不慌。Bluetooth从总体来看,基本的架构图如下:

这张图是我拷贝的网上的一份介绍bluetoothppt上,他应该也是出于某一份大牛之手,可惜的是我并没有能够找到具体的出处,若有人看到可以告诉我一下。

从这张图可以看到,在最上层是一些Profile

lGAPGeneral Access Profile:定义了Bluetooth建立基带链路的通用方法,以保证两个bluetooth设备能够相互通信。这一块在Android代码中并没有很明显的体现。

lSDPService Discovery Profile):他用来发现对方Bluetooth所支持的Service。比如说,我连接一个耳机,那么这个耳机究竟是只能打电话,还是既能打电话又能听音乐,抑或是只能听音乐,这都是通过SDP来发现,所以,它贯穿于我们最开始的信息交互流程中。

lHeadset/Handsfree:这两个profile是用来实现打电话相关的内容的。

lRFCOMM:这是一个基本的Profile,很多应用都是基于它上面实现的,比如说我们文件的传输(OPPObject Push Profile),当然上面说Headset/Handsfree,其实准确的说也是在RFCOMM层之上的。

从个人的角度来看,位于最上层的还有几个APP

lSettings App:用于构造设置中的UI。就是我们在手机打开设置时所看到的打开/关闭蓝牙的UI操作。

lPhone App:这个是打电话时的UI,和蓝牙相关的就是声音出来的选项,可以选择蓝牙接听的菜单那一块的内容。

lBluetooth App:这一块在图中没有画出来,他并不直接体现在UI上,可以理解为一个后台运行的apk。包括了蓝牙文件发送(OPP)和电话薄传输(PBAP)两个部分。

在中间Framework层,主要实现了各种API,这些API最终都是要通过jni层调入到下面来具体实现的。当然,他们还承担着接受底层消息的重任,这些消息也是要最终反馈到UI层的。

jni层之下以及kernel层之上是bluez层(或者准确的说,其实bluez层是横跨jni层之下和kernel层的,如图中绿色框所示)。jni层和bluez的通信是通过dbus来实现的,至今为止我都没有能够理解dbus最终的实现原理,不过没关系,在后面我们和大家再一起到源码中去学习学习这一块。

kernel层之下就是我们的bluetooth的芯片接口driver,这张图里面是使用的uart进行数据的传输的,后期我们也就以uart为主来详细进行分析。当然,还有别的接口,比如usb等等。

这张图还有几个地方需要注意的:

一是最左边的btpower on/off。一般而言,这是在bluetooth打开/关闭的时候用于power的设置的。我看到的基本都是通过rfkill来进行power的加上和去除的。

二是hciattach直接到tty设备的通路,这也是在bluetooth打开/关闭的时候对芯片进行一些各个厂家的初始化所需要的。

大体上来说,这张图也就解释清楚了,希望各位能够从总体上对蓝牙的架构有个初步的了解,这对我们后面去看bluetooth的代码实现是很有好处的。当然,这里面还有很多对我们来说陌生的名词,没关系,现在陌生后期看多了估计我们就会明白了。

更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android(蓝牙)
  3. Android图形系统的分析与移植--二、Android显示系统软件架构分析
  4. 一种Android客户端架构设计分享
  5. Android:基于ibeacon实现蓝牙考勤
  6. [Android源码解析]蓝牙扫描结果反馈的分析
  7. Android提高第十三篇之探秘蓝牙隐藏API
  8. Android(安卓)BLE的总结-概念篇
  9. Android(安卓)控件架构

随机推荐

  1. 布局文件中的笔记
  2. Android(安卓)系统中WatchDog 日志分析
  3. android的第一天学习
  4. android 中文 api (43) ―― Chronometer
  5. Android(安卓)TextView跑马灯效果
  6. 【转】善用Android预定义样式来为我们的
  7. Android(安卓)4.4 SD卡文件读写变化
  8. 在android studio 2.1 实现简单的ndk
  9. Android(安卓)电话的反射调用机制实现静
  10. 使用navigator.userAgent.toLowerCase()