您的位置:首页 > 移动开发 > Android开发

android系统中蓝牙初步

2013-04-22 11:21 197 查看
一、认识蓝牙:
bluetooth是一种短距离无线通讯传输接口,允许的传输距离长度设计为10米到100米,当含有bluetooth的手机或计算机等在多个含bluetooth装置的环境中,设备尚未加入蓝牙微网时,它会先进入待机状态。在此状态下,它会随时监听传呼讯息,直到收到的信号与自己本身的识别码有相关时,自己才会激活bluetooth服务称为Master时,开始寻找外围所有bluetooth装置称为Slave,并且呼叫连结程序。接下来则进行识别码的确认及信号时间的同步,以便决定往后跳频之Sequence,而将这些装置连成一个群体,称为微网piconet。可由bluetooth形成一个微网的方式来分享资料,可提供7-8个主动服务者Active
Slave Device 以及255个等待服务者Standby SlaveDevice。为了维持信息的传送,微网内的其中一个装置为此微网的主控装置,而其它装置则为从属装置。在微网内的任何一个装置都可以成为主控装置,但在任何时间中微网内只有一个主控装置。bluetooth提供点对点或点对多的连结方式,各个bluetooth装置连结建立都由Master来主控,在一个区域内,同时可以加入多个微网,这种多个微网架构所组成称为叠网Scatternet。

二、Bluetooth相关的profile
Bluetooth的一个很重要特性,就是所有的Bluetooth产品都无须实现全部的Bluetooth规范。为了更容易的保持Bluetooth设备之间的兼容,Bluetooth规范中定义了Profile。Profile定义了设备如何实现一种连接或者应用,你可以把Profile理解为连接层或者应用层协议。
在所有的Profile中,有四种是基本的Profile,这些Profile会被其它的Profile使用。它们是:
GAPProfile: Generic AccessProfile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。
SDAPProfile: Service Discovery ApplicationProfile,通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。
SPPProfile: Serial Port Profile,模拟串口通讯
GOEPProfile: Generic Object ExchangeProfile,通用对象交换。这个Profile的名字有些费解,它定义的是数据的传输,包括同步,文件传输,或者推送其它的数据。你可以把它理解为内容无关的传输层协议,可以被任何应用用来传输自己定义的数据对象。
应用程序中相关profile

A2DP  Advance Audio Distribution Profile 蓝牙音频传输协议

 A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。有A2DP的耳机就是蓝牙立体声耳机。声音能达到44.1kHz(CD音质:16bits 44.1kHz),一般的耳机只能达到8kHz(Handsfree profile:8bits 8kHz)。

A2DP详细技术文档:A2DP_SPEC_V12.pdf

AVRCP  Audio/Video Remote Control Profile 音频/视频远程控制配置文件

AVRCP 设计用于提供控制TV、Hi-Fi设备等的标准接口。此配置文件用于许可单个远程控制设备(或其它设备)控制所有用户可以接入的A/V设备。它可以与 A2DP 或 VDP 配合使用。

  AVRCP 定义了如何控制流媒体的特征。包括暂停、停止、启动重放、音量控制及其它类型的远程控制操作。AVRCP 定义了两个角色,即控制器和目标设备。控制器通常为远程控制设备,而目标设备为特征可以更改的设备。在 AVRCP 中,控制器将检测到的用户操作翻译为 A/V 控制信号,然后再将其传输至远程 Bluetooth 设备。对于“随身听”类型的媒体播放器,控制设备可以是允许跳过音轨的耳机,而目标设备则是实际的播放器。常规红外遥控器的可用功能可以在此协议中实现。

  AVRCP 协议规定了AV/C 数字接口命令集(AV/C 命令集,由1394 行业协会定义)的应用范围,实现了简化实施和易操作性。此协议为控制消息采用了AV/C 设备模式和命令格式,这些消息可以通过音频/视频控制传输协议 (AVCTP) 传输。

AVRCP协议详细文档:Bluetooth AVRCP Spezifikation V1.4

OPP  Object push profile 对象推送协议

蓝牙在OBEX基础上的一个专属协议,它用于资源在设备间的共享传输。比如用户可以从一个蓝牙手机上将音乐PUSH到另外一个手机上。OPP协议详细文档:OPP_SPEC_V12r00.pdf

