用途
SCO与eSCO都是蓝牙中用于同步传输数据的链路,在android中主要是三种用途,且一时间只能存在一种用途:
1. Telecom电话,通过phoneStateChanged接口通知蓝牙。
2. 三方应用开启虚拟通话,比如微信语音通话/飞书语音通话,三方通过调用蓝牙startScoUsingVirtualVoiceCall接口开启。
3. 语音识别功能,比如耳机端按键调用手机的语音助手开始语音识别耳机端输入的声音,耳机发送AT+BVRA命令,手机侧识别到此AT命令之后通过调用蓝牙startVoiceRecognition接口开启。
定义
官方描述,SCO/eSCO是一种中心设备和指定的外围设备间的对称、点对点的传输。它会让系统通过保留一些slots用于传输。SCO不会重传,而eSCO在保留的传输窗口之后还会有重传窗口。
所以,eSCO对比SCO最大的区别就是在SCO的基础上多了重传的功能。
命令
SCO LMP相关连接命令和流程
主要的两个参数:
Tsco 表示两个保留的slots之间的间隔
Air_Mode 表示数据编解码,一般是CVSD和mSBC两种。
eSCO LMP相关连接命令和流程
主要的四个参数:
Tesco 表示两个保留的slots之间的间隔
Wesco 表示重传窗口大小
Air_Mode 表示数据编解码,一般是CVSD和mSBC两种。
eSCO_Packet_Type 表示传输的包类型
示例
上图发起了一次eSCO连接,Tesco是7.5ms,Wesco是2.5ms,使用的包类型是2-EV3,编解码使用的是CVSD;下面再实际看看这些参数的生效过程。
可以看到两包eSCO之间的间隔是7.5ms。
一次eSCO传输包含C->P的一包2-EV3数据和P->C的一包2-EV3数据。至于为什么总计是2 slots,是因为2-EV3包占一个slot传输,所以总计是2个slots。
由于第一包数据发生丢失,随后在重传窗口进行重传,也可以看到重传窗口是2.5ms。