一、蓝牙简介
蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。
其中将1.x~3.0之间的版本称之为经典蓝牙,4.x开始的蓝牙称之为低功耗蓝牙,也就是蓝牙BLE。
1、蓝牙协议介绍
Profiles (蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和大众日常生活接触最多的一部分。蓝牙支持很多Profiles:
MAP:(MessageAccessProfile),短信访问协议,允许设备间的信息交换,短信。使用场景:智能车载中同步短信等信息。
HFP:(Hands-free Profile),电话免提协议,让蓝牙设备(如蓝牙耳机/车机)可以控制电话,如接听、挂断、拒接等。
PBAP:(Phone Book Access Profile),电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能设备上的通讯录和通话记录等信息
A2DP:(Advanced Audio Distribution Profile),高级音频分发协议,在这里大家需要区分开高级音频和蓝牙音频,蓝牙音频一般指传输于蓝牙SCO链路上的音频,也就是蓝牙电话;而高级音频指的传输于蓝牙ACL链路上的高质量音频,即为蓝牙音乐的媒体音频。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或者音响。
AVRCP:(The Audio/Video Remote Control Profile),音视频远程控制协议。AVRCP定义了蓝牙设备之间的音视频传输的特点和流程,来确保不同蓝牙设备之间音视频传输控制的兼容。一般包括暂停,播放,上一曲下一曲等远程控制操作。
以上是比较重要的常见蓝牙协议, 其他常见协议如下:
BIP:(Basic Imaging Profile),基本成像协议。可以在不同的设备之间传递图片;比如可以手机上的图片传给打印机。
BPP:(Basic Priting Profile),基本打印协议。比如手机可以把文本、邮件、图片等发送给打印机,有打印机完成打印。
CIP:(Common ISDN Access Profile),公共ISDN接入协议。
CTP:(Codeless Telephony Profile),无绳电话协议。
DID:(Device ID Profile),设备ID协议。
DUN:(Dial-up Network Profile),拨号网络协议。一个典型的应用:笔记本电脑可以通过手机进行拨号上网。
FAX:(Fax Profile),传真协议,FAX 旨在于手机或固定电话和安装了传真软件的 PC 之间提供适当定义的接口。典型配置为个人计算机使用手机作为 FAX 网关,向任意接收方发送 FAX 传输。
FTP:(File Transfer Profile),文件传输协议。这个用的是比较多的。手机之间互传文件,手机与PC之间传递文件。
GAP:(General Access Profile),基本访问协议。这个规范是其他规范的基础。它定义了在 Bluetooth 设备间建立基带链路的通用方法。
GOEP:(General Object Exchange Profile),通用对象交换协议。可以将对象从一个设备传输到另外一个设备商。对象可以是任意的:比如图片,文本等。此配置文件定义了两个角色:提供拉取或推送对象位置的服务器及启动操作的客户端。GOEP 为使用 OBEX 协议的其它配置文件提供了通用蓝图。
HCRP:(Hard Copy Cable Replacement Profile),硬拷贝电缆替代协议。定义了如何通过 Bluetooth 无线链路完成基于驱动程序的打印。
HID:(Human Interface Device Profile),人机接口设备协议。如果无线蓝牙鼠标;Wii Remotes; PlayStation 3 控制器。
HSP:(Handset Profile),耳机协议。这是最常使用的。用蓝牙耳机可以控制手机:接听、挂断、调节音量。
ICP:(Intercom Profile),对讲机协议。这是在两个设备之间建立语音连接,就是把两个昂贵的蓝牙设备变成廉价的对讲机。
LAP:(LAN Access Profile),局域网接入协议。本功能定义了蓝牙设备如何通过点对点协议(PPP)连接LAN的程序.该功能实现了蓝牙设备连接已存在与LAN中的蓝牙设备的功能.在连接之后,该蓝牙设备即可访问上述LAN的资源。
OPP:(Object Push Profile),对象交换协议。定义了诸如商务卡,约会提醒,任务等的交换功能。
PAN:(Personal Area Networking Profile),个域网协议。两个或更多个 Bluetooth 设备如何构成一个即时网络。
SPP:(Serial Port Profile),串口配置协议。定义了如何设置虚拟串行端口及如何连接两个 Bluetooth 设备。
SPAP:(Service Discovery Application Profile),服务发现应用协议。通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
SAP:(SIM Access Profile),SIM卡访问协议。允许带有内置 GSM 收发器的车载电话之类的设备连接到 Bluetooth 电话中的 SIM 卡。因此车载电话本身并不需要单独的 SIM 卡。
SYNC:(Syncronization Profile),同步协议。SYNC 配置文件可以与 GOEP 配合使用以支持 Bluetooth 设备间的日历和地址信息(个人信息管理器 (PIM) 项)同步。此配置文件的常见应用是 PDA 和计算机之间的数据交换。
VDP:(Video Distribution Profile),视频发布协议。VDP 定义了 Bluetooth 设备如何通过 Bluetooth 无线技术以流传输视频。示例使用案例包括从 PC 媒体中心向便携式播放器流传输存储的视频,或从数码相机向 TV 进行流传输。
2、蓝牙架构图
Google蓝牙架构
应用框架:应用代码,它用 android.bluetooth API 与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。
蓝牙系统服务:蓝牙系统服务(位于 packages/apps/Bluetooth中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。该应用通过 JNI 调用 HAL 层。
JNI:与 android.bluetooth 相关联的 JNI 代码位于 packages/apps/Bluetooth/jni 中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。
HAL:硬件抽象层定义了 android.bluetooth API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。
蓝牙堆栈:系统为您提供了默认蓝牙堆栈(位于 system/bt 中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。
供应商拓展程序:要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。
代码层次架构
APP:包括 Settings APK 和 Bluetooth APK;
Framwork:包括标准的android API,被系统app调用;
JNI:为Bluetooth APK提供操作协议栈控制底层硬件的接口;
HAL:包括
1、HIDL框架为Android原生提供的HAL框架;
2、Bluedroid 为蓝牙协议栈;
3、Vendor HAL为蓝牙芯片厂商提供的操作驱动的接口;
Driver:包括蓝牙驱动,硬件接口(蓝牙和主CPU硬件连接)驱动;
Hardware:同样对应蓝牙芯片和蓝牙和主CPU连接硬件。
3、主要代码分布
frameworks/base/core/java/android/bluetooth/
描述:提供各协议的API接口,APP可直接调用里面的类和方法
BluetoothA2dp.java
定义高品质的音频如何通过蓝牙连接从一个设备传输到另一个设备。"A2DP" 使用场景:蓝牙音乐。
getConnectedDevices:获取此特定配置文件的连接设备
getConnectionState:获取配置文件的当前连接状态
isA2dpPlaying:检查A2DP配置文件是否为流媒体音乐
BluetoothAdapter.java
本地蓝牙适配器,是所有蓝牙交互的入口点,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其他蓝牙设备,查询绑定(配对)设备的列表。
enable:打开蓝牙功能;
disable:关闭蓝牙功能;
isEnable:判断蓝牙功能是否打开;
startDiscovery:开始搜索周围的蓝牙设备;
cancelDiscovery:取消搜索操作;
isDiscovering:判断当前是否正在搜索设备;
getBondedDevices:获取己绑定的设备列表;
setName:设置本机的蓝牙名称;
getName:获取本机的蓝牙名称;
getAddress:获取本机的蓝牙地址;
getRemoteDevice:根据蓝牙地址获取远程的蓝牙设备;
getState:获取本地蓝牙适配器的状态;
BluetoothAssignedNumbers.java
蓝牙编号分配
CarBluetoothService.java
蓝牙设备类型的定义
BluetoothDevice.java
代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息
getName:获取远程设备的蓝牙名称;
getAddress:获得该设备的地址;
getBondState:获得该设备的绑定状态;
BluetoothDevicePicker.java
定义远程蓝牙设备的特性,比如需要认证,设备类型
BluetoothHeadset.java
提供对移动手机使用的蓝牙耳机的支持
getConnectedDevices:获取此特定配置文件的连接设备
getConnectionState:获取配置文件的当前连接状态
isAudioConnected:检查蓝牙SCO音频是否已连接
startVoiceRecognition:启动蓝牙语音识别
stopVoiceRecognition:停止蓝牙语音识别
BluetoothInputStream.java
蓝牙流接口的实现(输入流)
BluetoothOutputStream.java
蓝牙流接口的实现(输出流)
BluetoothProfile.java
一个表示蓝牙配置文件的接口。一个Bluetooth profile是一个基于蓝牙的通信无线接口定义。一个例子是Hands-Free profile
getConnectedDevices:获取此特定配置文件的连接设备
getConnectionState:获取配置文件的当前连接状态
BluetoothServerSocket.java
代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过 InputStream 和 OutputStream 交换数据
BluetoothSocket.java
蓝牙socket的封装
close:关闭对象并释放它所拥有的任何系统资源
connect:尝试连接到远程设备
getInputStream:获取此socket的输入流
getOutPutStream:获取此socket的输出流
getRemoteDevice:获取此socket正在连接或已经连接到的远程设备
isConnected:获取此socket的连接状态,即是否有与远程设备的活动连接
BluetoothUuid.java
蓝牙uuid的定义以及uuid的解析
frameworks/base/services/core/java/com/android/server/
BluetoothManagerService.java
蓝牙系统服务,供其他进程调用。打开和关闭蓝牙的公共接口也在这里面。
packages/services/Car/service/src/com/android/car/
描述:车机自动重连相关
BluetoothDeviceConnectionPolicy.java
车机自动重连策略
BluetoothProfileDeviceManager.java
设备管理列表,连接优先级相关
CarBluetoothService.java
维护当前用户的蓝牙设备和配置文件连接。 为其他程序提供请求自动连接的接口。
packages/apps/Bluetooth/
描述:蓝牙系统服务,被打包为 Android 应用(包名com.android.bluetooth),并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。调用 framework 的 enable 蓝牙接口后会启动该进程。其内部实现了多种上层蓝牙模式:hfp、a2dp、map、pbap 等,并通过JNI调用与haI层完成联系。和 framework/base 层是通过aidl方式交互。
src/com/android/bluetooth/btservice/
AdapterProperties.java
蓝牙属性相关业务.
adapterPropertyChangedCallback:蓝牙属性变更
AdapterService.java
BluetoothAdapter 的实现类,FW 核心业务逻辑类。实现提供给 App 的接口。
BondStateMachine.java
此状态机处理蓝牙适配器状态。
RemoteDevices.java
远端设备相关主要业务逻辑类。
devicePropertyChangedCallback:设备属性变更
deviceFoundCallback:扫描发现设备
aclStateChangeCallback:设备状态变更
hardware/libhardware/include/hardware/
bluetooth.h
蓝牙HAL的头文件
system/bt/
描述:蓝牙官方协议栈
packages/apps/Settings/src/com/android/settings/bluetooth/
描述:setting中蓝牙部分,界面相关蓝牙的调用方式:从 apk 到 framework,framework 再通过 aidl 调用 bluetooth 应用,在通过应用层利用 jni 调用 haI 层实现蓝牙的各种请求。
BluetoothDevicePreference.java
在设置界面显示蓝牙设备的偏好类型。点击界面上的配对、连接、断开就是在这操作的
BluetoothEnable.java
蓝牙辅助类,用来管理蓝牙的开和关以及蓝牙状态的标题显示。如打开或关闭蓝牙的switchbar的状态和文本显示
DeviceListPreferenceFragment.java
BluetoothSettings类的父类,是一个抽象类,该类包含了用于保存蓝牙设备的列表
frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/
BluetoothCallback.java
蓝牙设备的删除、扫描状态的改变、蓝牙状态的改变等回调抽象方法
本章小结:
本文主要介绍蓝牙的基础框架、相关协议以及代码分布,让初步接触蓝牙开发的朋友对蓝牙开发有一个基础的了解,同时为下面看源码时更好的找到源码位置。