蓝牙(原创)

工作在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协议.

时间: 2024-07-31 22:32:11

蓝牙(原创)的相关文章

蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 【原创,多图】

蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 [原创,多图] (只发布于csdn博客, 如需转载,请注明出处,谢谢! ) 蓝牙4.0的开发, 现在真热火的很, 但是很多朋友买了我们出品的cc2540 usb-dongle后, 都反馈说不知道如何抓包, 并且, 即使很多朋友到TI官网论坛去找信息,不少朋友依然是无功而返,实际上, 用cc2540 usb-dongle来进行ble数据的抓包,并不像用电脑的wireshark等软件来

【原创】cocos2d-x3.9蓝牙开发之蓝牙开启

本人第一次搞android开发,很多东西都是只知道一点点,然而都没怎么实践过,所以这次就边学边做自己想要的功能,可能会花较长时间,不过肯定是值得的,有用词或哪里说得不对的请指正. 我自己有android和windows的东西,所以只能暂时只能搞android. 蓝牙开发有几个关键步骤,我一步步来 1,首先开启蓝牙 2,搜索可用设备 3,创建蓝牙socket,获取输入输出流 4,读取和写入数据 5,断开连接关闭蓝牙 我先从第一步开始实现,开启蓝牙,而开启蓝牙是需要一个过程的. 流程是这样的,点击开

原创翻译:iOS 应用程序 蓝牙后台运行

默认情况下,普通的CoreBluetooth 任务中的大多数,无论是Central还是peripheral ,在后台或者挂起状况下都是无法进行的.也就是说,你可以通过宣布你的应用程序支持后台处理模式来允许你的一个应用程序把你从一个挂起状态中唤醒来执行某些蓝牙相关的事件. 即使你的应用程序支持一种或者两种CoreBluetooth后台执行模式,那么他也不会永远运行.在某些时候,系统也许由于当前的前台应用程序而终止你的应用程序来释放内存,这将会导致任何活跃的或者挂起的连接会丢失.在iOS7中,Cor

(原创)AP6212蓝牙模块在am335x控制板上的应用

主控板wifi模块调通后接着调试蓝牙,经过两周的摸索,终于把蓝牙应用基本建立起来,下面记录下大概流程. 1.硬件管脚设置 static void uart4_init(int evm_id, int profile){ /* Configure Uart4*/ printk(KERN_ERR"====== BT(AP6212) init ========\n"); setup_pin_mux(uart4_pin_mux); /* Init Broadcom bluetooth, add

Android端简易蓝牙聊天通讯App(原创)

欢迎转载,但请注明出处!谢谢.http://www.cnblogs.com/weizhxa/p/5792775.html 最近公司在做一个蓝牙串口通讯的App,有一个固定的蓝牙设备,需要实现手机连接相互交换数据.以前没怎么做过蓝牙开发,故查看Android App Guide的蓝牙篇,发现有个chat示例,故此做了点研究.在研究的基础上进行了此App的实现. 1.App特点: 1.1 App中同时存在服务器与客户端,任意手机可以作为服务器或者客户端: 1.2 客户端可以进行蓝牙环境扫描: 1.3

【原创】Android 5.0 BLE低功耗蓝牙从设备应用

如果各位觉得有用,转载+个出处. 现如今安卓的低功耗蓝牙应用十分普遍了,智能手环.手表遍地都是,基本都是利用BLE通信来交互数据.BLE基本在安卓.IOS两大终端设备上都有很好支持,所以有很好发展前景. 现市面上各种手环.手表的智能设备中基本都充当"从设备"这样的角色,基本由智能设备完成蓝牙广播,由手机进行连接,然后交互数据. 根据上述方式的应用在安卓4.3.IOS 7.0的版本上就得到了支持,应用也比较广泛,园里应该有很多相关实现,大家可以自己找找,如果不愿意找,抽空再写一篇. 今天

蓝牙核心技术概述(一):蓝牙概述

蓝牙核心技术概述(一):蓝牙概述 标签: 蓝牙bluetoothsig 2014-07-26 16:01 6143人阅读 评论(3) 收藏 举报  分类: 协议(14)  版权声明:本文为博主原创文章,未经博主允许不得转载. 关键词:蓝牙 核心技术 协议 版本 历史作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢)欢迎指正错误,共同学习.共同进步!!下载连接:Bluetooth PROFILE SPECIFICATIONS (基本涵盖所有蓝牙协议).buletooth cor

Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏

著作权声明:本文由http://www.cnblogs.com/icker 原创,欢迎转载分享.转载时请保留该声明和作者博客链接,谢谢! 最近使用Unity3d制作的IOS游戏需要加入联网对战功能功能,因此使用ObjC语言利用IOS SDK的GameKit.framework的Peer-to-peer Connectivity实现了网络连接,在此分享. 啥话都不说,先上代码.点我下载工程文件, 类NetWorkP2P,继承自NSObject.提供GKSessionDelegate和GKPeerP

(九十三)蓝牙的基本使用

蓝牙在GameKit框架中实现,可以实现文件传递和游戏通信等,蓝牙的缺点是不能得到文件传输的进度,因此不宜传输大文件. 使用蓝牙的一般步骤如下: ①创建蓝牙设备拾取器,类似于图片拾取器,通过代理方法获取拾取到的设备,调用show方法来显示拾取器. GKPeerPickerController *peerC = [[GKPeerPickerController alloc] init]; peerC.delegate = self; [peerC show]; 要遵循UINavigationCon