蓝牙学习笔记之AVCTP_AVRCP协议(八)

目录

AVCTP协议简述

AVCTP简介

Avctp协议数据格式

无分包数据格式

有分包数据格式

AVRCP协议简述

AVRCP简介

Avrcp支持的特性

Avrcp操作流程

Avrcp定义的控制指令

AVRCP协议数据交互格式

获取TG所具有的能力(GetCapabilities)

AVCTP_AVRCP协议数据分析


AVCTP协议简述

学习要点:

  • avctp交互流程
  • avdtp交互数据包格式

AVCTP简介

AVCTP协议用来在支持A/V属性的设备之间传输指令和回复消息,这个协议可以使设备同时至少支持一个控制协议,使用的每个协议都会定义在消息格式或者使用规则中。

AVCTP协议描述了蓝牙设备间Audio/Video的控制信号交换的格式和机制,它是一个总体的协议,具体的控制信息由其指定的协议(如AVRCP)实现,AVCTP本身只指定控制command和response的总体的格式。

AVCTP协议比较简单,其具体的交互流程可以参考下图:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第1张图片

即由控制器(CT,controller)发送指令,由目标设备(TG,target)接收指令并执行,当执行完之后,TG决定是否需要回复,具体根据指令类型。

Avctp协议数据格式

上面介绍了avctp的交互流程,我们下面来介绍一下他的协议格式,其格式分为两种,一种是没有分包的,一种是有分包的。

  • 无分包数据格式

无分包即单一包的格式如下图所示:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第2张图片

Transaction label传输标识,由应用程序指定。

Packet_type当为零时代表为一个单独的数据包。

C/R指定该包是指令还是回复,为0时代表该包是指令。

IPID在指令包中设置为0,在回复包中指示是否收到了一个有效的PID。

PID上层协议的类型如AVRCP等,其实质是一个UUID,定义在SIG分配的编号中,可以在SDP定义编号中查找到。

AVCTP Command/Response Message InformationAVRCP数据,下文中再具体介绍。

  • 有分包数据格式

有分包的格式分为起始包,中间包和结束包,具体格式如下图所示:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第3张图片

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第4张图片

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第5张图片

Pack_type为1时代表起始包,为2时代表中间包,为3时代表结束包。

Number of AVCTP Packets在这个指令消息总的数据包的数目。

RFA留给将来使用,此处设置为0.

其他位在上文中已经介绍过,此处不在重复。

关于AVCTP协议的简述,如果还有其他疑问,可以去查阅核心协议文档,核心协议文档可以在我博客<学习笔记(序)>的百度链接中找到。

 

AVRCP协议简述

学习要点:

  • avrcp使用场景
  • avrcp交互流程
  • avrcp交互数据包格式

AVRCP简介

Avrcp协议定义了蓝牙设备为支持音频/视频远程控制的的特征和操作请求场景。协议中,控制器将检测到的用户动作转换为A/V控制信号,然后将其传输到远程蓝牙设备,该功能的实现类似于红外遥控法。除此之外,该协议使用特定于蓝牙的扩展来支持相关元数据的传输内容在蓝牙设备之间传输,例如传输歌曲信息数据。协议提供的浏览功能,允许远程控制器在远程目标设备上,操纵媒体和控制特定的媒体播放器。

下图是avrcp在整个stack中的结构图:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第6张图片

Avrcp定义了两种角色CT(controller)和TG(target),CT就是可以发送命令控制TG的设备,如蓝牙耳机;TG可以接收CT发过来的指令,同时也能通知CT一些状态的改变,如手机。

Avrcp支持的特性

在协议《AVRCP_v1.6.1》的第三章介绍了avrcp支持的特性,这些特性规定了可以进行哪些控制操作,比如avrcp的连接/断开,控制音乐的播放/暂停、上一曲/下一曲等等,具体如下图所示:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第7张图片

Avrcp操作流程

上节我们说了avrcp支持的特性,要针对这些特性操作,比如建立AVRCP连接、发送控制指令、获取歌曲信息等等,基本都是按照一套具体的操作流程,在《AVRCP_v1.6.1》的第4章对每个流程有具体的介绍,这里我们举例CT发指令控制TG的流程简单的说一下。

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第8张图片

从上图中我们可以看到,在连接已经建立的条件下,首先由CT端发送了一个AV/C的指令(比如播放),TG收到指令之后开始执行(播放音乐操作),最后对执行结果给CT一个回复。其他操作的流程也与之类似:command-response。

顺便说一下,AV/V command定义了四种操作的类型,在数据包的unit_type字段,在最后数据分析的每个数据包中都可以看到,如下图所示的:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第9张图片

