android系统中蓝牙初步

一、认识蓝牙:

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规范中定义了ProfileProfile定义了设备如何实现一种连接或者应用,你可以把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文件系统上有关蓝牙目录结构:

1JAVA

frameworks/base/core/java/android/bluetooth/

包含了bluetoothJAVA类。

2JNI

packages/apps/Bluetooth/jni 

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

3bluez

external/bluetooth/bluedroid

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

4、硬件适配层

system/bluetooth/bluedroid/bluetooth.c

包含了对硬件操作的接口

system/bluetooth/data/*

一些配置文件,复制到/etc/bluetooth/

还有其他一些测试代码和工具。


四、android文件系统内上蓝牙启动过程:

1Android蓝牙通过system/bluetooth/bluedroid/bluetooth.c启动。在这个函数完成功能:

1>检查蓝牙电源状态,和打开蓝牙电源

2>启动蓝牙,其中调用了1启动

3>关闭蓝牙

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

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

hciattachinit.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.rchciattach来编辑命令行选项。


蓝牙电源开/

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

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


编译

编译Android打开蓝牙支持,添加下面这行内容到BoardConfig.mkBOARD_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.rcinit.PLATFORM.rclogwrapper下运行这些守护进程,把它们输出到logcat

hciconfig-ahcitool

如果你编译你自己的system.img,除了hcitool扫描不行,hciconfig-a是可以工作的,尝试安装固件到蓝牙芯片。XXXTBD

工具

BlueZ为调试和与蓝牙子系统通信提供很多设置命令行工具,包含下面这些:

hciconfig

hcitool

hcidump

sdptool

dbus-send

dbus-monitor


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值