初次学习可能概念很模糊,建议熟读几次,原作者罗列很详细,看完之后对应用层开发和源码settings bluetooth部分解读很有帮助,了解整个底层协议是如何工作的。
一、Android Bluetooth现状
(1)Android2.2版 支持的蓝牙核心版本是Bluetooth 2.0 + EDR。
(2)Android 的蓝牙 使用了BlueZ协议栈,但只实现了Headset/Handfree和A2DP/AVRCP等Profile。
(一些常用的Profile(如HID/DUN/SPP/OPP/FTP/PAN等)在现在的Android2.2版中并没有实现。需要自己在Android中实现Profile)。
(3)目前版本(Android2.2) 只支持 绑定设备(bonded devices)之间通信,而不支持ad-hoc网络通信。
(4)目前版本(Android2.2) emulator(仿真器、模拟器)不支持蓝牙的调试,只能通过LOG和BlueZ带的工具来调试。
(5)Android2.0 API level5 之后的版本才支持Bluetooth。
(6)Android 的Bluetooth通信API是BlueZ 的RFCOMM的封装。
RfcommSocket 在 API level7 之后的版本才提供Bluetooth 的通信
RfcommSocket 使用JAVA 的IputStream 和OutputStream对象
二、Android Bluetooth 架构
1、面向库的架构视图
2、面向进程的架构视图
LinuxKernel层:
bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm
Library层:
libbluedroid.so 等
Framework层:
实现了Headset /Handsfree 和 A2DP/AVRCP profile,但其实现方式不同Headset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。
三、 BlueZ介绍
(详见http://www.bluez.org/):
BlueZ 是Linux OS开放的bluetooth 协议栈主要包括IBM公司的BlueDrekar, Nokia公司的Affix, Axis公司的OpenBT和官方的协议栈BlueZ.
Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。
内核代码:由BlueZ核心协议和驱动程序组 成;Bluetooth协议实现在内核源代码 /net/bluetooth中。包括hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。驱动程序放在 /driver/bluetooth中,包含Linux kernel对各种接口的Bluetooth device的驱动。例如:USB接口,串口等。
用户态程序及工具集:包括应用程序接口和BlueZ工具集。BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。
四、几个术语:
HFP(Hands-free Profile)耳机模式:
让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。
HSP(Headset Profile)耳机模式
用于支持蓝牙耳机与移动电话之间使用
HID() 人机接口设备配置文件
HID 配置文件定义了 Bluetooth HID(如键盘、指向设备、游戏设备及远程监视设备)使用的协议、程序及功能
拨号网络配置文件 (DUN)
DUN 提供了通过 Bluetooth 无线技术接入 Internet 和其它拨号服务的标准。最常见的情况是在手机上拨号,从膝上型计算机以无线方式接入 Internet。
个人局域网配置文件 (PAN)
PAN 描述了两个或更多个 Bluetooth 设备如何构成一个即时网络,以及如何使用同一机制通过网络接入点接入远程网络。配置文件角色包括网络接入点、组即时网络及个人局域网用户。
SDP( Service Discovery Protocol )服务发现协议
提供应用程序在蓝牙环境中发现哪个服务可用和决定那些可用服务的特征。
GAP(Generic Access Profile)通用访问应用
一般访问应用规范定义了蓝牙设备如何发现和建立与其他设备的安全(或不安全)连接。它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问题(如担保),同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其它蓝牙应用规范的基础。
三、蓝牙协议栈
蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作。互操作的远端设备需要使用相同的协议栈,不同的应用需要不同的协议栈。但是,所有的应用都要使用蓝牙技术规范中的数据链路层和物理层。
完整的蓝牙协议栈如图1所示,不是任何应用都必须使用全部协议,而是可以只使用其中的一列或多列。图1显示了所有协议之间的相互关系,但这种关系在某些应用中是有变化的。
蓝牙协议体系中的协议
蓝牙协议体系中的协议按SIG的关注程度分为四层:
-
- 核心协议:BaseBand、LMP、L2CAP、SDP;
- 电缆替代协议:RFCOMM;
- 电话传送控制协议:TCS-Binary、AT命令集;
- 选用协议:PPP、UDP/TCP/IP、OBEX、WAP、vCard、vCal、IrMC、WAE。
除上述协议层外,规范还定义了主机控制器接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口。在图1中,HCI位于L2CAP的下层,但HCI也可位于L2CAP上层。
蓝牙核心协议由SIG制定的蓝牙专用协议组成。绝大部分蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。总之,电缆替代协议、电话控制协议和被采用的协议在核心协议基础上构成了面向应用的协议。
1.蓝牙核心协议
基带协议
基带和链路控制层确保微微网内各蓝牙设备单元之间由射频构成的物理连接。蓝牙的射频系统是一个跳频系统,其任一分组在指定时隙、指定频率上发送。它使用查询和分页进程同步不同设备间的发送频率和时钟,为基带数据分组提供了两种物理连接方式,即面向连接(SCO)和无连接(ACL),而且,在同一射频上可实现多路数据传送。ACL适用于数据分组,SCO适用于话音以及话音与数据的组合,所有的话音和数据分组都附有不同级别的前向纠错(FEC)或循环冗余校验(CRC),而且可进行加密。此外,对于不同数据类型(包括连接管理信息和控制信息)都分配一个特殊通道。
可使用各种用户模式在蓝牙设备间传送话音,面向连接的话音分组只需经过基带传输,而不到达L2CAP。话音模式在蓝牙系统内相对简单,只需开通话音连接就可传送话音。
连接管理协议(LMP)
该协议负责各蓝牙设备间连接的建立。它通过连接的发起、交换、核实,进行身份认证和加密,通过协商确定基带数据分组大小。它还控制无线设备的电源模式和工作周期,以及微微网内设备单元的连接状态。
逻辑链路控制和适配协议(L2CAP)
该协议是基带的上层协议,可以认为它与LMP并行工作,它们的区别在于,当业务数据不经过LMP时,L2CAP为上层提供服务。L2CAP向上层提供面向连接的和无连接的数据服务,它采用了多路技术、分割和重组技术、群提取技术。L2CAP允许高层协议以64k字节长度收发数据分组。虽然基带协议提供了SCO和ACL两种连接类型,但L2CAP只支持ACL。
·服务发现协议(SDP)
发现服务在蓝牙技术框架中起着至关紧要的作用,它是所有用户模式的基础。使用SDP可以查询到设备信息和服务类型,从而在蓝牙设备间建立相应的连接。
2.电缆替代协议(RFCOMM)
RFCOMM是基于ETSI-07.10规范的串行线仿真协议。它在蓝牙基带协议上仿真RS-232控制和数据信号,为使用串行线传送机制的上层协议(如OBEX)提供服务。
3.电话控制协议
二元电话控制协议(TCS-Binary或TCSBIN)
该协议是面向比特的协议,它定义了蓝牙设备间建立语音和数据呼叫的控制信令,定义了处理蓝牙TCS设备群的移动管理进程。基于ITU TQ.931建议的TCSBinary被指定为蓝牙的二元电话控制协议规范。
AT命令集电话控制协议
SIG定义了控制多用户模式下移动电话和调制解调器的AT命令集,该AT命令集基于ITU TV.250建议和GSM07.07,它还可以用于传真业务。
4.选用协议
点对点协议(PPP)
在蓝牙技术中,PPP位于RFCOMM上层,完成点对点的连接。
TCP/UDP/IP
该协议是由互联网工程任务组制定,广泛应用于互联网通信的协议。在蓝牙设备中,使用这些协议是为了与互联网相连接的设备进行通信。
对象交换协议(OBEX)
IrOBEX(简写为OBEX)是由红外数据协会(IrDA)制定的会话层协议,它采用简单的和自发的方式交换目标。OBEX是一种类似于HTTP的协议,它假设传输层是可靠的,采用客户机/服务器模式,独立于传输机制和传输应用程序接口(API)。
电子名片交换格式(vCard)、电子日历及日程交换格式(vCal)都是开放性规范,它们都没有定义传输机制,而只是定义了数据传输格式。SIG采用vCard/vCal规范,是为了进一步促进个人信息交换。
无线应用协议(WAP)
该协议是由无线应用协议论坛制定的,它融合了各种广域无线网络技术,其目的是将互联网内容和电话传送的业务传送到数字蜂窝电话和其他无线终端上。
用户模式及协议栈
1.文件传输模式
文件传输模式提供两终端间的数据通信功能,可传输后缀为.xls、.ppt、.wav、.jpg和.doc的文件(但并不限于这几种),以及完整的文件夹、目录或多媒体数据流等,提供远端文件夹浏览功能。文件传输协议栈如图2所示。
2.因特网网桥模式
这种用户模式可通过手机或无线调制解调器向PC提供拨号入网和收发传真的功能,而不必与PC有物理上的连接。拨号上网需要两列协议栈(不包括SDP),如图3所示。AT命令集用来控制移动电话或调制解调器以及传送其他业务数据的协议栈。传真采用类似协议栈,但不使用PPP及基于PPP的其他网络协议,而由应用软件利用RFCOMM直接发送。
3.局域网访问模式
该用户模式下,多功能数据终端(DTs)经局域网访问点(LAP)无线接入局域网,然后,DTs的操作与通过拨号方式接入局域网的设备的操作一样,其协议栈如图4所示。
4.同步模式
同步用户模式提供设备到设备的个人资料管理(PIM)的同步更新功能,其典型应用如电话簿、日历、通知和记录等。它要求PC、蜂窝电话和个人数字助理(PDA)在传输和处理名片、日历及任务通知时,使用通用的协议和格式。其协议栈如图5所示,其中同步应用模块代表红外移动通信(IrMC)客户机或服务器。
5.一机三用电话模式
手持电话机有三种使用方法:第一,接入公用电话网,作为普通电话使用;第二,作为不计费的内部电话使用;第三,作为蜂窝移动电话使用。无线电话和内部电话使用相同的协议栈;语音数据流直接与基带协议接口,不经过L2CAP层,如图6所示。
6.头戴式设备模式
使用该模式,用户打电话时可自由移动。通过无线连接,头戴式设备通常作为蜂窝电话、无线电话或PC的音频输入输出设备。头戴式设备协议栈如图7所示,语音数据流不经过L2CAP层而直接接入基带协议层。头戴式设备必须能收发并处理AT命令。
完整的协议栈包括蓝牙专用协议(如连接管理协议LMP和逻辑链路控制应用协议L2CAP)以及非专用协议(如对象交换协议OBEX和用户数据报协议UDP)。设计协议和协议栈的主要原则是尽可能利用现有的各种高层协议,保证现有协议与蓝牙技术的融合以及各种应用之间的互操作,充分利用兼容蓝牙技术规范的软硬件系统。蓝牙技术规范的开放性保证了设备制造商可以自由地选用其专用协议或习惯使用的公共协议,在蓝牙技术规范基础上开发新的应用。
Android蓝牙系统分为四个层次,内核层、BlueZ库、BlueTooth的适配库、BlueTooth的JNI部分、Java框架层、应用层。下面先来分析Android的蓝牙协议栈。
Android的蓝牙协议栈采用BlueZ来实现,BlueZ分为两部分:内核代码和用户态程序及工具集。
内核代码主要由BlueZ核心协议和驱动程序组成;蓝牙协议实现在内核源代码net/bluetooth中,驱动程序位于内核源代码目录 driver/bluetooth中。用户态程序及工具集主要包括应用程序接口和BlueZ工具集,位于Android源代码目录externel /bluetooth(注:Android版本不一样,有的在externel/bluez目录下)中。
1、蓝牙协议栈
蓝牙协议栈的体系结构由底层硬件模块、中间协议层和高端应用层三部分组成。
一、底层硬件模块
组成:
链路管理协议(Link ManagerProtocol,LMP);
基带(Base Band,BB);
射频(Radio Frequency,RF)。
功能:
射频(RF)通过2.4GHz的ISM频段实现数据流的过滤和传输。
基带(BB)提供两种不同的物理链路,即同步面向连接链路(Synchronous Connection Oriented,SCO)和异步无连接链路(AsynchronousConnection Less,ACL),负责跳频和蓝牙数据,及信息帧的传输,且对所有类型的数据包提供不同层次的前向纠错码(Frequency Error Correction,FEC)或循环冗余度差错校验(CyclicRedundancy Check,CRC)。
链路管理协议(LMP)负责两个或多个设备链路的建立和拆除,及链路的安全和控制,如鉴权和加密、控制和协商基带包的大小等,它为上层软件模块提供了不同的访问入口。
主机控制器接口(HostController Interface,HCI)是蓝牙协议中软硬件之间的接口,提供了一个调用下层BB、LMP、状态和控制寄存器等硬件的统一命令,上下两个模块接口之间的消息和数据的传递必须通过HCI的解释才能进行。
二、中间协议层
组成:
逻辑链路控制和适配协议(LogicalLink Control and Adaptation Protocol,L2CAP);
服务发现协议(ServiceDiscovery Protocol,SDP);
串口仿真协议(或称线缆替换协议RFCOMM);
二进制电话控制协议(TelephonyControlprotocol Spectocol,TCS)。
功能:
L2CAP位于基带(BB)之上,向上层提供面向连接的和无连接的数据服务,它主要完成数据的拆装、服务质量控制、协议的复用、分组的分割和重组,及组提取等功能。
SDP是一个基于客户/服务器结构的协议,它工作在L2CAP层之上,为上层应用程序提供一种机制来发现可用的服务及其属性,服务的属性包括服务的类型及该服务所需的机制或协议信息。
RFCOMM是一个仿真有线链路的无线数据仿真协议,符合ETSI标准的TS07.10串口仿真协议,它在蓝牙基带上仿真RS-232的控制和数据信号,为原先使用串行连接的上层业务提供传送能力。
TCS定义了用于蓝牙设备之间建立语音和数据呼叫的控制信令(Call Control Signalling),并负责处理蓝牙设备组的移动管理过程。
三、高端应用层
组成:
点对点协议(Point-to-PointProtocol,PPP);
传输控制协议/网络层协议(TCP/IP);
用户数据包协议(UserDatagram Protocol,UDP);
对象交换协议(ObjectExchang Protocol,OBEX);
无线应用协议(WirelessApplication Protocol,WAP);
无线应用环境(WirelessApplication Environment,WAE);
功能:
PPP定义了串行点对点链路应当如何传输因特网协议数据,主要用于LAN接入、拨号网络及传真等应用规范。
TCP/IP、UDP定义了因特网与网络相关的通信及其他类型计算机设备和外围设备之间的通信。
OBEX支持设备间的数据交换,采用客户/服务器模式提供与HTTP(超文本传输协议)相同的基本功能。可用于交换的电子商务卡、个人日程表、消息和便条等格式。
WAP用于在数字蜂窝电话和其他小型无线设备上实现因特网业务,支持移动电话浏览网页、收取电子邮件和其他基于因特网的协议。
WAE提供用于WAP电话和个人数字助理(PersonalDigital Assistant,PDA)所需的各种应用软件。
2、android与蓝牙协议栈的关系
蓝牙系统的核心是BlueZ,因此JNI和上层都围绕跟BlueZ的沟通进行。JNI和android应用层,跟BlueZ沟通的主要手段是D- BUS,这是一套被广泛采用的IPC通信机制,跟Android框架使用的Binder类似。BlueZ以D-BUS为基础,给其他部分提供主要接口。