ACL是连接基础,sco需要再ACL连接成功后建立连接。基本链接流程如下:
一、创建连接
从用户点击扫描到的蓝牙设备开始,发起连接的设备会发送create_connection给controller。controller会进行page过程。
而后会底层链接完成,这个完成仅仅是确认两边连接请求的一次交换。
二、Feature交换
连接完成后,进行两端的物理层功能交换。确定能力一致性。中间也会针对物理层策略进行配置:Master/slave switch; hold mode; sniffer mode ;Remote name、remote version等。
三、配对
最早的配对是采用输入pin码的形式,但是手机上大多是采用simple pair的方法.对于非首次连接的设备,配对的过程,所谓交换安全密钥的过程就不再必要,可以直接跳过。
simple pair
这里发送的user confirmation也代表首次链接时,用户点击accpet对话框的一个标志。
Simple pair以发起认证,link key互换,IO信息交换,用户点击接受连接位置,代表simple pair完成。
四、Profile连接
说明几个主要profile的连接过程。对于手机而言,蓝牙连接成功标志为配对后某个profile连接完成,即便后续几个profile还在连接中。代码如下:CachedBluetoothDevice.java
public boolean isConnected() {
synchronized (mProfileLock) {
for (LocalBluetoothProfile profile : mProfiles) {
int status = getProfileConnectionState(profile);
if (status == BluetoothProfile.STATE_CONNECTED) {
return true;
}
}
return false;
}
}
-
HFP
HFP连接首先进行SDP服务发现过程,分配逻辑信道后开启连接。由于HFP基于Rfcomm实现,所以需要先行建立rfcomm连接.
Rfcomm连接开启先基于sdp申请的CID在L2CAP进行连接和信息交换。
由于Rfcomm不止围绕HFP一个profile服务(还有opp等),在rfcomm完成后,还需要进行HFP连接,这其中的部分连接过程如下所示:
基于音频基础理论,两端是被进行音频传输前,需要统一支持的编码格式,采样率,控制语义等,在HFP中进行了这些信息的交换。
-
A2DP/AVRCP
A2DP作为重要的profile,基于的协议为AVDTP。在SDP发现后,同样进行L2CAP的连接后,才能进行上层profile的连接。
同样需要进行音频信息的交换,HFP的音频参数不能和A2DP复用并且基于profile的独立规则,需要再进行一次音频信息交换.个人理解,HFP主要保证音频传输稳定性,A2DP则需要提升音频细节,需要采用不同的编码和采样率。