目录
AVCTP协议简述
AVCTP简介
Avctp协议数据格式
无分包数据格式
有分包数据格式
AVRCP协议简述
AVRCP简介
Avrcp支持的特性
Avrcp操作流程
Avrcp定义的控制指令
AVRCP协议数据交互格式
获取TG所具有的能力(GetCapabilities)
AVCTP_AVRCP协议数据分析
学习要点:
AVCTP协议用来在支持A/V属性的设备之间传输指令和回复消息,这个协议可以使设备同时至少支持一个控制协议,使用的每个协议都会定义在消息格式或者使用规则中。
AVCTP协议描述了蓝牙设备间Audio/Video的控制信号交换的格式和机制,它是一个总体的协议,具体的控制信息由其指定的协议(如AVRCP)实现,AVCTP本身只指定控制command和response的总体的格式。
AVCTP协议比较简单,其具体的交互流程可以参考下图:
即由控制器(CT,controller)发送指令,由目标设备(TG,target)接收指令并执行,当执行完之后,TG决定是否需要回复,具体根据指令类型。
上面介绍了avctp的交互流程,我们下面来介绍一下他的协议格式,其格式分为两种,一种是没有分包的,一种是有分包的。
无分包即单一包的格式如下图所示:
Transaction label:传输标识,由应用程序指定。
Packet_type:当为零时代表为一个单独的数据包。
C/R:指定该包是指令还是回复,为0时代表该包是指令。
IPID:在指令包中设置为0,在回复包中指示是否收到了一个有效的PID。
PID:上层协议的类型如AVRCP等,其实质是一个UUID,定义在SIG分配的编号中,可以在SDP定义编号中查找到。
AVCTP Command/Response Message Information:AVRCP数据,下文中再具体介绍。
有分包的格式分为起始包,中间包和结束包,具体格式如下图所示:
Pack_type:为1时代表起始包,为2时代表中间包,为3时代表结束包。
Number of AVCTP Packets:在这个指令消息总的数据包的数目。
RFA:留给将来使用,此处设置为0.
其他位在上文中已经介绍过,此处不在重复。
关于AVCTP协议的简述,如果还有其他疑问,可以去查阅核心协议文档,核心协议文档可以在我博客<学习笔记(序)>的百度链接中找到。
学习要点:
Avrcp协议定义了蓝牙设备为支持音频/视频远程控制的的特征和操作请求场景。协议中,控制器将检测到的用户动作转换为A/V控制信号,然后将其传输到远程蓝牙设备,该功能的实现类似于红外遥控法。除此之外,该协议使用特定于蓝牙的扩展来支持相关元数据的传输内容在蓝牙设备之间传输,例如传输歌曲信息数据。协议提供的浏览功能,允许远程控制器在远程目标设备上,操纵媒体和控制特定的媒体播放器。
下图是avrcp在整个stack中的结构图:
Avrcp定义了两种角色CT(controller)和TG(target),CT就是可以发送命令控制TG的设备,如蓝牙耳机;TG可以接收CT发过来的指令,同时也能通知CT一些状态的改变,如手机。
在协议《AVRCP_v1.6.1》的第三章介绍了avrcp支持的特性,这些特性规定了可以进行哪些控制操作,比如avrcp的连接/断开,控制音乐的播放/暂停、上一曲/下一曲等等,具体如下图所示:
上节我们说了avrcp支持的特性,要针对这些特性操作,比如建立AVRCP连接、发送控制指令、获取歌曲信息等等,基本都是按照一套具体的操作流程,在《AVRCP_v1.6.1》的第4章对每个流程有具体的介绍,这里我们举例CT发指令控制TG的流程简单的说一下。
从上图中我们可以看到,在连接已经建立的条件下,首先由CT端发送了一个AV/C的指令(比如播放),TG收到指令之后开始执行(播放音乐操作),最后对执行结果给CT一个回复。其他操作的流程也与之类似:command-response。
顺便说一下,AV/V command定义了四种操作的类型,在数据包的unit_type字段,在最后数据分析的每个数据包中都可以看到,如下图所示的:
这些在蓝牙协议文档中是没有详细说明的,想要知道关于这些类型更多的描述,请参考《AV/C Panel Subunit》和《AV/C Digital Interface Command Set General》文档,此文档可以在我的博客<学习笔记(序)>最下面的百度链接中找到,需要的自行下载。
上面我们说到avcrp的操作流程,其中有一个是CT对TG的控制操作,协议对具体可操作的指令进行了规定,如下图所示,此处我只是截取了以小部分,详细内容请看《AVRCP_v1.6.1》第4.5节。
每个种实际的操作都对应了不同的数据包的格式与内容,这里我只对获取TG功能的数据格式做一个简要说明,相关内容都在《AVRCP_v1.6.1》第6章,其他操作的格式与内容大家可以去看协议的第6章。
协议文档关于每个实际的操作,在文档附件中都有一个实例,在《AVRCP_v1.6.1》第25章,下面贴一个获取能力指令的数据格式例子,其他有兴趣的可以自行查阅,如下图所示:
1)、command
发送的命令的参数只有一个字节,参数的类型为COMPANY_ID (0x2)和EVENTS_SUPPORTED(0x3)
2)、response
当指令参数为COMPANY_ID时,回复包数据格式为:
Capabilities的第一个参数一定是 0x00 0x31 0x58(BT_SIG),这是SIG的公司标识,可以在蓝牙官网定义的编号中找到。
当指令参数为EVENTS_SUPPORTED时,回复包数据格式为:
其中Capabilities参数在《AVRCP_v1.6.1》第28章,如下图所示:
上面我们对两个协议的内容都做了一下简单的介绍,下面我们将对AVCTP_AVRCP完整的一次建立过程进行数据分析。
以下蓝色为HCI部分、绿色为L2CAP部分、紫色为AVCTP部分数据,红色为AVRCP部分数据,这里我只针对AVCTP和AVRCP协议进行解析,如果你对其他协议有兴趣,可以去看我的其他协议的数据分析。
1、Controller(CT)
00000010 00000101 00100000 00010010 00000000 00001110 00000000 01001100 00000000 00010000 00010001 00001110 00000001 01001000 00000000 00000000 00011001 01011000 00010000 00000000 00000000 00000001 00000011
AVCTP:
Transaction Label:0001(0x01,本次交互的传输标签为1)
Packet Type:00(为零时间代表此包是没有分包的数据)
Command/Response:0(为0时代表命令)
IPID Indicator:0(在指令包中该位无效)
Profile Identifier:00010001 00001110(0x110e,AVRCP的标识,在下面的链接中可以查看:https://www.bluetooth.com/specifications/assigned-numbers/service-discovery)
AVRCP:
RFA:0000(默认值为零)
Command Type:0001( STATUS)
Subunit Type:01001(0x09,则类型为PANEL)
Subunit ID:000(0x00,0)
Operation code:00000000(0x00,VENDOR-DEPENDENT)
Company Id:00000000 00011001 01011000(0x00 0x19 0x58,BT SIG的公司id)
PDU ID:00010000(0x10,查表可知为Get Capabilities)
RFA:000000(0x00,保留将来使用,默认为零)
Packet type:00(0x00,数据包没有分包)
Parameter Length:00000000 00000001(0x0001,参数长度为1)
Capability ID:00000011(0x03,获取TG支持的事件,该事件列表在AVRCP协议的28章)
2、Target(TG)
00000010 00000101 00100000 00010111 00000000 00010011 00000000 10000011 00000010 00010010 00010001 00001110 00001100 01001000 00000000 00000000 00011001 01011000 00010000 00000000 00000000 00000110 00000011 00000100 00000001 00000010 00000101 00001000
AVCTP:
Transaction Label:0001(0x01,本次交互的传输标签为1)
Packet Type:00(为零时间代表此包是没有分包的数据)
Command/Response:1(为1时代表回复)
IPID Indicator:0(为0代表收到的指令是有效的)
Profile Identifier:00010001 00001110(0x110e,AVRCP)
AVRCP:
RFA:0000(默认值为零)
Response:1100(0x0c,STABLE)
Subunit Type:01001(0x09,则类型为PANEL)
Subunit ID:000(0x00,0)
Operation code:00000000(0x00,VENDOR-DEPENDENT)
Company Id:00000000 00011001 01011000(0x00 0x19 0x58,BT SIG的公司id)
PDU ID:00010000(0x10,查表可知为Get Capabilities)
RFA:000000(0x00,保留将来使用,默认为零)
Packet type:00(0x00,数据包没有分包)
Parameter Length:00000000 00000110(0x0006,参数长度为6)
Capability ID:00000011(0x03,返回TG支持的事件)
Capability count:00000100(0x04,支持的事件的数量为4)
Event ID:00000001(0x01,查表可知为EVENT_PLAYBACK_STATUS_CHANGED)
Event ID:00000010(0x02,查表可知为EVENT_TRACK_CHANGED)
Event ID:00000101(0x05,查表可知为EVENT_PLAYBACK_POS_CHANGED)
Event ID:00001000(0x08,查表可知为EVENT_PLAYER_APPLICATION_SETTING _CHANGED)
篇幅原因,上面我只举了前两个协议交互例子进行分析,后续的协议的log以及数据分析,以及相关资料,请到我的博客<蓝牙学习笔记(序)>最下面的网盘链接中下载!