Chinaunix首页 | 论坛 | 博客
  • 博客访问: 970036
  • 博文数量: 860
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 1464
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-20 19:57
个人简介

对技术执着

文章分类

全部博文(860)

文章存档

2019年(16)

2018年(12)

2015年(732)

2013年(85)

2012年(15)

我的朋友

分类: LINUX

2012-10-17 18:18:00

------------------------------------------------------------------------------------------------------
LCL层是BT的链路控制功能的一部分,它从软件或被命令配置或控制的其他控制器上取命令,然后执行链路控制任务。
蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。
当WLAN设备和蓝牙设备靠得很近并试图同时收发无线信号时就会发生干扰。这两种技术采用不同的方法进行信号传送:载波侦听多路访问(CSMA)和跳频扩频。前者用于802.11b/g收发器,它在发送信号前会侦听空闲信道。所发送的信号带宽大约20MHz,将占用间距为25MHz、最多3个非重叠信道中的一个进行传输。
核心协议:BaseBand、LMP、L2CAP、SDP
基带(BaseBand)协议描述了完成低层链路建立维护和执行基带协议的链路控制器的规范;链路管理协议(Link Manager Protocol)定义了链路的建立与控制的规范,在接收侧信号由解释及过滤;逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol)支持高层协议复用、数据包分段重组、QoS信息服务并获得相应的信息;RFCOMM是ETSITS07.10的子集,提供L2CAP之上的串口防真;TCSBinary定义了在蓝牙设备间建立语音与数据呼叫控制信令;其他的一些协议都是已有的其他组织的协议。
除上述协议层外,规范还定义了主机控制接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口,用以向设备供应商提供像USB和UART(通用异步收发器)的通用接口。绝大多数蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。
在一蓝牙微网(Piconet)中,蓝牙组件分为Master与Slave。其中,开启连接的蓝牙装置称为Master,而其它在Plconet中的蓝牙装置称为Slave。在Piconet建立好后,则Master与Slave的角色可以互换。蓝牙标准使用跳频(FH)技术来作为信号的再调变方式以克服无线通信的多路径衰减及共频道干扰。其中跳频序列与频道接入码由Piconet中Master来决定,而Piconet中也只允许使用一组跳频序列以作为 Master与一个以上的Slave间的通信调变。另外,在蓝牙空中接口中,定义了两种Master与Slave间的链路以建立两者间的连接。分别为点对点同步连接导向链路(SCO)与点对多点异步无连接链路(ACL)。
对于蓝牙的无线接入过程控制器主要分为Standby与Connection两大状态。在这两大状态下又分为传呼(Page)、传呼扫描(Page Scan)、询呼(Inquiry)、与询呼扫描(Inquiry Scan)四大子状态.
http://hi.baidu.com/whyspai/blog/category/Bluetooth
http://hi.baidu.com/anly_jun/blog/category/android%D1%A7%CF%B0
------------------------------------------------------------------------------------------------------
专业术语扫盲:
1.射频:
射频(RF)是Radio Frequency的缩写。表示可以辐射到空间的电磁频率,频率范围从300MHz~30GHz之间。射频简称RF射频就是射频电流,它是一种高频交流变化电磁波的简称。每秒变化小于1000次的交流电称为低频电流,大于10000次的称为高频电流,而射频就是这样一种高频电流。有线电视系统就是采用射频传输方式。在电子学理论中,电流流过导体,导体周围会形成磁场;交变电流(发电机产生电动势随时间变化而做周期性变化,因而用电器中的电流电压也做周期性变化,电路中产生的是交变电流(alternating current),简称交流(AC))通过导体,导体周围会形成交变的电磁场,称为电磁波。在电磁波频率低于100khz时,电磁波会被地表吸收,不能形成有效的传输,但电磁波频率高于100khz时,电磁波可以在空气中传播,并经大气层外缘的电离层反射,形成远距离传输能力,我们把具有远距离传输能力的高频电磁波称为射频,射频技术在无线通信领域中被广泛使用。
2.基带:
Baseband。信源(信息源,也称发终端)发出的没有经过调制(进行频谱搬移和变换)的原始电信号所固有的频带(频率带宽),称为基本频带,简称基带。
3.频带:
frequency band。通俗的说,对信道而言,频带就是允许传送的信号的最高频率与允许传送的信号的最低频率这之间的频率范围(当然要考虑衰减必须在一定范围内)。若两者差别很大,可以认为频带就等于允许传送的信号的最高频率。
TCXO:
TCXO(Temperature Compensate X'tal (crystal) Oscillator)TCXO是一种石英晶体振荡器,通过附加的温度补偿电路来削减由周围温度变化产生的振荡频率变化量。
------------------------------------------------------------------------------------------------------
BCM4330芯片模块介绍:
在手机中我们用到了BCM4330芯片中的这些模块:PCM、UART、TCXO、analog FM receiver interface、FM digital interfaces、radio transceiver。
BCM4330用一个外部晶振(即TCXO)来产生射频和时钟。(TCXO可以进一步减小整个芯片的尺寸大小、电量消耗)
PCM:
PCM提供主/从/混合操作模式与单个或多个编码解码器相连。
UART:
UART接口有一个1040字节的接收和传送FIFO,用来支持EDR(即Enhanced data rate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,达到了2.1Mbps ,是目前蓝牙技术的三倍。因此除了可获得更稳定的音频流传送的更低的耗电量之外,还可充分利用带宽优势同时连接多个蓝牙设备)。CPU或DMA通过AHB接口与FIFO通信。
I2S:
FM数据接收是通过I2S接口。
FM子系统的控制通过BT的HCI接口。
Bluetooth Radio:BCM4330整合了一个radio transceiver。它用来提供低功耗以及与应用程序在ISM频段以2.4GHz的稳定通信。
------------------------------------------------------------------------------------------------------
BT Application
packages/apps/Bluetooth/src/com/
packages/apps/Settings/src/com/broadcom/bt/app/settings/(APP UI - Settings App)
packages/apps/Settings/src/com/android/settings/bluetooth/(APP UI - Settings App)
packages/apps/Phone/src/com/android/phone/(APP UI - Phone App)
BT Framework
frameworks/base/core/java/com/broadcom/bt/service/
frameworks/base/core/java/android/bluetooth/
frameworks/base/services/java/com/android/server/(SystemServer)
frameworks/base/services/java/com/broadcom/bt/server/BrcmBtServiceLoader.java
frameworks/base/core/java/android/server/BluetoothService.java
BT JNI
frameworks/base/core/jni/
BT Hardware
hardware/broadcom/bt/
BT Driver
kernel/drivers/bluetooth/
external/bluetooth/bluez/
------------------------------------------------------------------------------------------------------
Client send data to Server:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/client/OPPClientService.java
Server send data to Client:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/server/OPPServerService.java
TimeoutWatchdog:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/util/TimeoutWatchdog.java
BluetoothServiceManager:
frameworks/base/core/java/com/broadcom/bt/service/framework/BluetoothServiceManager.java
BluetoothEventLoop:
frameworks/base/core/jni/android_server_BluetoothEventLoop.cpp
frameworks/base/core/java/android/server/BluetoothEventLoop.java
BluetoothPBAPService:
frameworks/base/core/java/com/broadcom/bt/service/pbap/BluetoothPBAPService.java
Android Os:
frameworks/base/core/java/android/os/
IBtService
frameworks/base/core/java/com/broadcom/bt/service/framework/IBtService.java
状态栏:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/
frameworks/base/core/java/android/app/StatusBarManager.java
frameworks/base/services/java/com/android/server/StatusBarManagerService.java
CachedBluetoothDevice:
packages/apps/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
BluetoothServiceConfig:
frameworks/base/core/java/com/broadcom/bt/service/framework/
PowerManagerService
frameworks/base/services/jni/com_android_server_PowerManagerService.h
frameworks/base/services/jni/com_android_server_PowerManagerService.cpp
frameworks/base/services/java/com/android/server/PowerManagerService.java
BtOppRfcommListener
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppRfcommListener.java
BT HSHFP
packages/apps/Phone/src/com/android/phone/BluetoothHeadsetService.java
frameworks/base/core/jni/android_bluetooth_HeadsetBase.cpp
定义一些ACTION和BOND的状态(比方log里的 bond state 11 -> 12):
frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
------------------------------------------------------------------------------------------------------
./dalvik/libnativehelper/include/nativehelper/jni.h
/external/dbus/dbus/
Headset Profile (HSP):including the ability to ring, answer a call, hang up and adjust the volume.
Hands-Free Profile (HFP):last number redial, call waiting and voice dialing.
/* Finishing service bluetooth_dun -- call trace */
(frameworks/base/core/java/com/broadcom/bt/service/)
BluetoothServiceManager-->disableService-->_stopService-->svcWrapper.mSvc.stop()-->BluetoothDUNService{stop()-->disableNative()}<------------[Framework]
                            |
                            |                                    
                            |
                            V
    frameworks/base/core/jni/com_broadcom_bt_service_dun_BluetoothDUNService.cpp{disableNative()-->BTL_IFC_CtrlSend}    <------------[JNI]
                            |
                            |                                    
                            |
                            V
        hardware/broadcom/bt/adaptation/btl-if/client/btl_ifc.c{BTL_IFC_CtrlSend-->send()}                <------------[HAL]
/* reference list */
BtServiceWrapper svcWrapper = null;
private static class BtServiceWrapper {
    private IBtService mSvc;       
public abstract class BaseEventLoop implements IBtService
public abstract class BaseService implements IBtService
public class OppEventLoop extends BaseEventLoop implements OppConstants
public final class BluetoothDUNService extends BaseService
------------------------------------------------------------------------------------------------------
RfKill
内核使用 rfkill 模块管理无线设备,rfkill 提供两种类型的用户态接口用于查询和控制无线设备:
1. /dev/rfkill
这是一个标准的 I/O 设备,可以使用标准的 open(), close() ioctl() 等操作查询和控制每个无线设备的状态,相关的头文件 /usr/include/linux/rfkill.h
2. /sys/class/rfkill/
每个 rfkill 设备会在 sysfs 中创建自己的一个节点,都有下面文件:
name : 接口或驱动名称,注册 rfkill 设备时指定。
type : 设备类型, wlan | bluethooth …
persistent : 从外存谋取的软限制状态
state : 当前的无线设备状态
0 : RFKILL_STATE_SOFT_BLOCKED    被软件关闭
1 : RFKILL_STATE_UNBLOCKED     开启
2 : RFKILL_STATE_HARD_BLOCKED    被硬件驱动关闭
设备禁用类型
软件禁用,由用户态应用程序触发,并通过 rfkill 接口关闭无线设备。
硬件驱动禁用,由内核硬件驱动程序触发的关闭,硬件驱动程序(平台驱动)调用 rfkill 接口通知硬件被关闭。
implementation:
./kernel/net/rfkill
rfkill mechanism is introduced in Linux kernel 2.6.29.
http://www.mjmwired.net/kernel/Documentation/rfkill.txt is an introduction about rfkill.
That is, while Google released kernel 2.6.29, you have to use rfkill to control BT power.
In android\system\bluetooth\bluedroid\bluetooth.c, it shows that it uses rfkill to turn on power not the previous version with "echo 1 > /sys/module/bluetooth_power/parameters/power"
android\kernel\drivers\bluetooth\bluetooth-power.c is the kernel driver to register rfkill mechanism.
Function bluetooth_power in android\kernel\arch\arm\mach-msm\board-xxxx.c is the entry point to control BT power related configuration.
Now, we removed the control over "/sys/module/bluetooth_power/parameters/power" and the only way to control BT power is to do it over rfkill.
For debugging purpose, here shows the same procedures in bluedroid\bluetooth.c to turn on BT power over adb shell
# cd /sys/class/rfkill
cd /sys/class/rfkill
# ls
ls
rfkill0
# cd rfkill0
cd rfkill0
# cat type
cat type
bluetooth
# cat state
cat state
0
# echo 1 > state
echo 1 > state
# cat state
cat state
1
------------------------------------------------------------------------------------------------------
hcid - Bluetooth Host Controller Interface Daemon
The hcid daemon manages all the Bluetooth devices. hcid itself does not accept many command-line options, as most of its configuration is done in the hcid.conf file, which has its own man page. hcid can also provide a number of services via the D-BUS message bus system.
hciattach - attach serial devices via UART HCI to BlueZ stack
Hciattach is used to attach a serial UART to the Bluetooth stack as HCI transport interface.
在当前项目中,bt的hciattach是这样启动的:
service hciattach /system/bin/brcm_patchram_plus  --enable_hci --enable_lpm --patchram /etc/firmware/bcm4330.hcd /dev/ttyHS0 -d
user root
group root
disabled
brcm_patchram_plus的实现位于目录system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c。
**  Description:   This program downloads a patchram files in the HCD format
**                 to Broadcom Bluetooth based silicon and combo chips and
**                                 and other utility functions.
**
**                 It can be invoked from the command line in the form
**                                              <-d> to print a debug log
**                                              <--patchram patchram_file>
**                                              <--baudrate baud_rate>
**                                              <--bd_addr bd_address>
**                                              <--enable_lpm>
**                                              <--enable_hci>
**                                              uart_device_name
------------------------------------------------------------------------------------------------------
BT:
HCI提供一些通用控制接口和命令。在扫描设备阶段,BT协议栈根据具体协议通过HCI发送命令来获得设备的MAC地址。BluetoothEventLoop,开启Event Loop线程,用来从/org/freedesktop/DBus接收信号。开启BluetoothService、BluetoothServiceManager服务。OppEventLoop,Starting OPP Event Loop as Standalone。OppEventHandler.cpp接收来自/org/freedesktop/DBus的信号。Load OppApplication,调用ExchangeFolderManager检查/mnt/sdcard/bluetooth/下面的文件夹,然后为每一个子目录Registering file observer。
SystemServer
BluetoothService
BluetoothA2dpService
BluetoothHIDService
一个Service对应一个profile,比如BluetoothHIDService对应HID profile。BluetoothService管理所有的profile。
zygote
dbus
btld
bluetoothd
SystemServer 是 Android Java 层的系统服务模块,这个模块主要功能就是管理供 Android 应用开发的 system service.
init.rc 文件一行service zygote /system/bin/app_process -Xzygote /system/bin –zygote –start-system-server启动SystemServer.zygote 进程是整个 Android 的孵化器进程,所有的 Activity 进程均是通过它来生成的。在 zygote 进程启动过程中指定了这么一个参数“– start-system-server” ,这个参数就是在 zygote 进程启动的同时启动 SystemServer 。
------------------------------------------------------------------------------------------------------
bluetooth profile
        Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用,你可以把Profile理解为连接层或者应用层协议。
        比如,如果一家公司希望它们的Bluetooth芯片支援所有的Bluetooth耳机,那么它只要支持HeadSet Profile即可,而无须考虑该芯片与其它Bluetooth设备的通讯与兼容性问题。如果你想购买Bluetooth产品,你应该了解你的应用需要哪些Profile来完成,并且确保你购买的Bluetooth产品支持这些Profile。
        在所有的Profile中,有四种是基本的Profile,这些Profile会被其它的Profile使用。它们是:
        GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
        SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
        SPP Profile: Serial Port Profile,模拟串口通讯
        GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象。
        另外,Bluetooth还定义了9种应用(usage)Profile。
        CTP Profile: Cordless Telephone Profile,无绳电话。
        IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的兰牙设备变成廉价的对讲机。
        HS Profile: HeadSet Profile,用于连接耳机。
        DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
        FP Profile: Fax Profile,传真功能。
        LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
        OPP Profile: Object Push Profile,用于设备之间传输数据对象。
        FTP Profile: File Transfer Profile,用于文件传输。
        SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性。
Bluetooth的Profile问题是相当复杂的,这些Profile规范在全部的Bluetooth规范中占有了400页的内容。
------------------------------------------------------------------------------------------------------
kernel/arch/arm/mach-fsm/generic_gpio.c
kernel/arch/arm/mach-fsm/gpio_chip.h
kernel/arch/arm/mach-u300/gpio.c
------------------------------------------------------------------------------------------------------
support bluetooth 步骤:
1.kernel/arch/arm/configs/msm7630-xxx-perf_defconfig(make kernelconfig)
CONFIG_BCM4330_POWER=y
2.kernel/arch/arm/mach-msm/Kconfig
config BCM4330_POWER
depends on (MACH_MSM7X30_xxx)
bool "BCM4330 Power Monitor Interface"
default n
---help---
BCM4330 power controle interface.
3.arch/arm/mach-msm/board-msm7x30-xxx.c
编写上电相关的函数,例如bluetooth_power,这其中要涉及到GPIO引脚的配置;配置休眠相关的resources,比如gpio上的哪个引脚是bt_wake_msm,哪个是msm_wake_bt。
4.启动hciattach服务
system/core/rootdir/etc/init.qcom.rc
service hciattach /system/bin/brcm_patchram_plus  --enable_hci --enable_lpm --patchram /etc/firmware/bcm4330.hcd /dev/ttyHS0 -d
user root
group root
disabled
对于init中参数的含义参考system/core/init/readme.txt文件。对于brcm_patchram_plus后面参数的含义参考system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c。
5.在BoardConfig.mk中添加相关信息:
device/qcom/msm7630_xxx/BoardConfig.mk
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
BT_ALT_STACK := true
BRCM_BT_USE_BTL_IF := true
BRCM_BTL_INCLUDE_A2DP := true
6.如果出问题,检查以下文件:
kernel/driver/bluesleep/bluesleep.c
system/bluetooth/bluedroid/bluetooth.c
system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c
system/core/rootdir/etc/init.qcom.rc
------------------------------------------------------------------------------------------------------
Android上蓝牙Profile的简单实现流程:
Google的Android只实现了Headset/Handfree和A2DP/AVRCP等Profile,而其它常用的Profile如 HID/DUN/SPP/OPP/FTP/PAN等却没有实现,并且Google方面关于何时实现也没有一个时间表。前段时间我实现了HID/DUN /SPP三个Profile,下一步实现OPP/FTP等Profile。具体的开发其实也简单,我是参照A2DP的代码进行的相关Profile的实现。Android的Handset/Handfree的实现方式和A2DP/AVRCP的方式有很大的不同,Handset/Handfree是直接在 bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,所以大大降低了实现的难度。其实bluez的audio plugin上也有Handset/Handfree的实现,但不知道为什么Google没有用它,而要在RFCOMM Socket上自己实现一个,这使得Handset/Handfree的实现显得比较复杂。
HID要用到bluez的input plugin,Android已经把它编译进去了,在system/lib/bluez-plugin/input.so下,与input.so一起的还有audio.so库,那是供A2DP/AVRCP用的。参照frameworks/base/core/jni/android_server_BluetoothA2dpService.cpp,自己写一个HID用的的.cpp文件,其中跟A2DP一样利用 DBUS调用input.so库的CreateDevice/Connect/Disconnect等函数,具体源码在external/bluez/utils/input/manager.c和external/bluez/utils/input/device.c中。然后参照 frameworks/base/core/java/android/server/BluetoothA2dpService.java和 frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java及 frameworks/base/core/java/android/bluetooth/IBluetoothA2dp.aidl,自己分别写两个 JAVA类及AIDL接口,余下的就是在packages/apps/Settings/src/com/android/settings/bluetooth目录下的各个文件的修改了,比较省事的方法是搜一下A2DP,只要是A2DP要修改的地方照葫芦画瓢添加修改就是了。
DUN/SPP要用到bluez的serial plugin,因Android没有编译进去,所以要在external/bluez/utils/serial目录下写一个Android.mk,把它编译进去,生成system/lib/bluez-plugin/serial.so库,其它的跟HID类似。
------------------------------------------------------------------------------------------------------
蓝牙各版本之间的区别:
1.1/1.2 可以支持 Stereo 音效的传输要求,但只能够作(单工)方式工作。
2.0 传输率约在 1.8M/s~2.1M/s,可以有(双工)的工作方式。即一面作语音通讯,同时亦可以传输档案/高质素图片。缺点是配置流程复杂和设备功耗较大。
2.1+EDR 主要是解决2.0的缺点。改进过后的连接方式则是会自动使用数字密码来进行配对与连接,举例来说,只要在手机选项中选择连接特定装置,在确定之后,手机会自动列出目前环境中可使用的设备,并且自动进行连结;   蓝牙2.1版加入了Sniff Subrating的功能,透过设定在2个装置之间互相确认讯号的发送间隔来达到节省功耗的目的。一般来说,当2个进行连结的蓝牙装置进入待机状态之后,蓝牙装置之间仍需要透过相互的呼叫来确定彼此是否仍在联机状态,当然,也因为这样,蓝牙芯片就必须随时保持在工作状态,即使手机的其它组件都已经进入休眠模式。为了改善了这样这样的状况,蓝牙2.1将装置之间相互确认的讯号发送时间间隔从旧版的0.1秒延长到0.5秒左右,如此可以让蓝牙芯片的工作负载大幅降低,也可让蓝牙可以有更多的时间可以彻底休眠。根据官方的报告,采用此技术之后,蓝牙装置在开启蓝牙联机之后的待机时间可以有效延长5倍以上。
3.0 核心是"Generic Alternate MAC/PHY"(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。通过集成"802.11 PAL"(协议适应层),蓝牙3.0的数据传输率提高到了大约24Mbps,是2.0的8倍。功耗方面,通过蓝牙3.0高速传送大量数据自然会消耗更多能量,但由于引入了增强电源控制(EPC)机制,再辅以802.11,实际空闲功耗会明显降低,蓝牙设备的待机耗电问题有望得到初步解决。此外,新的规范还具备通用测试方法(GTM)和单向广播无连接数据(UCD)两项技术,并且包括了一组HCI指令以获取密钥长度。
4.0 实际是个三位一体的蓝牙技术,它将三种规格合而为一,分别是传统蓝牙、低功耗蓝牙和高速蓝牙技术,这三个规格可以组合或者单独使用。改进之处主要体现在三个方面,电池续航时间、节能和设备种类上。拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多特色。
容易混的profile:
FTP:
浏览其他设备上的文件或文件夹或目录树。这里的设备不仅仅是手机,包括PC等。
在设备之间传输文件或文件夹。
修改另一个设备上的文件或文件夹,包括删除或创建。
OPP:
Object Push
Business Card Pull
Business Card Exchange
pull/push名片(business card/vcard)或约会(appointment)。
交换名片或约会,交换的意思就是a push of a business card followed by a pull of a
business card.
PBAP:
It is based on a Client-Server interaction model where the Client device pulls phone book objects from the Server device.
注意这里是基于C-S的,client从server上pull phone book,而且并未提到其他操作。
可以浏览另一个设备上的phone book,但不可以做修改。
与OPP结合可以实现pull phone book from a server device.
------------------------------------------------------------------------------------------------------
external/dbus/dbus/dbus-protocol.h
external/bluetooth/bluez/doc/
各个interface(比如org.bluez.device)中含有哪些方法。
/data/data/com.android.settings/shared_prefs/bluetooth_settings.xml
DBUS_ERROR_UNKNOWN_METHOD
------------------------------------------------------------------------------------------------------
OPP(transfer file)
OppEventHandler:
frameworks/base/core/jni/com_broadcom_bt_service_opp_OppEventHandler.cpp
BtOppTransfer
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppTransfer.java
BluetoothService:
frameworks/base/core/jni/android_server_BluetoothService.cpp
frameworks/base/core/java/android/server/BluetoothService.java
BtOppObexServer
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java
BtOpp ObexClient
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java
BtOpp Service
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppService.java
Obex ServerOperation
frameworks/base/obex/javax/obex/ServerOperation.java
ResponseCodes class contains the list of valid response codes a server may send to a client.
frameworks/base/obex/javax/obex/ResponseCodes.java
------------------------------------------------------------------------------------------------------

------------------------------------------------------------------------------------------------------
LCL层是BT的链路控制功能的一部分,它从软件或被命令配置或控制的其他控制器上取命令,然后执行链路控制任务。

蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。

当WLAN设备和蓝牙设备靠得很近并试图同时收发无线信号时就会发生干扰。这两种技术采用不同的方法进行信号传送:载波侦听多路访问(CSMA)和跳频扩频。前者用于802.11b/g收发器,它在发送信号前会侦听空闲信道。所发送的信号带宽大约20MHz,将占用间距为25MHz、最多3个非重叠信道中的一个进行传输。

核心协议:BaseBand、LMP、L2CAP、SDP
基带(BaseBand)协议描述了完成低层链路建立维护和执行基带协议的链路控制器的规范;链路管理协议(Link Manager Protocol)定义了链路的建立与控制的规范,在接收侧信号由解释及过滤;逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol)支持高层协议复用、数据包分段重组、QoS信息服务并获得相应的信息;RFCOMM是ETSITS07.10的子集,提供L2CAP之上的串口防真;TCSBinary定义了在蓝牙设备间建立语音与数据呼叫控制信令;其他的一些协议都是已有的其他组织的协议。
除上述协议层外,规范还定义了主机控制接口(HCI),它为基带控制器、连接管理器、硬件状态和控制寄存器提供命令接口,用以向设备供应商提供像USB和UART(通用异步收发器)的通用接口。绝大多数蓝牙设备都需要核心协议(加上无线部分),而其他协议则根据应用的需要而定。

在一蓝牙微网(Piconet)中,蓝牙组件分为Master与Slave。其中,开启连接的蓝牙装置称为Master,而其它在Plconet中的蓝牙装置称为Slave。在Piconet建立好后,则Master与Slave的角色可以互换。蓝牙标准使用跳频(FH)技术来作为信号的再调变方式以克服无线通信的多路径衰减及共频道干扰。其中跳频序列与频道接入码由Piconet中Master来决定,而Piconet中也只允许使用一组跳频序列以作为 Master与一个以上的Slave间的通信调变。另外,在蓝牙空中接口中,定义了两种Master与Slave间的链路以建立两者间的连接。分别为点对点同步连接导向链路(SCO)与点对多点异步无连接链路(ACL)。
对于蓝牙的无线接入过程控制器主要分为Standby与Connection两大状态。在这两大状态下又分为传呼(Page)、传呼扫描(Page Scan)、询呼(Inquiry)、与询呼扫描(Inquiry Scan)四大子状态.
http://hi.baidu.com/whyspai/blog/category/Bluetooth
http://hi.baidu.com/anly_jun/blog/category/android%D1%A7%CF%B0
------------------------------------------------------------------------------------------------------
专业术语扫盲:

1.射频:
射频(RF)是Radio Frequency的缩写。表示可以辐射到空间的电磁频率,频率范围从300MHz~30GHz之间。射频简称RF射频就是射频电流,它是一种高频交流变化电磁波的简称。每秒变化小于1000次的交流电称为低频电流,大于10000次的称为高频电流,而射频就是这样一种高频电流。有线电视系统就是采用射频传输方式。在电子学理论中,电流流过导体,导体周围会形成磁场;交变电流(发电机产生电动势随时间变化而做周期性变化,因而用电器中的电流电压也做周期性变化,电路中产生的是交变电流(alternating current),简称交流(AC))通过导体,导体周围会形成交变的电磁场,称为电磁波。在电磁波频率低于100khz时,电磁波会被地表吸收,不能形成有效的传输,但电磁波频率高于100khz时,电磁波可以在空气中传播,并经大气层外缘的电离层反射,形成远距离传输能力,我们把具有远距离传输能力的高频电磁波称为射频,射频技术在无线通信领域中被广泛使用。

2.基带:
Baseband。信源(信息源,也称发终端)发出的没有经过调制(进行频谱搬移和变换)的原始电信号所固有的频带(频率带宽),称为基本频带,简称基带。

3.频带:
frequency band。通俗的说,对信道而言,频带就是允许传送的信号的最高频率与允许传送的信号的最低频率这之间的频率范围(当然要考虑衰减必须在一定范围内)。若两者差别很大,可以认为频带就等于允许传送的信号的最高频率。

TCXO:
TCXO(Temperature Compensate X'tal (crystal) Oscillator)TCXO是一种石英晶体振荡器,通过附加的温度补偿电路来削减由周围温度变化产生的振荡频率变化量。
------------------------------------------------------------------------------------------------------
BCM4330芯片模块介绍:

在手机中我们用到了BCM4330芯片中的这些模块:PCM、UART、TCXO、analog FM receiver interface、FM digital interfaces、radio transceiver。

BCM4330用一个外部晶振(即TCXO)来产生射频和时钟。(TCXO可以进一步减小整个芯片的尺寸大小、电量消耗)

PCM:
PCM提供主/从/混合操作模式与单个或多个编码解码器相连。

UART:
UART接口有一个1040字节的接收和传送FIFO,用来支持EDR(即Enhanced data rate,是蓝牙技术中增强速率的缩写,其特色是大大提高了蓝牙技术的数据传输速率,达到了2.1Mbps ,是目前蓝牙技术的三倍。因此除了可获得更稳定的音频流传送的更低的耗电量之外,还可充分利用带宽优势同时连接多个蓝牙设备)。CPU或DMA通过AHB接口与FIFO通信。

I2S:
FM数据接收是通过I2S接口。

FM子系统的控制通过BT的HCI接口。

Bluetooth Radio:BCM4330整合了一个radio transceiver。它用来提供低功耗以及与应用程序在ISM频段以2.4GHz的稳定通信。
------------------------------------------------------------------------------------------------------
BT Application
packages/apps/Bluetooth/src/com/
packages/apps/Settings/src/com/broadcom/bt/app/settings/(APP UI - Settings App)
packages/apps/Settings/src/com/android/settings/bluetooth/(APP UI - Settings App)
packages/apps/Phone/src/com/android/phone/(APP UI - Phone App)

BT Framework
frameworks/base/core/java/com/broadcom/bt/service/
frameworks/base/core/java/android/bluetooth/
frameworks/base/services/java/com/android/server/(SystemServer)
frameworks/base/services/java/com/broadcom/bt/server/BrcmBtServiceLoader.java
frameworks/base/core/java/android/server/BluetoothService.java

BT JNI
frameworks/base/core/jni/

BT Hardware
hardware/broadcom/bt/

BT Driver
kernel/drivers/bluetooth/
external/bluetooth/bluez/
------------------------------------------------------------------------------------------------------
Client send data to Server:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/client/OPPClientService.java

Server send data to Client:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/server/OPPServerService.java

TimeoutWatchdog:
packages/apps/Bluetooth/src/com/broadcom/bt/app/opp/util/TimeoutWatchdog.java

BluetoothServiceManager:
frameworks/base/core/java/com/broadcom/bt/service/framework/BluetoothServiceManager.java

BluetoothEventLoop:
frameworks/base/core/jni/android_server_BluetoothEventLoop.cpp
frameworks/base/core/java/android/server/BluetoothEventLoop.java

BluetoothPBAPService:
frameworks/base/core/java/com/broadcom/bt/service/pbap/BluetoothPBAPService.java

Android Os:
frameworks/base/core/java/android/os/

IBtService
frameworks/base/core/java/com/broadcom/bt/service/framework/IBtService.java

状态栏:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/
frameworks/base/core/java/android/app/StatusBarManager.java
frameworks/base/services/java/com/android/server/StatusBarManagerService.java

CachedBluetoothDevice:
packages/apps/Settings/src/com/android/settings/bluetooth/CachedBluetoothDevice.java

BluetoothServiceConfig:
frameworks/base/core/java/com/broadcom/bt/service/framework/

PowerManagerService
frameworks/base/services/jni/com_android_server_PowerManagerService.h
frameworks/base/services/jni/com_android_server_PowerManagerService.cpp
frameworks/base/services/java/com/android/server/PowerManagerService.java

BtOppRfcommListener
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppRfcommListener.java

BT HSHFP
packages/apps/Phone/src/com/android/phone/BluetoothHeadsetService.java
frameworks/base/core/jni/android_bluetooth_HeadsetBase.cpp

定义一些ACTION和BOND的状态(比方log里的 bond state 11 -> 12):
frameworks/base/core/java/android/bluetooth/BluetoothDevice.java
------------------------------------------------------------------------------------------------------
./dalvik/libnativehelper/include/nativehelper/jni.h
/external/dbus/dbus/

Headset Profile (HSP):including the ability to ring, answer a call, hang up and adjust the volume.
Hands-Free Profile (HFP):last number redial, call waiting and voice dialing.

/* Finishing service bluetooth_dun -- call trace */

(frameworks/base/core/java/com/broadcom/bt/service/)
BluetoothServiceManager-->disableService-->_stopService-->svcWrapper.mSvc.stop()-->BluetoothDUNService{stop()-->disableNative()}<------------[Framework]
                            |
                            |                                    
                            |
                            V
    frameworks/base/core/jni/com_broadcom_bt_service_dun_BluetoothDUNService.cpp{disableNative()-->BTL_IFC_CtrlSend}    <------------[JNI]
                            |
                            |                                    
                            |
                            V
        hardware/broadcom/bt/adaptation/btl-if/client/btl_ifc.c{BTL_IFC_CtrlSend-->send()}                <------------[HAL]

/* reference list */
BtServiceWrapper svcWrapper = null;
private static class BtServiceWrapper {
    private IBtService mSvc;       

public abstract class BaseEventLoop implements IBtService
public abstract class BaseService implements IBtService

public class OppEventLoop extends BaseEventLoop implements OppConstants
public final class BluetoothDUNService extends BaseService
------------------------------------------------------------------------------------------------------
RfKill
内核使用 rfkill 模块管理无线设备,rfkill 提供两种类型的用户态接口用于查询和控制无线设备:
1. /dev/rfkill
这是一个标准的 I/O 设备,可以使用标准的 open(), close() ioctl() 等操作查询和控制每个无线设备的状态,相关的头文件 /usr/include/linux/rfkill.h

2. /sys/class/rfkill/
每个 rfkill 设备会在 sysfs 中创建自己的一个节点,都有下面文件:

name : 接口或驱动名称,注册 rfkill 设备时指定。
type : 设备类型, wlan | bluethooth …
persistent : 从外存谋取的软限制状态
state : 当前的无线设备状态
0 : RFKILL_STATE_SOFT_BLOCKED    被软件关闭
1 : RFKILL_STATE_UNBLOCKED     开启
2 : RFKILL_STATE_HARD_BLOCKED    被硬件驱动关闭
设备禁用类型

软件禁用,由用户态应用程序触发,并通过 rfkill 接口关闭无线设备。
硬件驱动禁用,由内核硬件驱动程序触发的关闭,硬件驱动程序(平台驱动)调用 rfkill 接口通知硬件被关闭。

implementation:
./kernel/net/rfkill

rfkill mechanism is introduced in Linux kernel 2.6.29.
http://www.mjmwired.net/kernel/Documentation/rfkill.txt is an introduction about rfkill.
That is, while Google released kernel 2.6.29, you have to use rfkill to control BT power.
In android\system\bluetooth\bluedroid\bluetooth.c, it shows that it uses rfkill to turn on power not the previous version with "echo 1 > /sys/module/bluetooth_power/parameters/power"

android\kernel\drivers\bluetooth\bluetooth-power.c is the kernel driver to register rfkill mechanism.
Function bluetooth_power in android\kernel\arch\arm\mach-msm\board-xxxx.c is the entry point to control BT power related configuration.

Now, we removed the control over "/sys/module/bluetooth_power/parameters/power" and the only way to control BT power is to do it over rfkill.
For debugging purpose, here shows the same procedures in bluedroid\bluetooth.c to turn on BT power over adb shell
# cd /sys/class/rfkill
cd /sys/class/rfkill
# ls
ls
rfkill0
# cd rfkill0
cd rfkill0
# cat type
cat type
bluetooth
# cat state
cat state
0
# echo 1 > state
echo 1 > state
# cat state
cat state
1
------------------------------------------------------------------------------------------------------
hcid - Bluetooth Host Controller Interface Daemon
The hcid daemon manages all the Bluetooth devices. hcid itself does not accept many command-line options, as most of its configuration is done in the hcid.conf file, which has its own man page. hcid can also provide a number of services via the D-BUS message bus system.

hciattach - attach serial devices via UART HCI to BlueZ stack
Hciattach is used to attach a serial UART to the Bluetooth stack as HCI transport interface.

在当前项目中,bt的hciattach是这样启动的:
service hciattach /system/bin/brcm_patchram_plus  --enable_hci --enable_lpm --patchram /etc/firmware/bcm4330.hcd /dev/ttyHS0 -d
user root
group root
disabled

brcm_patchram_plus的实现位于目录system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c。

**  Description:   This program downloads a patchram files in the HCD format
**                 to Broadcom Bluetooth based silicon and combo chips and
**                                 and other utility functions.
**
**                 It can be invoked from the command line in the form
**                                              <-d> to print a debug log
**                                              <--patchram patchram_file>
**                                              <--baudrate baud_rate>
**                                              <--bd_addr bd_address>
**                                              <--enable_lpm>
**                                              <--enable_hci>
**                                              uart_device_name
------------------------------------------------------------------------------------------------------
BT:
HCI提供一些通用控制接口和命令。在扫描设备阶段,BT协议栈根据具体协议通过HCI发送命令来获得设备的MAC地址。BluetoothEventLoop,开启Event Loop线程,用来从/org/freedesktop/DBus接收信号。开启BluetoothService、BluetoothServiceManager服务。OppEventLoop,Starting OPP Event Loop as Standalone。OppEventHandler.cpp接收来自/org/freedesktop/DBus的信号。Load OppApplication,调用ExchangeFolderManager检查/mnt/sdcard/bluetooth/下面的文件夹,然后为每一个子目录Registering file observer。

SystemServer
BluetoothService
BluetoothA2dpService
BluetoothHIDService
一个Service对应一个profile,比如BluetoothHIDService对应HID profile。BluetoothService管理所有的profile。

zygote
dbus
btld
bluetoothd
SystemServer 是 Android Java 层的系统服务模块,这个模块主要功能就是管理供 Android 应用开发的 system service.
init.rc 文件一行service zygote /system/bin/app_process -Xzygote /system/bin –zygote –start-system-server启动SystemServer.zygote 进程是整个 Android 的孵化器进程,所有的 Activity 进程均是通过它来生成的。在 zygote 进程启动过程中指定了这么一个参数“– start-system-server” ,这个参数就是在 zygote 进程启动的同时启动 SystemServer 。
------------------------------------------------------------------------------------------------------
bluetooth profile
        Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用,你可以把Profile理解为连接层或者应用层协议。

        比如,如果一家公司希望它们的Bluetooth芯片支援所有的Bluetooth耳机,那么它只要支持HeadSet Profile即可,而无须考虑该芯片与其它Bluetooth设备的通讯与兼容性问题。如果你想购买Bluetooth产品,你应该了解你的应用需要哪些Profile来完成,并且确保你购买的Bluetooth产品支持这些Profile。

        在所有的Profile中,有四种是基本的Profile,这些Profile会被其它的Profile使用。它们是:
        GAP Profile: Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
        SDAP Profile: Service Discovery Application Profile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
        SPP Profile: Serial Port Profile,模拟串口通讯
        GOEP Profile: Generic Object Exchange Profile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象。

        另外,Bluetooth还定义了9种应用(usage)Profile。

        CTP Profile: Cordless Telephone Profile,无绳电话。
        IP Profile: Intercom Profile,这是在两个设备之间建立语音连接,换句话说,把两个昂贵的兰牙设备变成廉价的对讲机。
        HS Profile: HeadSet Profile,用于连接耳机。
        DNP Profile: Dial-up Networking Profile,用于为PC提供拨号网络功能。
        FP Profile: Fax Profile,传真功能。
        LAP Profile: LAN Access Profile,使用PPP协议建立局域网。
        OPP Profile: Object Push Profile,用于设备之间传输数据对象。
        FTP Profile: File Transfer Profile,用于文件传输。
        SP Profile: Synchronization Profile,用于不同的Bluetooth设备同步,保持数据的一致性。

Bluetooth的Profile问题是相当复杂的,这些Profile规范在全部的Bluetooth规范中占有了400页的内容。
------------------------------------------------------------------------------------------------------
kernel/arch/arm/mach-fsm/generic_gpio.c
kernel/arch/arm/mach-fsm/gpio_chip.h
kernel/arch/arm/mach-u300/gpio.c
------------------------------------------------------------------------------------------------------
support bluetooth 步骤:
1.kernel/arch/arm/configs/msm7630-xxx-perf_defconfig(make kernelconfig)
CONFIG_BCM4330_POWER=y

2.kernel/arch/arm/mach-msm/Kconfig
config BCM4330_POWER
depends on (MACH_MSM7X30_xxx)
bool "BCM4330 Power Monitor Interface"
default n
---help---
BCM4330 power controle interface.

3.arch/arm/mach-msm/board-msm7x30-xxx.c
编写上电相关的函数,例如bluetooth_power,这其中要涉及到GPIO引脚的配置;配置休眠相关的resources,比如gpio上的哪个引脚是bt_wake_msm,哪个是msm_wake_bt。

4.启动hciattach服务
system/core/rootdir/etc/init.qcom.rc
service hciattach /system/bin/brcm_patchram_plus  --enable_hci --enable_lpm --patchram /etc/firmware/bcm4330.hcd /dev/ttyHS0 -d
user root
group root
disabled
对于init中参数的含义参考system/core/init/readme.txt文件。对于brcm_patchram_plus后面参数的含义参考system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c。

5.在BoardConfig.mk中添加相关信息:
device/qcom/msm7630_xxx/BoardConfig.mk
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_BCM := true
BT_ALT_STACK := true
BRCM_BT_USE_BTL_IF := true
BRCM_BTL_INCLUDE_A2DP := true

6.如果出问题,检查以下文件:
kernel/driver/bluesleep/bluesleep.c
system/bluetooth/bluedroid/bluetooth.c
system/bluetooth/brcm_patchram_plus/brcm_patchram_plus.c
system/core/rootdir/etc/init.qcom.rc
------------------------------------------------------------------------------------------------------
Android上蓝牙Profile的简单实现流程:
Google的Android只实现了Headset/Handfree和A2DP/AVRCP等Profile,而其它常用的Profile如 HID/DUN/SPP/OPP/FTP/PAN等却没有实现,并且Google方面关于何时实现也没有一个时间表。前段时间我实现了HID/DUN /SPP三个Profile,下一步实现OPP/FTP等Profile。具体的开发其实也简单,我是参照A2DP的代码进行的相关Profile的实现。Android的Handset/Handfree的实现方式和A2DP/AVRCP的方式有很大的不同,Handset/Handfree是直接在 bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,所以大大降低了实现的难度。其实bluez的audio plugin上也有Handset/Handfree的实现,但不知道为什么Google没有用它,而要在RFCOMM Socket上自己实现一个,这使得Handset/Handfree的实现显得比较复杂。

HID要用到bluez的input plugin,Android已经把它编译进去了,在system/lib/bluez-plugin/input.so下,与input.so一起的还有audio.so库,那是供A2DP/AVRCP用的。参照frameworks/base/core/jni/android_server_BluetoothA2dpService.cpp,自己写一个HID用的的.cpp文件,其中跟A2DP一样利用 DBUS调用input.so库的CreateDevice/Connect/Disconnect等函数,具体源码在external/bluez/utils/input/manager.c和external/bluez/utils/input/device.c中。然后参照 frameworks/base/core/java/android/server/BluetoothA2dpService.java和 frameworks/base/core/java/android/bluetooth/BluetoothA2dp.java及 frameworks/base/core/java/android/bluetooth/IBluetoothA2dp.aidl,自己分别写两个 JAVA类及AIDL接口,余下的就是在packages/apps/Settings/src/com/android/settings/bluetooth目录下的各个文件的修改了,比较省事的方法是搜一下A2DP,只要是A2DP要修改的地方照葫芦画瓢添加修改就是了。

DUN/SPP要用到bluez的serial plugin,因Android没有编译进去,所以要在external/bluez/utils/serial目录下写一个Android.mk,把它编译进去,生成system/lib/bluez-plugin/serial.so库,其它的跟HID类似。
------------------------------------------------------------------------------------------------------

蓝牙各版本之间的区别:
1.1/1.2 可以支持 Stereo 音效的传输要求,但只能够作(单工)方式工作。

2.0 传输率约在 1.8M/s~2.1M/s,可以有(双工)的工作方式。即一面作语音通讯,同时亦可以传输档案/高质素图片。缺点是配置流程复杂和设备功耗较大。

2.1+EDR 主要是解决2.0的缺点。改进过后的连接方式则是会自动使用数字密码来进行配对与连接,举例来说,只要在手机选项中选择连接特定装置,在确定之后,手机会自动列出目前环境中可使用的设备,并且自动进行连结;   蓝牙2.1版加入了Sniff Subrating的功能,透过设定在2个装置之间互相确认讯号的发送间隔来达到节省功耗的目的。一般来说,当2个进行连结的蓝牙装置进入待机状态之后,蓝牙装置之间仍需要透过相互的呼叫来确定彼此是否仍在联机状态,当然,也因为这样,蓝牙芯片就必须随时保持在工作状态,即使手机的其它组件都已经进入休眠模式。为了改善了这样这样的状况,蓝牙2.1将装置之间相互确认的讯号发送时间间隔从旧版的0.1秒延长到0.5秒左右,如此可以让蓝牙芯片的工作负载大幅降低,也可让蓝牙可以有更多的时间可以彻底休眠。根据官方的报告,采用此技术之后,蓝牙装置在开启蓝牙联机之后的待机时间可以有效延长5倍以上。

3.0 核心是"Generic Alternate MAC/PHY"(AMP),这是一种全新的交替射频技术,允许蓝牙协议栈针对任一任务动态地选择正确射频。通过集成"802.11 PAL"(协议适应层),蓝牙3.0的数据传输率提高到了大约24Mbps,是2.0的8倍。功耗方面,通过蓝牙3.0高速传送大量数据自然会消耗更多能量,但由于引入了增强电源控制(EPC)机制,再辅以802.11,实际空闲功耗会明显降低,蓝牙设备的待机耗电问题有望得到初步解决。此外,新的规范还具备通用测试方法(GTM)和单向广播无连接数据(UCD)两项技术,并且包括了一组HCI指令以获取密钥长度。

4.0 实际是个三位一体的蓝牙技术,它将三种规格合而为一,分别是传统蓝牙、低功耗蓝牙和高速蓝牙技术,这三个规格可以组合或者单独使用。改进之处主要体现在三个方面,电池续航时间、节能和设备种类上。拥有低成本,跨厂商互操作性,3毫秒低延迟、100米以上超长距离、AES-128加密等诸多特色。

容易混的profile:
FTP:
浏览其他设备上的文件或文件夹或目录树。这里的设备不仅仅是手机,包括PC等。
在设备之间传输文件或文件夹。
修改另一个设备上的文件或文件夹,包括删除或创建。
OPP:
Object Push
Business Card Pull
Business Card Exchange
pull/push名片(business card/vcard)或约会(appointment)。
交换名片或约会,交换的意思就是a push of a business card followed by a pull of a
business card.
PBAP:
It is based on a Client-Server interaction model where the Client device pulls phone book objects from the Server device.
注意这里是基于C-S的,client从server上pull phone book,而且并未提到其他操作。
可以浏览另一个设备上的phone book,但不可以做修改。
与OPP结合可以实现pull phone book from a server device.
------------------------------------------------------------------------------------------------------
external/dbus/dbus/dbus-protocol.h
external/bluetooth/bluez/doc/
各个interface(比如org.bluez.device)中含有哪些方法。
/data/data/com.android.settings/shared_prefs/bluetooth_settings.xml
DBUS_ERROR_UNKNOWN_METHOD
------------------------------------------------------------------------------------------------------
OPP(transfer file)
OppEventHandler:
frameworks/base/core/jni/com_broadcom_bt_service_opp_OppEventHandler.cpp

BtOppTransfer
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppTransfer.java

BluetoothService:
frameworks/base/core/jni/android_server_BluetoothService.cpp
frameworks/base/core/java/android/server/BluetoothService.java

BtOppObexServer
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppObexServerSession.java

BtOpp ObexClient
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppObexClientSession.java

BtOpp Service
packages/apps/Bluetooth/src/com/android/bluetooth/opp/BluetoothOppService.java

Obex ServerOperation
frameworks/base/obex/javax/obex/ServerOperation.java

ResponseCodes class contains the list of valid response codes a server may send to a client.
frameworks/base/obex/javax/obex/ResponseCodes.java
------------------------------------------------------------------------------------------------------

来自:http://blog.chinaunix.net/uid-27012741-id-3335351.html

阅读(1515) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~