蓝牙基带技术支持两种连接类型:
同步定向连接(SCO)类型(主要用于传送话音)
异步无连接(ACL)类型(主要用于传送数据包)
bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm
实现了 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 的全部连接。
同步定向连接(SCO)类型(主要用于传送话音)
异步无连接(ACL)类型(主要用于传送数据包)
SCO:Synchronous Connection Oriented ,同步定向连接
ACL:Asynchronous Connectionless ,异步无连接
http://blog.youkuaiyun.com/dyufei/article/details/5815719
bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm
bluez (/external/bluetooth/)
Library层:
libbluedroid.so(/system/bluetooth/bluedroid/) 等
实现了 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 的全部连接。