Android Bluetooth

来源:互联网 发布:贺卡制作软件 编辑:程序博客网 时间:2024/04/26 00:25
蓝牙基带技术支持两种连接类型:
同步定向连接(SCO)类型(主要用于传送话音)
异步无连接(ACL)类型(主要用于传送数据包)

SCO:Synchronous Connection Oriented ,同步定向连接
ACL:Asynchronous Connectionless ,异步无连接


****************************************

http://blog.csdn.net/dyufei/article/details/5815719


LinuxKernel层:

bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm

bluez (/external/bluetooth/)


Library层:

libbluedroid.so(/system/bluetooth/bluedroid/) 等


Framework层:

实现了 Headset / Handsfree 和 A2DP/AVRCP profile,但其实现方式不同. (frameworks/base/core/java/android/bluetooth)
Handset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,
而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。


*****************************************

Android 实现了对 Headset 和 Handsfree 两种 profile 的支持

核心是BluetoothHeadsetService (在PhoneApp 创建的时候会启动)

1.
BluetoothHeadsetService
收到ENABLED_ACTION时,会先向BlueZ注册 Headset 和 Handsfree 两种profile(通过执行sdptool 来实现的,均作为Audio Gateway),
然后让BluetoothAudioGateway 接收RFCOMM 连接,让BluetoothHandsfree 接收SCO连接(这些操作都是为了让蓝牙耳机能主动连上Android)。

BluetoothHeadsetService 收到DISABLED_ACTION 时,会停止BluetoothAudioGateway 和 BluetoothHandsfree。  


2.1
(Android 主动跟蓝牙耳机连)
会收到BONDING_CREATED_ACTION,这个时候BluetoothHeadsetService 会主动去和蓝牙耳机建立RFCOMM 连接。


2.1.1
RFCOMM 连接的真正实现是在ConnectionThread 中

第1步 先通过SDPClient 查询蓝牙设备时候支持 Headset 和 Handsfree profile。

第2步 才是去真正建立RFCOMM 连接。

当RFCOMM连接成功建立后,
BluetoothHeadsetDevice 会收到RFCOMM_CONNECTED消息,
它会调用BluetoothHandsfree 来建立SCO 连接,
广播通知Headset状态变化的Intent(PhoneApp 和BluetoothSettings 会接收这个Intent)。  


2.1.2
BluetoothHandsfree 会先做一些初始化工作,
比如根据是Headset 还是Handsfree 初始化不同的ATParser,
并且启动一个接收线程从已建立的RFCOMM上接收蓝牙耳机过来的控制命令(也就是AT 命令),
接着判断如果是在打电话过程中,才去建立SCO 连接来打通数据通道。


建立SCO 连接是通过SCOSocket 实现的

当SCO 连接成功建立后,BluetoothHandsfree 会收到SCO_CONNECTED 消息,
它就会去调用AudioManager 的setBluetoothScoOn函数,从而通知音频系统有个蓝牙耳机可用了。
到此,Android 完成了和蓝牙耳机的全部连接。


2.2
(蓝牙耳机主动跟Android)
首先BluetoothAudioGateway 会在一个线程中收到来自蓝牙耳机的RFCOMM 连接,然后发送消息给BluetoothHeadsetService。

2.2.1
蓝牙耳机也可能会主动发起SCO 连接,
BluetoothHandsfree 会接收到一个SCO_ACCEPTED消息,
它会去调用AudioManager 的setBluetoothScoOn 函数,从而通知音频系统有个蓝牙耳机可用了。到此,蓝牙耳机完成了和Android 的全部连接。  






原创粉丝点击