码迷,mamicode.com
首页 > 其他好文 > 详细

蓝牙(原创)

时间:2014-12-10 10:35:34      阅读:669      评论:0      收藏:0      [点我收藏+]

标签:android   io   ar   os   使用   sp   for   java   on   

工作在2.4GHZ频段,  10米范围

 map:  车载蓝牙, 即手机上收到短信,车上显示即收到短信

 

+++++++++++++++ 原理 ++++++++++++

 蓝牙利用跳频技术,即在一个频率上传输数据,只持续一段时间,在约10ms, 然后转到另一个频率上。干扰的一方找不到要干扰的频率。 同时搜索也变得非常难, 在军事,跳频用的较多。 蓝牙使用跳频技术,比wifi有更强的抗干扰性。  同时也用跳频降低衰落传输距离10m左右。 速率1Mb/s.

蓝牙通信晶振的频率来跳频,

蓝牙系统结构有:从下到上:
底层:
射频层
负责跳频和链路的基带层
负责链路的建立的移除的链路层

主机控制器提供对底层的统一命令接口

中间协议层包括适配协议和服务发现协议

三种功率:100mW, 2.5mW, 1mW

 

++++++++++++++ 蓝牙认证 ++++++++++++
车载蓝牙的短信(MAP), 电话(SAP),FTP
可以模拟车载蓝牙
关于蓝牙的代码,mtk都是在so库的形式

 

mac地址, 蓝牙地址, wifi地址。
同一个地址,蓝牙用了,wifi不能再用了

 

 

++++++++++++  电话本协议 +++++++++++++
obex
pbap

在main_log搜索pbap, 在更小的范围再搜索type.

ich.vcf

mch.vcf

++++++++++++   mtk 平台蓝牙配置  ++++++++++++++++++++
mtk客制化配置蓝牙
mediatek/externl/bluetooth/bt_cust/bt_config.xml
ftp, 在这里打开

短信同步simap

 

++++++++++++++ 驱动架构 ++++++++++++++
4.2开始, 蓝牙bluez换成bluedroid

蓝牙与cpu通信要通过串口,在开启蓝牙前,串口初始化必须完成。  串口的波特率要设置好。 hciattatch建立串口与蓝牙的通道蓝牙模块发来的数据给uart, uart再给hci层。 具体要通过disc机制, 如下:

 uart口取得蓝牙模块的数据;

2, uart口通过ldisc传给hci_uart;

3, hci_uart传给在其上的bcsp;

4, bcsp传给hci层;

5, hci层传给l2cap层

6, l2cap层再传给rfcomm;

 

 

 

++++++++++++  +++++++++++

每个蓝牙设备都是一个hci对象, 注册hci对象,用hci_regiset_dev完成


4.2之后蓝牙就不用dbus通信了

 

蓝牙地址共48位, 低24位,高8位由厂商写, 中间16位可自由写
写蓝牙地址的工具, 要选择版本文件中两个文件.

 

---------------------------  蓝牙服务 --------------------------

native根当于服务端, framework相当于客户端,  通信一般用socket.
可以在init.rc, 创建socket文件.
socket name 创建者 文件权限
在jni层可以通过android_get_control_socket(name)得到这个socket文件.

 

mtkbt是一个蓝牙服务进程, 服务启动, 这个bin文件由mtk提供, 我们看不到源代码.
service mtkbt /system/bin/mtkbt
  socket bt.int.adp dgram 660 bluetooth net_bt
  socket bt.a2dp.stream dgram 660 bluetooth net_bt
  user bluetooth
  group system net_bt bluetooth net_bt_admin sdcard_rw inet net_admin nvram net_raw vpn net_bt_stack media_rw sdcard_r
   oneshot
 服务启动时的action有,
 创建两个socket
 启动进程的用户为bluetoosh

此进程在group指定的多个用户组中, 在android4.4, 放到media_rw用户组,意味着具有t卡读写权限, 如果不放在这个用户组, 蓝牙FTP就无法get文件, 即传文件,只能浏览. 

 

----------------------------------

从log看,最后released按键的时间为14:57:45,对应log:
09-04 14:57:45.458 3826 11158 I : [BT][AVRCP] send avrcpkey:73 keycord:208 pressed:0
在这之后, 快进的log只有一次:
09-04 14:57:46.239   146  4329 D MediaPlayerService: [46] seekTo(252077)
也就是说在按键release后的大概0.8秒时间,发生了一次快进.而且只发生一次.按键按下的状态是一直发快进命令的,从发出快进到到最后执行完快进命令需要一段时间.按键releae后0.8秒的这次快进,是按键release之前发的命令的执行结果. 所以分析结果是快进功能正常.

 

 


