蓝牙AVRCP协议概述
AVRCP(Audio/Video Remote Control Profile)定义了蓝牙设备和 audio/video 控制功能通信的特
 点和过程,另用于远程控制音视频设备,底层传输基于 AVCTP 传输协议。该 Profile 定义了AV/C 数字命令控制集。命令和信息通过 AVCTP(Audio/Video Control Transport Protocol)协议进
 行传输。浏览功能通过 AVCTP 的第二个 channel 而不是 AV/C。传输媒体信息通过基于 OBEX
 协议的 BIP(Bluetooth Basic Imaging Profile)协议。架构如下:
 
在我们协议栈的位置是:
 
 角色
 发送命令控制的就是 AVRCP controller(CT),那么接受命令的就是 AVRCP target(TG).
AVCTP 的连接分为两个通道:Control 通道跟 Brwoing 通道,对应的 L2CAP PSM 不同,control
 通道的 PSM 为 0x0017,AVCTP browing 通道的 PSM 为 0x001B,两个通道 controller 跟 target 角
 色都可以发起连接,注意一点,AVCTP browing 部分基于 L2CAP 不能用 basic mode,需要用
 到 Enhanced Retransmission Mode,而且在双方都支持 AVCTP browing 的情况下才能发起
 AVCTP browing channel 的连接;连接时,先建立 control通道,再建立brwoing通道,断开时反过来
VENDOR DEPENDENT 格式
 command格式
 
 Ctype:这个是 command 类型,一共分为 5 种,此定义在 AVC Digital Interface Command Set.pdf
 中有介绍,一般我们在 AVRCP 协议中会用到 3 中,分别是 CONTROL 控制命令,STATUS 获取
 状态命令,NOTIFY 通知命令,分别类型如下:
 
 Subunit_type:子信息类型,一般用9(PANEL)
 Subunit_id:此部分我们一般填 0
 Opcode:我们仅仅需要知道每个特定的 comamnd opcode 是什么就行,VENDOR DEPENDENT
 的值为 0。
 Company ID:此部分需要填写蓝牙 SIG 的 ID
response 格式
 
 response的值可以是A B C D F,个人简单理解:
 A REJECTED 拒绝执行command
 B IN TRANSITION 正在执行的过渡状态
 C implemented/stable 执行完成的稳定状
 D changed 标明目标设备的状态已发生变化
 E 保留
 F interim 目标已接收该请求,但无法在100ms内返回信息,将在未来某个时间,向控制器通知目标状态的变化
PASS THROUGH格式
 它的command和response格式如下:
 
 Operation_ID:操作 ID,从0-7f,包括音量加减啦,上下一曲啦,播放暂停啦等等
 State_flag:分 press 跟 realease 动作,发送press 的时候这个值为 0,realease 的时候这个值为 1
还有一些AVRCP的特定命令
 
 
 实际应用中我们一般只会用到 Get Capabiliby for event,来获取对端支持的 event,方便注册notify,可以看到上图支持播放状态改变,歌曲改变,播放器设置改变。
GetPlayStatus
 这个命令是 controller 像 target 发送获取播放状态的命令,返回值包括歌曲总长度,歌曲当
 前进度,以及播放状态,一共占用 9byte(4byte 歌曲长度,4byte 当前进度,1byte 播放状态)
还有注册通知命令
 
 
 有这些通知:
 
 上面说的支持哪些event,其实就是有哪些通知可以发,ct可以注册哪些通知
每个EVENT的具体response结构可以在官方文档查
还有很多的特定命令,这里没有列出
