蓝牙AVRCP协议解析

一、概述
1、定义:
AVRCP(Audio/Video Remote Control Profile),也就是音频/视频远程控制规范;

AVRCP使用AV/C command set(AV/C Digital Interface Command Set)来实现;

AVRCP的实现需要GAP协议的支持;

2、role
同AVCTP,AVRCP分为两个角色,CT(The Controller)是命令的发起方,命令接收方是TG(The target)

二、交互流程(可参考AVRCP spec 4)
1、建立连接流程
        AVCTP分为两种通道,control channel和browsing channel,两种信道分别传输AV/C命令和Browsing命令;browsing channel不能用来传输分组(分包)消息;

        browsing channel不是必须的,可根据双方协商是否建立,它在control channel建立后才可建立;

        CT和TG都可以发起一个AVCTP的L2CAP信道建立,这个事件是被外部触发的,比如开机事件;

        如果两个设备同时打开AVCTP信道,这时需要先同时关闭,然后两个设备经过一个随机时间后在尝试打开;

2、关闭连接:
        CT和TG都可以发起释放AVCTP的L2CAP信道的动作,这个动作也是由外部出发,比如关机事件;

        如果browsing channel存在,则需要在释放control channel之前先释放browsing channel;

3、命令流程
一旦建立了连接,CT就可以给TG发送命令;

上图说明了命令流程,有两点需要注意:

a、AV/C interim response可能在VENDOR DEPENDENT命令时返回,其他命令不会返回interim response;

b、在某些情况下,TG不会响应response;

4、命令类型:


UNIT INFO指令是把AV/C指令集作为一个整体获取信息。响应报文包含TG的设备供应商编号(Vendor ID)与子设备类型(Subunit Type),Subunit Type为具体的设备类型;

Subunit Info指令用来获取AV/C子集信息;

Vendor Dependent允许划分子集的指令与响应集;

AVRCP协议的一个特点就是就是通过Pass Though指令的Panel subunit(面板子集),The Panel subunit提供一个以用户操作来触发的模型,当用户触发事件后(按键),CT会发送命令给Panel subunit,Panel subunit会给出相应动作的应答;尽管在TG中会有许多subunits,但Panel unit一定只有一个;不同于其他subunit,Panel unit不直接参与处理media流,Panel unit独立于其他unit,用来传递用户动作,影响其他unit;

spec中给出了一些pass through command命令,如下图,这些命令分为两种,使用AV/C Ctype的的AV/C VENDOR DEPENDENT命令和browsing commands,他们分别使用control channel和browsing channel

AVRCP特定命令分为AV/C VENDOR DEPENDENT命令和browsing命令


        在PASS THROUGH命令对不同设备的支持的情况,在spec中有详细说明,这里只截取了一小部分,可以看到table中分了四类设备,分别是他们对PASS THROUGH的支持情况,在CT和TG端不同,注意区分:

三、协议格式
1、功能
在看协议之前,再来看下AVRCP的几个功能;

1)Target player application settings,为CT端提供了查询TG设置属性的一种机制,其形式为<attribute,value>,具体属性可参看spec;

2)Metadata Attributes for Current Media Item,CT获取TG特定属性时可通过GetElementAttributes命令实现;

3)TG 事件notification,这个机制是当TG有事件发生时,用来通知CT的;

(a)CT可以获取TG播放状态;

(b)TG可被监控的状态有

播放状态:Playing,Paused,Stopped,Seek Forward,Seek Rewind,PlayBack Position change;

Track改变事件:Change of track,Start of track,End of track;

(c)设备插播事件;

(d)所有Player应用的属性都可以被注册到CT,当产生变化时,TG会通知CT;

(e)音量事件通知;

(f)终端player变化通知;

(g)player地址变化通知;

(h)UIDs改变通知;

(i)Content of Now Playing变化通知;

CT想TG提供NOTIFY指令集,TG需要向已经注册的NOTIFY指令集给CT发送INTERIM响应;occurrence注册事件,TG发送CHANGED响应报告状态;CT可以定期更新需要NOTIFY的命令;为了有效性,我们应该限制事件数量;

还有其他一些功能,如continuation commands,Group navigation,Absolute Volume,Media Player Selection,Now Playing等,这里就不详细看了,我们开发时遇到随时查下spec就可以,了解就好;

2、协议描述
1)定时器
所有AV/C传输都应遵循下列时间周期,除非有明确的特定。
TG应在收到任何AV/C命令的100ms内应答。
有些AVRCP指定的AV/C控制命令不能立刻应答,此时应在既定时间内返回一个有着初始应答码的INTERIM,其后紧跟最终应答。 
TG生成1个控制命令的应答帧的时间周期是200ms。
TG生成1个通知命令的临时应答帧和状态命令的最终帧的时间周期是1000ms。
AVRCP特定浏览命令没有定义时间周期,但TG应尽快应答。

2)我们先看下AVRCP四种命令类型的帧格式:


        看到这里没有糊涂吧,想下前一篇介绍的AVCTP帧格式,AVCTP只定义了头,具体信息部分是由具体协议决定,上面就是AVRCP的协议格式;
        下面来看具体的格式,前面我们提到两种信道对应两种命令,这里也对应着两种信道,在Control channel,所有命令和应答格式如下:

另一种是browsing channel,格式如下:

四、实例
上面看完了AVCTP和AVRCP协议,下面我们看一个实例来加深理解;

笔者用耳机与手机连接,抓包后过滤只显示AVCTP与AVDTP包,显示如下:

笔者后面会继续看下AVDTP协议,AVDTP中定义了流媒体初始化的过程,这里我们先关注Event Notification包,看看其具体是怎么发送的,我们展开一包来看:

笔者特意将上一篇中的AVCTP中的图拿过来,实际抓包和spec中图一对比,我们很容易理解AVRCP/AVCTP/L2CAP的作用,我们可以看到从具体AVRCP协议到AVCTP协议框架到L2CAP层的数据,首先这是一个AVRCP Event notification,PDUID是Event notification,然后根据PDUID找到这个包可以包含的事件:

上面两张图片可以和spec中的事件对应起来,下面两个图,你可以根据我们给出的AVCTP和AVRCP协议找到对应的字节吧?如果对应不起来,请再把上面两篇文章再来一遍吧(注:这里AVCTP使用了A/V Remote Control,其PDUID= 0x0e11 );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值