L2CAP, 即Logical Link Control and Adaptation Protocol. 即逻辑链路控制和适配协议, 能够使上层应用 以64KB的长度发送和接收数据包,具体使上层以64KB收发数据分组. 通过一个空中接口提供多种连接.如多路复用.L2CAP的基础是基带.向上层提供面向连接和无连接的数据服务.


RFCOMM的基础是L2CAP, 目的是保证两个远程蓝牙设备的通信连接的完整. 本地蓝牙模块通信用有线的串口方式,远程蓝牙模块通信则要用无线的串口方式, 使无线串口与有线串口有一样的接口, 串口线性访真协议建立在L2CAP协议基础上.

蓝牙设备连接类似于TCP socket连接,serversocket监听请求,有请求就建立个socket, 然后用这个socket通信. 

BLuetoothAdapter可以发现蓝牙设备,获取绑定了的设备,用mac地址实例化一个蓝牙设备,建立一个serversocket.
bluetoothDevice代表一个远端蓝牙设备
bluetoothSocket可以像使用socket通信一样.

-------------------------- -----------------

不能突然把火侯调大, 菜会胡的.

蓝牙4.0增加了点对点协议,与加密密钥
共40多个蓝牙协议
a2dp, 有播放,录音
Object Push Profile 即文件相互传送.
Hands-Free Profile HFP(HFP,免提规范) 蓝牙免提接打电话
Heart Rate Profile HRP(心率规范) 用于医疗

bluez由高通开发,现在放弃转到用bluedroid. 后者比前者架构更为清晰
借助hal层,bluedroid中与dbus最大程度解偶
应用层通过hal完成所有请求
bluetooth hal是android4.2新增模块
核心是bluetooth stack. 包括bluetooth application layer (bta) 和bluetooth embeded system(bte).
bta层实现设备管理,状态管理.与framework交到.
 bte通过hci与蓝牙芯片以实现协议所需要的基本功能.

蓝牙低功耗通信,在可穿戴设备应用越来越多.

framework层, 的A2dpService.java的connect方法就是framework层与蓝牙进程调用
蓝牙服务进程在packages/app/bluetooth.
在framework实现各种协议.
jni->hal层

hal层:
hardware/libhardware/include/hardware/bt_av.h中
connect的最终实现在external/bluetooth/bluedroid/btif/src/btif_av.c的connect方法。
android4.2的蓝牙部分发生了翻天覆地的变化


因为bluez是基于gnu协议,厂商用了,也要开放自己的源码

mtk: 蓝牙进程 

用酷狗音乐播放, 回到范围,蓝牙自动连接,但没自动播放音乐.

你逮不到的猎物就不要去逮了. 不要空费时间.

关于蓝牙的实现bluedroid, mtk完全没用,mtk自己写了一套,代码看不到.

 

--------------------------

播放音乐,就会bt_write. write时会检测状态,当发现手机处于slave时,手机端就会调用role switch. bt_write去往车载蓝牙去写. 车载蓝牙播放音乐必

须等bt_write完成,bt_write又要等role_switch完成.对于car media这种车载,好像是丰田的.只让自己做master.  对于手机发来的role switch,是不响

应的.role swtich有一个等待时间,不被允许了,还在那等. bt_write阻塞住. 即车载蓝牙完成接收不到音乐数据,所以手机从手机出来,过一会,

bt_write返回成功,车载蓝牙那边就有数据了. 音乐就转到车载了.

走出蓝牙范围,再回到范围,动作顺序:
a2dp连接ok,
avrcp连接ok, 车载发出play请求
手机响应play, 因role_switch, 导致bt_write受阻, 所有数据暂停,车载没有接收数据.所以音乐从手机出来 

 

-----------------  bqb 认证--------------

map协议共包括三个功能,短信,彩信,email, 在bqb测试时,短信彩信通过,email没过,但email feature没有勾选.我们这边测试短信也是通过的

 bqb认证方按给定文档的feature, 只有勾选,才支持

----------------- c/s 角角 -----------------

蓝牙设备作为target,是一个client, 手机端的蓝牙进程是server, 这是蓝牙规范
target在收到server数据后,发确认消息.从空中包的log里面有这个确认消息,可以确认target收到这个消息

