Bluetooth在android中的实现和开发_第1页
Bluetooth在android中的实现和开发_第2页
Bluetooth在android中的实现和开发_第3页
Bluetooth在android中的实现和开发_第4页
Bluetooth在android中的实现和开发_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、张文Bluetooth IntroduceBluetooth Overview Bluetooth Core System Architecture Bluetooth Interface BlueZ Android Bluetooth Architecture Android A2dp Profile Android HFP and HSP Profile Android PAN ProfileBluetooth Core System ArchitectureBluetooth Core System Architecture蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应

2、用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。RF层层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带基带负责跳频以及蓝牙数据和信息帧的传输。链路管理链路管理负责连接、建立和拆除链路并进行安全控制。LM (Link Manager) 层层是蓝牙协议栈的链路管理层协议, 他负责将上层HCI 命令翻译成基带能接受的操作, 建立ACL (数据) 和SCO (语音) 链接, 以及使蓝牙设备进入节能状态的工作模式等。LC (Link Control) 层层负责在一批数据包传送期间, 响应上层L

3、M 命令(如执行建立数据包的传输链路, 维持链路等功能的LM 命令)。HCI位于蓝牙系统的L2CAP(逻辑链路控制与适配协议)层和LMP(链路管理协议)层之间的一层协议。HCI为上层协议提供了进入LM的统一接口和进入基带的统一方式。蓝牙的SIG规定了四种与硬件连接的物理总线方式:USB、RS232、UART和PC卡模块及应用程序接口模块及应用程序接口模块及应用程序接口(1)HCI层接口(层接口(Host Controller Interface) 主机控制接口(HCI)为主机提供了直接控制蓝牙模块的方法和途径。通过HCI把蓝牙模块和主机连接在一起。HCI模块由HCI事件管理、HCI命令管理、H

4、CI ACL/SCO数据传输、HCI传输层API、向上层输出的API模块组成。HCI Firmware通过访问基带命令、链路管理器命令、硬件状态寄存器、控制寄存器、事件寄存器实现对蓝牙硬件的HCI命令。(2) L2CAP协议层(协议层(Logical Link Control and Adaptation Protocol)逻辑链路控制与适配协议(L2CAP)是数据链路层的一部分,它向上层提供面向连接和无连接的服务。(3) RFCOMM及其接口及其接口RFCOMM是一个基于ETST标准TS 07.10的传输协议,提供了对RS-232串行接口的仿真。它在两个蓝牙设备之间同时最多提供60条连接,最

5、大可以接收/发送32KB大小的数据分组。(4)SDP及其接口及其接口服务发现协议(SDP)是蓝牙框架的一个关键部分,它由服务发现代理(SDA)、服务发现服务器(SDS)、服务数据库管理器(SDM)三个模块组成。(5) BNEP 网络封装协议网络封装协议(Bluetooth Network Encapsulation Protocol )该协议对上层口协议提供了类似于以太网的接口。对于IEEE802.3/Ethemet封装支持的网络协议,蓝牙网络封装均支持。BNEP协议把这些网络 协议包封装起来,直接通过蓝牙I2CAP协议进行无线传输。蓝牙网络封装主要应用在蓝牙个人无线局域网(PAN)中,PAN

6、应用是指由两个或者更多的设备 形成一个特定网络,而且这些设备能通过一个网络接入点来访问远程网络(6) AVDTP &AVCTPAVDTP: Audio/Video Distribution Transport ProtocolAVCTP: Audio/Video Control Transport ProtocolHCI协议的作用其他高层协议其他高层协议HCI驱动驱动物理总线(串口,物理总线(串口,USB等)驱动等)驱动主机主机物理总线物理总线物理总线固件物理总线固件HCI FirmwareLMRF蓝牙控制器蓝牙控制器HCI协议提供了统一访问蓝牙控制器的能力。主机控制器以HCI命令的形式提供了

7、访问蓝牙硬件的基带控制器、链路管理器、硬件状态寄存器、控制寄存器以及事件寄存器的能力,所有这些功能都要通过内置于蓝牙硬件内部的HCI Firmware来实现。主机通过HCI接口向主机控制器内的HCI Firmware发送HCI命令,HCI Firmware再通过基带命令、链路管理器命令、硬件状寄存器、控制寄存器以及事件寄存器完成该HCI命令,从而实现对蓝牙硬件的控制。命命 令包令包:命令包中的OCF(Opcode Command Field)和OGF(Opcode Group Field)是用于区分命令的。Parameter Length表示所带参数的长度,以字节数为单位,随后就是所带的参数列

8、表。* 链路控制命令; OGF 0X01 控制主机控制器对其他设备的连接;* 链路政策和模式命令; OGF 0X02 通过命令改变控制器的链路管理器的管理方式* 主机控制和基带命令; OGF 0X03 访问和控制蓝牙的硬件设备* 信息命令; OGF 0X04 发现本地设备的相关信息 * 状态命令; OGF 0X05 读取主机控制器的状态参数* 测试命令。 OGF 0X06 功能测试命令事件包事件包也可分为三种类型:* 通用事件,包括命令完成包(Command Complete)和命令状态包(Command Status);* 测试事件;* 出错时发生的事件,如产生丢失(Flush Occure

9、d)和数据缓冲区溢出(Data Buffer Overflow)。数据包数据包则可分为ACL和SCO的数据包。看看HCI log 工具工具: Hcidump X hciHCI 包命令解析L2CAP 协议层 L2CAP协议是一个为高层协议屏蔽基带协议的适配协议,位于基带协议之上,属于数据链路层,为高层提供面向连接和面向无连接的数据服务,完成协议复用、分段和重组、服务质IQoS(Quality Of Service)传输以及组抽象等功能:(1)协议复用协议复用:多个高层协议共享一个公共的物理连接,从逻辑上看每个协议都有自己独立的数据通道,但由于基带协议不能识别任何高层协议,所以L2CAP必须支持上

10、层协议复用,它能区分诸如服务发现协议、RFCOMM协议、电话控制协议等高层协议。(2)分段与重组分段与重组:与有线的物理媒质相比,蓝牙基带协议数据包的大小是有限的。最大的基带包只能传输341字节的信息,这就限制了高层协议带宽的有效使用,因此较大的L2CAP包必须分解成小的基带包来发送。同样,在接收方,必须将多个基带包重组为一个完整的L2CAP数据包。(3)服务质量服务质量:在L2CAP建立连接的过程中允许改变两台蓝牙设备间的服务质量,每个L2CAP实体必须监视协议使用的资源并保证服务质量的实现。(4)组管理组管理:蓝牙的基带协议支持微微网,即一组设备使用同一时钟同步跳频,L2CAP协议的组提取

11、功能可以有效地将协议的组映射为基带的微微网,以避免高层协议为了有效的管理组而必须与基带协议以及链路管理器直接联系。High LayerL2CAPLow Layer(BB or HCI)requestconfirmrequestconfirmresponseresponseindicationindicationL2CAP的层间操作RFCOMM 协议层RFCOMM提供对RS-232串口的仿真,包括对数据信号线和非数据信号线的仿真。它既可以仿真两个设备之间的多个串口,也可以支持多个设备之问的多串口仿真,同时RFCOMM中还提供了对空调制解调器的仿真。1RFCOMM对九针RS-232串口的仿真RFC

12、OMM提供了对九针RS-232串口的仿真,包括数据信号线和非数据信号线。2多串口仿真两个数据终端设备之间通过RFCOMM通信,可以打开多达60个仿真串口,但是实际打开串口数还要视设备生产商的具体实现以及实际需要而定。各仿真串口之间通过数据链路连接标示符DLCI(Data Link Connection Identifier)加以区分,其中DLCI_0用于指示控制信道,DLCI_1不可用,而DLCI_62和DLCI 63为保留标示符SDP 发现服务这个模型分为三个过程:设备发现过程,设备名字发现过程和SDP服务发现SDP由三大模块组成:链路维护模块:完成SDP链路的建立,参数配置和拆链。PDU收

13、发模块:完成请求PDU的封装发送,收到PDU后以socket通讯方式交给SDP解析服务器完成。SDP解析服务器:完成收到的PDU的解析,对于请求PDU检索数据库得到响应数据后返回给PDU收发模块,对于响应PDU解析出的结果直接发送给应用程序。Bluetooth 其余知识两种链路类型:面向连接的同步链路(SCO)面向无连接的异步链路(ACL)。三种节能状态,停等(Park)状态保持(Hold)状态呼吸(Sniff)状态三种纠错方案1/3前向纠错(FEC)2/3前向纠错自动重发(ARQ)在链路层中,蓝牙系统提供了认证、加密和密钥管理等功能。每个用户都有一个个人标识码(PIN),它会被译成128bi

14、t的链路密钥 (Link Key)来进行单双向认证。一旦认证完毕,链路就会以不同长度的密码(Encryphon Key)来加密(此密码以shit为单位增减,最大的长度为128bit)链路层安全机制提供了大量的认证方案和一个灵活的加密方案(即允许协商密码的长度)BlueZ介绍 BlueZ 是官方 Linux Bluetooth栈,由主机控制接口(Host Control Interface ,HCI)层、Bluetooth协议核心、逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol,L2CAP)、SCO 音频层、其他 Bluetoot

15、h 服务、用户空间后台进程以及配置工具组成。 BlueZ以标准socket形式封装了hci、l2cap和rfcomm协议,使得应用调用更加方便。 参考/Bluetooth protocol layers mapped to BlueZ kernel modulesPAND userbnep.ko kbnepd l2cap.koLogical linker control and adaption layerbnepXTCP/IPHci_uart.ko Hci_usb.koHost control interface layerBluetooth ChipS

16、ettelnet/app/ftp/sshUser spaceKernel spaceTransport layerNetwork layerBluetooth.ko(core socket sysfs)rfcomm.kokrfcommdPPPdundpppXHidp.koHiddMice appsdpdhciXrfcomm/dev/rfcommXsco.koAudioappHci_vhci.koBluetooth socket appSerial app蓝牙协议体系结构BlueZ-utilBluetooth applicationHCI协议L2capRfcommSCOBlueZ coreUar

17、t driverUSB driverOther driverBluetooth hardware用户区内核区socket驱动接口蓝牙协议栈bluez可分为两部分:内核代码和用户态程序及工具集,其中内核代码由BLUEZ核心协议和驱动程序等模块组成的。用户态程序及工具集包括应用程序接口和BLUEZ工具集。在内核代码中,bluez协议的bluez-kernal和bluez-libs软件实现了主机控制接口(HCI)和套接字接口的全部功能,内核代码采用模块化设计,由设备驱动程序模块和蓝牙核心协议模块组成,分别位于Linux内核的代码的drivers子目录和net子目录下,drivers子目录代码包括Li

18、nux内核对各种接口的蓝牙设备的驱动,net子目录下包括蓝牙核心协议和一部分扩展协议的内核代码,如L2CAP, RFCOMM, SCO, SDP, BNEP的协议。蓝牙协议结构体系Linux蓝牙驱动net/hci_core.c HCI在主机端的驱动主要是为上层提供一个统一的接口,让上层协议不依赖于具体硬件的实现。HCI在硬件中的固件与HCI在主机端的驱动通信方式有多种,比如像UART、USB和PC Card等等。hci_core.c相当于一个框架,用于把各种具体通信方式胶合起来,并提供一些公共函数的实现。hci_cmd_task是负责发送CMD的任务,它从hdev-cmd_q队列中取CMD,然

19、后调用hci_send_frame把CMD发送出去,hci_send_frame又会调用实际的HCI驱动的send函数发送数据。hci_rx_task是负责接收数据的任务,它从hdev-rx_q队列中取数据,然后根据数据的类型调用上层函数处理。数据包有三种类型:HCI_EVENT_PKT:用于处理一些通信事件,比如连接建立,连接断开,认证和加密等事件,这些事件控制协议状态的改变。 HCI_ACLDATA_PKT:异步非连接的数据包,通过hci_acldata_packet提交给上层的L2CAP协议处理(hci_protoHCI_PROTO_L2CAP)。 HCI_SCODATA_PKT:同步面

20、向连接的数据包,通过hci_scodata_packet提供给上层的SCO协议处理(hci_protoHCI_PROTO_SCO)。hci_tx_task是负责发送数据的任务,发送所有connection中的ACL和SCO数据,以及hdev-raw_q中的数据包。Linux蓝牙驱动HCI为上层提供的接口主要有:为上层提供的接口主要有:hci_send_sco:发送SCO数据包,把要发送的数据包放入connection的发送队列中,然后调度发送任务去发送。 hci_send_acl:发送ACL数据包,把要发送的数据包放入connection的发送队列中,然后调度发送任务去发送。 hci_send

21、_cmd:发送命令数据,把要发送的数据包放入hdev-cmd_q队列中,然后调度命令发送任务去发送。 hci_register_proto/hci_unregister_proto:注册/注销上层协议,HCI会把接收到的数据转发给这些上层协议。 hci_register_dev/hci_unregister_dev: 注册/注销设备,HCI会把要发送的数据通过这些设备发送出去。 其它一些公共函数。Linux蓝牙驱动net/hci_conn.c提供了一些连接管理,论证和加密的函数。net/hci_event.c事件处理函数,负责状态机的维护,这些事件通常会使连接从一个状态转换另一个状态。hci_

22、si_event:用于发送事件。 hci_event_packet:用于处理底层上报的事件,从hci_rx_task处调用过来。net/hci_sock.c给上层提供一个socket接口,应用程序可以通过socket的方式来访问HCI。hci_sock_init:中注册了BTPROTO_HCI类型family。 hci_sock_create:创建sock的函数,它的sock的ops指向hci_sock_ops。 hci_sock_setsockopt/hci_sock_getsockopt:设置/获取sock的一些选项。 hci_sock_sendmsg:发送消息,根据消息的类型把消息放到适

23、当的队列中。 hci_sock_recvmsg:接收消息,从接收队列中取消息。 hci_sock_recvmsg:ioctl函数。Linux蓝牙驱动net/hci_sysfs.c提供一些sysfs文件系统接口。net/l2cap.cL2CAP是HCI之上的协议,提供诸如QoS,分组,多路复用,分段和组装之类的功能。通过bt_sock_register为上层提供一个sock接口:l2cap_sock_create:创建sock的函数,它的sock的ops指向l2cap_sock_ops。 l2cap_sock_setsockopt/l2cap_sock_getsockopt设置/获取sock的一

24、些选项。 l2cap_sock_sendmsg:发送消息,通过HCI提供hci_send_acl函数把消息传递给下层的设备。 bt_sock_recvmsg:接收消息,从接收队列中取消息。通过hci_register_proto向其下的HCI注册协议:l2cap_connect_ind:处理连接请求。 l2cap_connect_cfm:确认连接。 l2cap_disconn:处理断开请求。 l2cap_auth_cfm:认证确认。 l2cap_encrypt_cfm:加密确认。 l2cap_recv_acldata:处理来自HCI的数据。 Linux蓝牙驱动net/sco.cSCO也是运行在

25、HCI之上的协议,它是面向连接的可靠的传输方式,主要用于声音数据传输。通过bt_sock_register为上层提供一个sock接口:sco_sock_create:创建sock的函数,它的sock的ops指向sco_sock_ops。 sco_sock_setsockopt/sco_sock_getsockopt设置/获取sock的一些选项。 sco_sock_sendmsg:发送消息,通过HCI提供sco_send_frame函数把消息传递给下层的设备。 bt_sock_recvmsg:接收消息,从接收队列中取消息。通过hci_register_proto向其下的HCI注册协议:sco_c

26、onnect_ind:处理连接请求。 sco_connect_cfm:确认连接。 sco_disconn_ind:处理断开请求。 sco_recv_scodata: 处理来自HCI数据。Linux蓝牙驱动rfcommrfcomm是基于l2CAP之上的协议,它在蓝牙协议之上封装传统的RS232串口。drivers/bluetooth前面我们介绍的都是HCI及其上层的协议,HCI下层的实现就是HCI驱动程序,这些驱动程序用于与蓝牙硬件通信,通信的方式常见的有USB,UART和PC card等几种。这里我们看看USB的方式:drivers/bluetooth/hci_usb.chci_usb_pro

27、be: 调用hci_register_dev向前面说的hci_core注册HCI设备。 hci_usb_send_frame:用于提供给HCI去发送数据包。它把数据包放到传输队列_transmit_q(husb, bt_cb(skb)-pkt_type)之中,然后调用hci_usb_tx_process去传输数据。 hci_usb_tx_process:根据数据的类型去调用hci_usb_send_ctrl /hci_usb_send_isoc /hci_usb_send_bulk把数据通过USB发送给硬件。BlueZ内部结构分析BlueZ文件结构 Bluetooth/hcidump:hci

28、command/event的trace工具,可以监视蓝牙数据的传送情况。 BlueZ/libs:应用层对hci command/event的封装,提供了发送hci command,接收对应的hci event的接口。 BlueZ/src: Bluetooth 服务、用户空间后台进程以及配置工具 主要后台进程: hciattach:将蓝牙芯片绑定到/dev/tty*口。 sdpd:SDP协议后台进程,负责蓝牙服务注册,查询等。 bluetoothd:bluetooth后台监视进程。监听hci event。Security Mode Security mode 1 No active securi

29、ty enforcement Security mode 2 Service level securityOn device level no difference to mode 1 Security mode 3Device level securityEnforce security for every low-level connectionPairing ProcesPin_help的理念在bluez-util 3.x时已经被移除,并被密钥代理所代替。现在支持两种类型的密钥代理:默认和设备特定。一个特定的密钥代理处理所有远端的密钥请求,一个默认的密钥代理,处理特定的代理所没有发现的所

30、有密钥请求当CreateBonding方法被调用时,bluetoothd守护进程将确认当前的文件系统中是否保存了链接密钥,若可以找到,就返回一个错误。若找不到,D-Bus消息将被发出来为密钥请求的设备,注册一个密钥代理。每个密钥代理被D-Bus对象路径所体现,bluetoothd依据唯一的总线名称和对象路径来区分代理How pairing works First connection(1) HCI_Pin_Code_Request(2) HCI_Pin_Code_Request_Reply(3) HCI_Link_Key_Notification Further connections(1)

31、HCI_Link_Key_Request(2) HCI_Link_Key_Request_Reply(3) HCI_Link_Key_Notification (optional)Link Key Used for authentication Challenge-Response Used for encryption SAFER+ (128bit Blockcipher) Generated by Pairing (or Bonding) Process Passkey (1-16 alphanum. chars) Never communicated (secret) Random nu

32、mber Explicitely communicated (public) Master BDADDR Implicitly communicated (public) Usually stored on devicesBlueZKernalsettingsOpen sourceBluetooth FrameWorksApplicationAndroid Bluetooth 框架图A2dpserviceBluetooth JNIJAVAJNIBluetooth OPPPhoneAppbluetoothhandfreeServiceBluetoothServiceHIDhandlerPANha

33、ndlereventloopBluetooth enableDevicePropertyAdapterPropertyBondStatebluetoothOPPServiceBluetooth InterfaceBluetooth 启动流程Hardware power onLoad Bluetooth kernel module1:insmod *.ko2: compile into kernelLoad Bluetooth Firmware1: usb load Bluetooth FW from kernel /drivers/bluetooth/*.c2: uart interface,

34、 will load from init.rc hciattach /system/bin/hciattach -n /dev/ttyMFD0 texas 3500000/ ttyMFD0- device interface/texas-search uart type from hciattach list/ 3500000 set the urat baud rateSet Hci configurehciconfig hci0 upLauncher the bluetooth daemon /system/bin/bluetoothd -d nAdd HF AG channel/syst

35、em/bin/sdptool add -channel=10 HFAGAdd HS AG channel/system/bin/sdptool add -channel=11 HSAGStep for work with profile1:Get the default adapter.BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();if (mBluetoothAdapter = null) / Device does not support Bluetooth2:Use getProfileP

36、roxy() to establish a connection to the profile proxy object associated with the profile/ Establish connection to the proxy.mBluetoothAdapter.getProfileProxy(context, mProfileListener, BluetoothProfile.HEADSET);3:Set up a BluetoothProfile.ServiceListener. This listener notifies BluetoothProfile IPC

37、clients when they have been connected to or disconnected from the service.private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener() public void onServiceConnected(int profile, BluetoothProfile proxy) if (profile = BluetoothProfile.HEADSET) mBluetoothHeadset =

38、 (BluetoothHeadset) proxy; public void onServiceDisconnected(int profile) if (profile = BluetoothProfile.HEADSET) mBluetoothHeadset = null; ;4:In onServiceConnected(), get a handle to the profile proxy object.5:Once you have the profile proxy object, you can use it to monitor the state of the connec

39、tion and perform other operations that are relevant to that profile.Android Bluetooth A2DP Profile 基本概念及缩略语A2DP(Advanced Audio Distribute Profile) 它定义了在ACL信道上进行高质量的音频分发的协议和过程 SBC(Low Complexity Subband Codec ) SBC是为蓝牙AV(Audio/Video)应用设计的音频编、解码方式,可以在中等比特率的情况下获得高质量的音频,并且具有低的计算复杂度Stream Stream代表两个A/V设备

40、之间流多媒体数据的端到端的逻辑连接SRC(Source) SRC指的是音频数据流的源端SNK(Sink) SNK指的是音频数据流的接收端SEP(Stream End Point) SEP指出了注册SEP的应用端所具有的服务传输能力和AV能概述A2DP的实现依赖于GAVDP和GAP,在GAVDP中定义了流连接的建立过程,在A2DP中定义流的参数和编、解码过程。典型的应用可以参照下图SRC(信源)端编码后通过微微网把音频数据发送到SNK(信宿)端限制: 1 不支持同步的点对多点的数据分发 2 由于射频信号的传输、数据流的编、解码等,在SRC和SNK之间有延迟(高通参考设计设置为500ms) 3 音

41、频数据速率必须小于蓝牙连接的比特率,AVDTP音频流的状态变化AVDTP中定义了6种状态:。其中,IDLE状态指的是流连接没有IDLE、Configured、OPEN、STREAMING、Closing、Aborting建立但L2CAP信道已经打开;Configured状态指SEP的配置完成; OPEN状态指流连接已经建立;STREAMING状态指参数已经配置完毕,进行流的分发。Closing状态指关闭SEP的状态Aborting状态指Abort流连接 Android系统中,应用程序只能看到AudioSystem这个接口,AudioFlinger是一个实现类,主要用于音频选路和PCM包的混音与

42、重采样,并把PCM数据包传送给底层。AudioFlinger在所有进程中只有一个实体,其他进程如需要访问通过Binder进程间通信的方式进行访问。AudioHardware是一层硬件抽象层,主要负责音频数据的收发与控制。AudioFlinger把他看成实际的硬件。当音频路径设置成A2DP时,通过Bluetooth模块收发数据,通过立体声蓝牙耳机即可听到高保真音乐。AudioAccessory主要用于事件的监听,并把这些事件发送给AudioFlinger模块进行音频路径的重新设定。当蓝牙立体声(监听HCI层的事件),然后把音频路径配置成A2DP模式,这样音频数据就只会发送到蓝耳机匹配之后,Aud

43、ioAccessory会从kernel中获得相应的信息牙耳机当中,如有必要,也可以设置扬声器的音频解码芯片转入休眠状态。A2DP在android的实现当有音频数据播放时,由于SBC音频压缩的开源代码只能压缩512bytes大小的数据因此,AudioHardware每次发送下来4096Bytes,然后把这4096个字节分割成N个512Bytes的小块,放入一个队列当中。经过SBC压缩之后变成113bytes。另外一个线程会每次对SBC压缩好的包进行再封装,封装成一个标准的A2DP packet,然后再把这样的A2DP packet移动到发送队列当中。最后设定好软件定时器,每隔一段时间回发送一个A

44、2DP包。这个时间间隔是SBC编码期间返回的推荐值。A2DP在android的实现Bluetooth HandFree and HeadSet Profile 概念Headset Profile(耳机模式) 这是最常用的配置,为当前流行支持蓝牙耳机与移动电话使用。 它依赖于在64kbt/s编码的音频的CVSD的或PCM以及AT命令从GSM 07.07的一个子集,包括ring,incoming call,hand up以及volume control 。 描述了Bluetooth 耳机如何与计算机或其它 Bluetooth 设备(如手机)通信。连接和配置好后,耳机可以作为远程设备的音频输入和输出

45、接口。 Hand Free Profile(免提模式) 这是常用来让车用免提沟通与车内移动电话。让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支援 。典型配置如汽车使用手机作为AG设备。在车内,立体声系统用于电话音频,而车内安装的麦克风则用于通话时发送输出音频。HFP 还可用于个人计算机在家中或办公环境中作为手机扬声器的情况。但是HFP在不断的维护过程中一直在得到优化,现在已经支持eSCO,提供了更好的音频效果,同时支持了更多的控制命令,包括语音拨号,DTMF tone和车载拨号。大多数HSP蓝牙耳机实现HFP的一部分功能,如使用移动电话最后一个号

46、码重拨,呼叫等待,语音拨号。1:Registration2:Connection set up3:Service level connectionwaiting4:Outgoing callcalling6:Terminate a call process7:Connection release5:Incoming call8:Three way calling9:Audio connection transfer10:Remote Audio Volume ControlHFP State Transition Diagram Head Set 的建链的建链当蓝牙音频网关AG 接收到一个呼叫

47、, 发起与HS 的链接时, 为使应用层语音通信可靠, 需要蓝牙协议栈建立可靠的通信链路。根据蓝牙协议栈运行, 从底层到高层的建链一般要经过以下几个过程:(1) 建立ACL 即基带层的链接;(2) 建立L2CAP 层的链接;(3) 进行SDP 的查询过程;(4) 建立RFCOMM 层的链路;(5) RFCOMM 链路建好后, 将通过RFCOMM 信道传输HeadSet 控制层的一些A T命令;(6) 建立SCO 链接;(7) 根据应用层的动作执行蓝牙HS与AG之间的音频通信。1建立建立ACL 即基带层的链接即基带层的链接AG 接收到一个呼叫时, 首先建立与HS 之间的ACL链接, 此HS 与AG

48、 之间需预先绑定, 或者把原来处于休眠状态下的HS 唤醒。这是通过page 进程完成的, 在用page 进程建立ACL 时, 定义AG 是Master 角色, 于是AG首先发起查询, 通过查询, AG 获得HS 的蓝牙地址。然后AG 在应用层的驱动下向查询到的HS 发起一个page 进程, 当接收到HS 返回的应答时, 这时AG 与HS 之间的ACL 链接已经成功建立。一旦ACL 链接建立, 他可以被用来传送振铃信号。振铃信号的发送是通过AT 命令RING 来完成的。振铃信号也可以在SCO 链路上发送(DTMF tone)。2建立建立L 2CA P 层的链接层的链接ACL 链接好后, 接着建L

49、2CAP 链路. AG 首先在信令信道上发送一个链接请求信令, 要求建立信道标号为0 x0040 的L2CAP(0 x0001 0 x003F 是协议保留不可动态分配的, 0 x0040 0 xFFFF 可以自由分配) , 此信道的PSM (协议服务复用) 标志0001, 当对方返回链接响应信号, 表明0 x0040 信道已经建好。然后对此信道进行配置,配置完信道后, 就可以利用此CID 为0 x0040 的L2CAP 信道进行SDP 查询了。3进行进行SDP 的查询过程的查询过程利用CID 为0 x0040 的L2CAP 信道进行SDP 的查询过程, 首先是AG 在此L2CAP 信道上发送一

50、个SDP 查询包, SDP 查询包将查询SDP 服务器端HS 是否具有所需要的服务。若查询成功, 在ACL 链路上再建一条标号为0 x0041 的L 2CA P 链路, 此信道的PSM 为0003, 用来传输RFCOMM 数据流的。同时断开用作SDP 查询的标号为0 x0040 的L2CAP 链路。Head Set 的建链的建链4建立建立RFCOMM 层的链路层的链路当C ID 为0 x0041的L2CAP 信道建好之后, 接着就是RFCOMM 的建链过程。首先建控制信道, 建链发起方AG 在信道上发送一个数据包, 即要求建RFCOMM 层上的Channel0, 如果响应方HS 希望建立链接,

51、 返回一个命令, 表明已经建立好了Channel0 这条RFCOMM 信道。此信道为控制信道, 用来传送携带控制消息和命令.其次建立数据信道, 先是对数据传送信道的参数进行协商, 协商命令PN 参数包括对将要建立的信道Channel1的优先级, 最大帧长等, 当双方协商好后建立传输数据的信道Channel1。RFCOMM 层的数据信道建好后, 再对HeadSet 控制层的控制命令进行传输。即在数据传送信道Channel1 上传送A T + CKPD= 200 等命令, 当接收到对方的响应OK 之后, 就可以开始建立SCO 链接。5建立建立SCO 链接链接初始化时HC I 发一个WR ITE_

52、VO ICE_ SETT IN G命令, 对音频状态进行设置, 当接收到AG 的建立SCO 链接的请求时, 若HS 允许, 发送一个接收的HC I 命令, 在命令完成之后, 传输音频信号的SCO 链路就建好了, 此时就可以进行语音通信Head Set 的建链的建链HeadsetProfileBluetoothHeadsetServicePhoneAppSettingsBluetoothHandFreeBluetoothHeadsetandroid_bluetooth_headsetBaseHeadsetBaseframeworkJNIAndroid_server_enevtloopRFCOMM

53、kernelAIDLScoSocketBluetoothAudioGetwayBluetoothEventLoopandroid_bluetooth_BluetoothAudioGatewayandroid_bluetooth_SCOSocketJNIJNIJNIJNIIntentAudioManagerSetBluetoothScoOnBluetooth Hand Free 1: Android 实现了对Headset 和Handsfree 两种profile 的支持。其实现核心是BluetoothHeadsetService,在PhoneApp 创建的时候会启动它。if (getSyste

54、mService(Context.BLUETOOTH_SERVICE) != null) mBtHandsfree = new BluetoothHandsfree(this, phone);startService(new Intent(this, BluetoothHeadsetService.class);2:BluetoothHeadsetService 通过接收ENABLED_ACTION、BONDING_CREATED_ACTION , DISABLED_ACTION 和REMOTE_DEVICE_DISCONNECT_REQUESTEDACTION 来改变状态,它也会监听Phon

55、e 的状态变化。3: BluetoothHeadsetService 收到ENABLED_ACTION时,会先向BlueZ注册Headset 和Handsfree两种profile ( 通过执行sdptool 来实现的, 均作为Audio Gateway ),然后让 BluetoothAudioGateway 接收RFCOMM 连接,让BluetoothHandsfree 接收SCO 连接(这些操作都是为了让蓝牙耳机能主动连上Android) if (mAdapter.isEnabled() mAg.start(mIncomingConnectionHandler); mBtHandsfree

56、.onBluetoothEnabled();4: RFCOMM 连接的真正实现是在ConnectionThread 中,它分两步,第一步先通过SDPClient 查询蓝牙设备时候支持Headset 和Handsfree profile,第二步才是去真正建立 RFCOMM 连接。5:当RFCOMM连接成功建立后,BluetoothHeadsetDevice 会收到RFCOMM_CONNECTED消息,它会调用BluetoothHandsfree 来建立SCO 连接,广播通知Headset 状态变化的Intent(PhoneApp 和BluetoothSettings 会接收这个Intent)Bl

57、uetoothHandsfree 会先做一些初始化工作,比如根据是Headset 还是Handsfree 初始化不同的ATParser,并且启动一个接收线程从已建立的RFCOMM 上接收蓝牙耳机过来的控制命令(也就是AT 命令),接着判断如果是在打电话过程中,才去建立SCO 连接来打通数据通道。6:当 SCO 连接成功建立后,BluetoothHandsfree 会收到SCO_CONNECTED 消息,它就会去调用AudioManager setBluetoothScoOn 函数,从而通知音频系统有个蓝牙耳机可用了。到此,Android 完成了和蓝牙耳机的全部连接。Bluetooth PAN

58、Profile功能介绍The Bluetooth PAN feature offers IP support over Bluetooth(L2CAP) , comparable to Wireless LAN on a PC. Participants in a BlueZ PAN can take on the following roles: 1: PAN user (PANU): Client of a NAP or client-type member of a GN.2: NAP: Network Access Point, Acts as proxy, router or bri

59、dge between an existing network infrastructure (typically LAN) and (up to 7 active) wireless clients (PANUs)3:GN: Group ad-hoc Network controller, Forwarding node in a peer-to-peer style network (Bluetooth Piconet). Interconnects up to 7 (active) PANUs to a real peer-to-peer networkPAN的两种模型PANUGNPAN

60、UPANUPANUPANUPANUGN moduleLAN InfrastructureNAPPANUPANUPANUNAP moduleNAP端的模型device0device1device7Devicebnep0bnep1bnep7pan0eth0LAN InfrastructureNAP serverbridgingbridgingbridgingnatingServer端的设置和包安装端的设置和包安装(1)Based on the Ubuntu system1: Install the package list:bluez-compatbridge-utilsdhcp3-server2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论