在这里讨论蓝牙的AVRCP协议,要理解AVRCP,需要先了解AVCTP;
我们分两个部分来进行;
1、AVCTP协议;
2、AVRCP协议;
下面先来看AVRCp协议:
一、概述
1、定义
AVCTP(Audio/Video Control Transport Protocol Specification)音频/视频控制传输协议是一个框架协议,描述蓝牙设备间Audio/Video的控制信号交换的传输机制,具体的控制信息(编码和格式)由其指定的协议(如AVRCP)实现,AVCTP本身只指定控制command和response的总体的格式,AVCTP是建立在L2CAP上的;
2、角色
AVCTP分为两个角色,CT(The Controller)是命令的发起方,命令接收方是TG(The target),如下图:
AVCTP通信要求已经建立了ACL链接,AVCTP交互是在面向连接的通道中的双向通信,
3、通信过程
首先会有CT发起通信,发送命令道TG端;
一个完整的AVCTP消息包含一个指定TG地址的命令,然后由TG端回复消息,AVCTP不会控制命令或响应的顺序或定义CT/TG的行为,大体流程可参照下图:
因为AVCTP是建立在不可靠的ACL上,所以存在命令收不到应答的情况,命令的重发不是必须的,这个由应用层开发者决定;
4、通信模式
在AVCTP中,bit和byte传输时采用大端模式,即高字节在左侧;
二、AVCTP消息包格式
1、概述
AVCTP命令或应答在传输时是包含在一个或多个AVCTP packets中,这些包中包含AVCTP header和多个消息体部分,但是在AVCTP中并未定义length域,它是依靠L2CAP层去限制发送的包数,所以AVCTP也需要遵循L2CAP协议长度的相关定义;
2、消息格式
大部分的AVCTP命令以负载的方式通过单一L2CAP包传输,但也有少数大信息AVCTP包需要被拆分,通过多个L2CAP包传递出去,下面我们分别来看这两种包格式
a、不拆分的包格式,见下图:
格式中bit含义spec中都有说明,我们再详细看下;
TL占用了4bit,它是通信中标识唯一的tag,由应用层给出其值;
PT是包类型,PT=0时表示开始包,PT=10表示中间包,PT=11表示结束包,在非拆分包中,PT=0;
IPID只有在响应为无效包时才会置位1,其他情况都为0;
上图显示了几个信息:
(1) AVCTP header为3字节;
(2)不拆分的AVCTP包不能大于L2CAP的MTU大小;
b、拆分包格式,如下图:
可以看到拆分包格式start packet多了一个字节,Number of AVCTP Packets,continue packet 和end packet去掉了IPID和PID字段,AVCTP通过L2CAP层保证包的每个包的完整性及传递顺序,但无法保证所有包的完整性;由于信道的不稳定性,可能会产生AVCTP丢包,我们看下拆包AVCTP在L2CAP的拆包方式,如下图:
3、AVCTP Message Information Part的说明
这部分可以包含不定长度的命令或应答帧;
其具体格式需要参照具体的profile,如AVRCP,AVDTP等;
三、总结
好了,分析到这里相信大家对AVCTP有了比较不错的认识,其实AVCTP就是定义了一个通信框架,它定义好了packet heaeder,定义好了与L2CAP层的传输机制,剩下的数据域(AVCTP Message Information Part)就需要参考其他profile来填充;
AVCTP提供了一组Upper Interface,作为一组测试接口,也可作为其他应用协议的接口,这里就不去看了,感兴趣的可以自己翻一下spec;
下一篇我们将一起来看下AVRCP协议,希望大家多多支持;