蓝牙进程是client, framework层music server是server, 这是安卓规范
蓝牙进程是蓝牙协议栈与蓝牙server的实现,mtk实现了蓝牙进程,但代码没公开.

蓝牙进程向frawmework层要数据,收到meta数据后,再打包给蓝牙芯片,由蓝牙芯片发这些数据.

 

---------------------------

数据丟给...是一种一层传给一层的口语化表达
avrcp1.3支持meta数据显示,avrcp1.0不支持. 
用1.0的蓝牙耳机连1.3的手机,手机向下兼容,走1.0
对比机在蓝牙设备在play动作后,会发meta请求.而测试机则没有.测试机在蓝牙设备发play动作之前,就已经发meta请求了.在play之后没发,可能导致没有meta显示. 
mtk为了向下兼容,将alps/frameworks/base/data/keyboards/AVRCP.kl
key 200 MEDIA_PLAY WAKE
key 201 MEDIA_PAUSE WAKE
修改为:
key 200 MEDIA_PLAY_PAUSE WAKE
key 201 MEDIA_PLAY_PAUSE WAKE
因问题与play有关,改回去.
蓝牙耳机停止播放共用一个按键.avrcp1.3有状态告知机制,蓝牙设备在发送play动作之前,手机会告知蓝牙设备的状态,从而使蓝牙知道发送play还是pause.
蓝牙设备实现avrcp协议,但有些动作协议没有规定,像发play动作或pause动作.

 

-------------------------- 蓝牙配置 --------------

mtk对蓝牙的配置在
mediatek/external/bluetooth/bt_cust.
在bt_cust_table.h这个文件定义了对个别车载蓝牙的roleswitch配置,
默认roleswitch都是打开的.可以把默认改为关闭.
如增加对car multimedia这个车载蓝牙,不做roleswitch. 可以添加一项:
{
.name = "PCM",
.config_table =
(bt_dev_config_item[])
{
{
.name = "SDPDelayTimeout",
.value = (void*)0,
},
{0} /* terminator */
},
},


//add_for_car_multimedia_begin
{
.name = "CAR MULTIMEDIA",
.config_table =
(bt_dev_config_item[])
{
{
.name = "NoRoleSwitch",
.value = (void*)1,
},
{0} /* terminator */
},
},
//add_for_car_multimedia_end

从对btlog的解析看,蓝牙进程会遍历这里的车载蓝牙,log:
9238 Trace 9239 0 163443644 MOD_BT g_dev_config=0xb6505034, g_dev_config_size=6
9239 Trace 9240 0 163443644 MOD_BT 0 : dev=i.Tech Clip R35, config=0xb65050ac
9240 Trace 9241 0 163443644 MOD_BT 0 : DevSupportServices=0xb650508e cid=30
9241 Trace 9242 0 163443644 MOD_BT 1 : dev=PCM, config=0xb65050c4
9242 Trace 9243 0 163443644 MOD_BT 0 : SDPDelayTimeout=0x0 cid=31
9243 Trace 9244 0 163443644 MOD_BT 2 : dev=CAR MULTIMEDIA, config=0xb65050dc
9244 Trace 9245 0 163443644 MOD_BT 0 : NoRoleSwitch=0x1 cid=34
9245 Trace 9246 0 163443644 MOD_BT 3 : dev=Honda HFT, config=0xb6505004
9246 Trace 9247 0 163443644 MOD_BT 0 : SDPDelayTimeout=0x0 cid=31
9247 Trace 9248 0 163443644 MOD_BT 4 : dev=Motorola S10-HD, config=0xb650501c
9248 Trace 9249 0 163443644 MOD_BT 0 : NoRoleSwitch=0x1 cid=34
9249 Trace 9250 0 163443644 MOD_BT 5 : dev=Bose AE2w 01.02.00, config=0xb6505094

从btlog也能看到当前车载蓝牙的名字:
12889 Trace 2211504 0 170624877 MOD_BT name:CAR MULTIMEDIA

btlog在mobilelog里面.需要专门的解析工具.

bt_cust_table.h中的g_config_table配置了蓝牙参数,roleswitch就在这里配置. sniff模式.
对协议的支持,在btconfig.xml配置,如打开ftp协议.

 

蓝牙(原创)

标签:android   io   ar   os   使用   sp   for   java   on   

原文地址:http://www.cnblogs.com/tchz/p/3926450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!