HID human Interface devices 规范运行在蓝牙的LACAP协议上,并基于GAP规范

HID功能的实现是基于BLUEZ里面的INPUT来实现的

三、Android4.2.2文件系统上有关蓝牙目录结构:
1、JAVA层
frameworks/base/core/java/android/bluetooth/
包含了bluetooth的JAVA类。

2、JNI层

packages/apps/Bluetooth/jni 

定义了bluez通过JNI到上层的接口。

3、bluez库
external/bluetooth/bluedroid
这是bluez用户空间的库,开源的bluetooth代码,包括很多协议,生成libbluetooth.so。

4、硬件适配层
system/bluetooth/bluedroid/bluetooth.c
包含了对硬件操作的接口
system/bluetooth/data/*
一些配置文件,复制到/etc/bluetooth/。
还有其他一些测试代码和工具。

四、android文件系统内上蓝牙启动过程:
1、Android蓝牙通过system/bluetooth/bluedroid/bluetooth.c启动。在这个函数完成功能:
1>检查蓝牙电源状态,和打开蓝牙电源
2>启动蓝牙,其中调用了1启动
3>关闭蓝牙

电源的状态是通过rfkill文件状态来标示的。如果平台没有rfkill。在文件中直接屏蔽掉和蓝牙电源相关的函数。 主要的函数就剩下bt_enable和bt_disable了。

在bt_enable中,首先使用property_set函数开启hciattach服务。然后HCIDEVUP,最后执行property_set函数开启hcid服务。

hciattach在init.rc中是没有的,手动添加

servicehciattach /system/bin/hciattach -n /dev/ttyS1 any 38400 flow
userroot
disabled
oneshot

Android上蓝牙启动与移植相关资料
移植
BlueZ是兼容蓝牙2.1的,可以工作在任何2.1芯片以及向后兼容的旧的蓝牙版本。有要有两个方面:
• 串口驱动UART driver
• 蓝牙电源开/关Bluetooth Power On/Off

串口驱动
BlueZ核心子系统使用hciattach守护进程添加你的指定硬件串口驱动
BlueZ是兼容蓝牙2.1的,可以工作在任何2.1芯片以及向后兼容的旧的蓝牙版本。有要有两个方面:
• 串口驱动UART driver
• 蓝牙电源开/关Bluetooth Power On/Off

BlueZ核心子系统使用hciattach守护进程添加你的指定硬件串口驱动

例如,MSM7201A,这个文件是在drivers/serial/msm_serial.c。你还需要通过修改init.rc为hciattach来编辑命令行选项。

蓝牙电源开/关
蓝牙芯片的电源开关方法1.0和Post1.0是不同的,具体如下:1.0:Android框架写0或1到/sys/modules/board_[PLATFORM]/parameters/bluetooth_power_on

Post1.0:Android框架使用linuxrfkill API,参考arch/arm/mach-msm/board-trout-rfkill.c例子。

编译
编译Android打开蓝牙支持,添加下面这行内容到BoardConfig.mk。BOARD_HAVE_BLUETOOTH
:=true
解决问题
调试
调试你的蓝牙实现,可以通过读跟蓝牙相关的logs(adblogcat)和查找ERROR和警告消息。Android使用Bluez,同时会带来一些有用的调式工具。下面的片段为了提供一个建议的例子:
hciconfig-a

#print BT chipset address and features. Useful to check if you cancommunicate with your BT chipset. hcidump -XVt # print liveHCI UART traffic. hcitool scan

#scan for local devices. Useful to check if RX/TX works. l2pingADDRESS

#ping another BT device. Useful to check if RX/TX works. sdptoolrecords ADDRESS

#request the SDP records of another BT device.
守护进程日志
hcid(STDOUT)和hciattach(STDERR)的守护进程日志缺省是被写到/dev/null。编辑init.rc和init.PLATFORM.rc在logwrapper下运行这些守护进程,把它们输出到logcat。
hciconfig-a和hcitool
如果你编译你自己的system.img,除了hcitool扫描不行,hciconfig-a是可以工作的,尝试安装固件到蓝牙芯片。XXXTBD
工具
BlueZ为调试和与蓝牙子系统通信提供很多设置命令行工具,包含下面这些:
hciconfig
hcitool
hcidump
sdptool
dbus-send
dbus-monitor
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 蓝牙