这些在蓝牙协议文档中是没有详细说明的,想要知道关于这些类型更多的描述,请参考《AV/C Panel Subunit》和《AV/C Digital Interface Command Set General》文档,此文档可以在我的博客<学习笔记(序)>最下面的百度链接中找到,需要的自行下载。​​​​​​​

Avrcp定义的控制指令

上面我们说到avcrp的操作流程,其中有一个是CT对TG的控制操作,协议对具体可操作的指令进行了规定,如下图所示,此处我只是截取了以小部分,详细内容请看《AVRCP_v1.6.1》第4.5节。

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第10张图片

AVRCP协议数据交互格式

每个种实际的操作都对应了不同的数据包的格式与内容,这里我只对获取TG功能的数据格式做一个简要说明,相关内容都在《AVRCP_v1.6.1》第6章,其他操作的格式与内容大家可以去看协议的第6章。​​​​​​​​​​​​​​

  • 获取TG所具有的能力(GetCapabilities

协议文档关于每个实际的操作,在文档附件中都有一个实例,在《AVRCP_v1.6.1》第25章,下面贴一个获取能力指令的数据格式例子,其他有兴趣的可以自行查阅,如下图所示:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第11张图片

​​​​​​​1)、command

发送的命令的参数只有一个字节,参数的类型为COMPANY_ID (0x2)和EVENTS_SUPPORTED(0x3)

2)、response

当指令参数为COMPANY_ID时,回复包数据格式为:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第12张图片

Capabilities的第一个参数一定是 0x00 0x31 0x58(BT_SIG),这是SIG的公司标识,可以在蓝牙官网定义的编号中找到。

当指令参数为EVENTS_SUPPORTED时,回复包数据格式为:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第13张图片

其中Capabilities参数在《AVRCP_v1.6.1》第28章,如下图所示:

蓝牙学习笔记之AVCTP_AVRCP协议(八)_第14张图片

AVCTP_AVRCP协议数据分析

上面我们对两个协议的内容都做了一下简单的介绍,下面我们将对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:00010x01,本次交互的传输标签为1

Packet Type:00(为零时间代表此包是没有分包的数据)

Command/Response:0(为0时代表命令)

IPID Indicator:0(在指令包中该位无效)

Profile Identifier:00010001 000011100x110eAVRCP的标识,在下面的链接中可以查看:https://www.bluetooth.com/specifications/assigned-numbers/service-discovery

AVRCP

RFA:0000(默认值为零)

Command Type:0001 STATUS

Subunit Type:010010x09,则类型为PANEL

Subunit ID:0000x000

Operation code:000000000x00VENDOR-DEPENDENT

Company Id:00000000 00011001 010110000x00 0x19 0x58BT SIG的公司id

PDU ID:000100000x10,查表可知为Get Capabilities

RFA:0000000x00,保留将来使用,默认为零)

Packet type:000x00,数据包没有分包)

Parameter Length:00000000 000000010x0001,参数长度为1

Capability ID:000000110x03,获取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:00010x01,本次交互的传输标签为1

Packet Type:00(为零时间代表此包是没有分包的数据)

Command/Response:1(为1时代表回复)

IPID Indicator:0(为0代表收到的指令是有效的)

Profile Identifier:00010001 000011100x110eAVRCP

AVRCP

RFA:0000(默认值为零)

Response:11000x0cSTABLE

Subunit Type:010010x09,则类型为PANEL

Subunit ID:0000x000

Operation code:000000000x00VENDOR-DEPENDENT

Company Id:00000000 00011001 010110000x00 0x19 0x58BT SIG的公司id

PDU ID:000100000x10,查表可知为Get Capabilities

RFA:0000000x00,保留将来使用,默认为零)

Packet type:000x00,数据包没有分包)

Parameter Length:00000000 000001100x0006,参数长度为6

Capability ID:000000110x03,返回TG支持的事件)

Capability count:000001000x04,支持的事件的数量为4

Event ID:000000010x01,查表可知为EVENT_PLAYBACK_STATUS_CHANGED

Event ID:000000100x02,查表可知为EVENT_TRACK_CHANGED

Event ID:000001010x05,查表可知为EVENT_PLAYBACK_POS_CHANGED

Event ID:000010000x08,查表可知为EVENT_PLAYER_APPLICATION_SETTING _CHANGED

篇幅原因,上面我只举了前两个协议交互例子进行分析,后续的协议的log以及数据分析,以及相关资料,请到我的博客<蓝牙学习笔记(序)>最下面的网盘链接中下载!​​​​​​​

你可能感兴趣的:(蓝牙协议栈)