您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Android蓝牙系统分析与开发
Android蓝牙系统分析与开发安卓蓝牙使用的是Bluez协议栈,整个android蓝牙系统包括三大部分:1.驱动部分:在kernel/driver/bluetooth目录,主要包括电源管理和蓝牙休眠部分在kernel/driver/tty目录还有蓝牙的uart或usb驱动2.Bluez协议栈部分:包含的内容很复杂,有基本协议栈,如hci/l2cap/rfcomm/等,还有a2dp/obex等profile,代码分布在许多位置;3.蓝牙应用部分,主要是蓝牙设置界面等等。以下是我从网上转过来的一些内容:实战LinuxBluetooth编程(一)协议栈概述Sam一年前在Linux下写了一个类似Windows下BTW的库--BTX。现在需要添加新功能时发现很多知识点都忘记了。所以决定在这次学习中,把一些bluezAPI记录下来。这几天又想,这样还不够,不如把Linux下的Bluetooth编程基础给记录下来吧。前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要Bluetooth设备和应用。但在Linux下如何对Bluetooth编程,一直没有一份很好的中文文档。Sam结合自己的工作,一步一步将一些有用的东西记录下来,希望对其它Linux下Bluetooth编程的朋友有点帮助。一:Bluetooth基本概念:Bluetooth是爱立信、诺基亚、东芝、IBM和Intel5家公司在1998年联合推出的一项无线网络技术。其宗旨是提供一种短距离、低成本的无线传输应用技术。在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用Blatand国王的名字命名再合适不过了。Blatand国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将面世的技术,将标准不一的短距离无线传输技术统一起来。Intel负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发,IBM和东芝负责笔记本电脑接口规格的开发。蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达到100m的传输距离。它采用2.4GHzISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。TDMA每时隙为0.625μs,基带符合速率为1Mb/s。蓝牙支持64kb/s实时语音传输和数据传输,语音编码为CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。由于蓝牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。关于bluetooth协议栈,接下来再谈。当前已经实现的Bluetooth栈有以下各种:1.Widcomm:第一个windows上的协议栈,由Widcomm公司开发,也就是现在的Broadcom.2.MicrosoftWindowsstack:WindowsXPSP2中包括了这个内建的协议栈,开发者也可以调用其API开发第三方软件。3.Toshibastack:它也是基于Windows的,不支持第三方开发,但它把协议栈授权给一些laptop商(sony,asus等,我的本本上就是Toshiba的)。它支持的Profile有:SPP,DUN,FAX,LAP,OPP,FTP,HID,HCRP,PAN,BIP,HSP,HFP,A2DP,AVRCP,GAVDP)4.BlueSoleil:著名的IVT公司的产品.该产品可以用于桌面和嵌入式,他也支持第三方开发,DUN,FAX,HFP,HSP,LAP,OBEX,OPP,PANSPP,AV,BIP,FTP,GAP,HID,SDAP,andSYNC。5.Bluez:Linux官方协议栈,该协议栈的上层用Socket封装,便于开发者使用,通过DBUS与其它应用程序通信。6.Affix:NOKIA公司的协议栈,在Symbian系统上运行.7.BlueDragon:东软公司产品,好像2002年6月就通过了蓝牙的认证,支持的Profile:SDP、Serial-DevB、AVCTP、AVRCP-Controller、AVRCP-Target、Headset-AG、Headset-HS、OPP-Client、OPP-Server、CT-GW、CT-Term、Intercom、FT-Server、FT-Client、GAP、SDAP、Serial-DevA、AVDTP、GAVDP、A2DP-Source、A2DP-Sink.8.BlueMagic:美国OpenInterface公司forportableembeddeddivce的协议栈,iphone(apple),nav-u(sony)等很多电子产品都用该商业的协议栈,BlueMagic3.0是第一个通过bluetooth协议栈1.1认证的协议栈,那么我现在就在用它,那么该栈用起来简单,API清晰明了。实现了的profile有:HCI,L2CAP,RFCOMM,A/V,Remote,Control,A/V,Streaming,BIP,BPP,DUN,FAX,FTP,GAP,Hands-Free,and,Headset,HCRP,HID,OBEX,OPP,PAN,BNEP,PBAP,SAP,SPP,Synchronization,SyncML,Telephony,XML.9.BCHS-BluecoreHostSoftware:蓝牙芯片CSR的协议栈,同时他也提供了一些上层应用的Profile的库,当然了它也是为嵌入式产品了,支持的Profile有:A2DP,AVRCP,PBAP,BIP,BPP,CTP,DUN,FAX,FMAPI,FTPGAP,GAVDP,GOEP,HCRP,Headset,HF1.5,HID,ICP,JSR82,LAPMessageAccessProfile,OPP,PAN,SAP,SDAP,SPP,SYNC,SYNCML。10.WindowsCE:微软给WindowsCE开发的协议栈,但是windowsce本身也支持其它的协议栈11.BlueLet:IVT公司forembeddedproduct的清量级协议栈。实战LinuxBluetooth编程(二)BlueZ简介Linux下Bluetooth协议栈的实现.Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix,Axis公司的OpenBT和官方协议栈BlueZ。我们主要面对Bluez来探讨。BlueZ基础代码均是由MaximKrasnyansky完成的。包括:HCI,L2CAP,RFCOMM和基本socket的实现。他就职于Qualcomm(高通)。MarcelHoltmann开发层的协议和应用,包括:BNEP,CMTP等。当然,这些中也有MaximKrasnyansky的参预。有部分代码由Nokia提供的。Bluez是如何实现Bluetooth协议栈的呢?它分2部分实现:1.Kernel层实现:正如上一篇所谈到的,bluetooth协议栈有多层结构,最底层的硬件协议在硬件中就已经实现了。(例如broadcom的芯片中,底层硬件协议已经包含于芯片之中了)。软件级别的协议实现,从HCI这一层起就可以了。BlueZ对各层协议的实现是依托于Socket的。BlueZ首先创建了一个新的Socket中的协议--PF_BLUETOOTH(AF_BLUETOOTH=31).(也就是说,Socket()的第一个参数:domain必须是:PF_BLUETOOTH)。这也意味着,地址类型需要使用Bluetooth所定义的。其实很简单,就是在net_families(网络协议列表)中添加了PF_BLUETOOTH这一项。如果对LinuxKernel有了解的话,就知道这个注册动作一定在Bluetoothinit部分作的。同样,各个协议层(如:HCI,L2CAP,HID等)都将自己的行为规范添加到PF_BLUETOOTH协议中。2.应用程序层实现:虽然Kernel层已经将Bluetooth协议栈完全实现了,但如果要使用起来,还是非常不方便的。毕竟应用程序与kernel最方便的交流通道就是ioctl().这非常不直观。于是,BlueZ又提供了一套API,这个API帮助开发者方便的与Kernel层协议打交道。当然,这些API底层的实现其就是是ioctl.BlueZ的时间,基本就是这样了。下面咱们具体研究如何使用BlueZ所提供的这套API。实战LinuxBluetooth编程(三)HCI层编程1.HCI层协议概述:HCI提供一套统一的方法来访问Bluetooth底层。如图所示:从图上可以看出,HostControllerInterface(HCI)就是用来沟通Host和Module。Host通常就是PC,Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetoothDongle。在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序)。在Module这一端:LinkManager,BB,等协议都是硬件中firmware提供的。而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez中,hci.chci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的方式传递给底层。居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands,Event,ACLData,SCO/eSCOData。1.1.HCICommand:HCICommand是Host向Modules发送命令的一种方式。HCICommandPacket结构如下:OpCode用来唯一标识HCICommand.它由2部分组成,10bit的OpcodeCommand.6bit的OpcodeGroup。1.1.1:OpCodeGroup:LinuxKernel(BlueZ)中,~/include/net/bluetooth/hci.h中定义了OpCodeGroup。#defineOGF_LINK_CTL0x01#defineOGF_LINK_POLICY0x02#defineOGF_HOST_CTL0x03#defineOGF_INFO_PARAM0x04#defineOGF_STATUS_PARAM0x05它们代表了不同的CommandGroup:OGF_LINK_CTL:Linkcontrol,这个CommandGroup中的Command允许Host控制与其它bluetoothdevice的连接。OGF_LINK_POLICY:LinkPolicy。这个CommandGroup中的Command允许调整LinkManagercontrol.OGF_HOST_CTL:ControlandBaseband.1.1.2:OpcodeCommand:用来在同一个Group内唯一识别Command。~/include/net/bluetooth/hci.h中定义。1.2:HCIEvent:Modules向Host发送一些信息,使用HCIEvent。EventPacket结构如下:HCI
本文标题:Android蓝牙系统分析与开发
链接地址:https://www.777doc.com/doc-5372855 .html