蓝牙之十一 AVRCP协议

Profile简介

AVRCP子协议的作用是支持CT控制TG,具体来说如果手机和一个蓝牙音箱设备连接上了,那么音箱可以控制手机播放/暂停/切歌以及获得手机上播放歌曲的信息,如专辑,歌名,歌手,时长等信息。iphone对信息获取支持较为完善,安卓手机差异性比较大,且支持的没有iphone好。

Audio/Video Remote Control Profile(AVRCP)定义了蓝牙设备和audio/video控制功能通信的特点和过程。该Profile定义了AV/C数字命令控制集。命令和信息通过AVCTP(Audio/Video Control Transport Protocol)协议进行传输。浏览功能通过AVRCTP的第二个channel而不是AV/C。传输媒体信息通过基于OBEX协议的BIP(Bluetooth Basic Imaging Profile)协议。

蓝牙之十一 AVRCP协议_第1张图片

Audio/Video Remote Control Profile  依赖



蓝牙之十一 AVRCP协议_第2张图片

Profile栈

设备角色

CT(controller)设备:通过发送命令帧到目标发起传输。如PC,PDA,电话, 车载系统,耳机,播放/录音设备

TG(target)设备:接收命令并按命令响应的设备,如播放/录音设备,电视,耳机等。

分为四类设备

蓝牙之十一 AVRCP协议_第3张图片

1. 播放/录音功能

支持播放或者录音设备的基本操作

2.监视器/放大器功能

视频监视器或者音频放大器的基本操作

3.调谐器功能

音视频调谐器的基本操作

4.菜单功能

这四类设备都需要支持歌曲控制功能。

歌曲控制

这里歌曲控制罗列比较通用的功能。

播放/暂停/停止/前一首/下一首。

 
public static final int PASSTHROUGH_ID_PLAY        = 0x44;    /* play */
 public static final int PASSTHROUGH_ID_STOP        = 0x45;    /* stop */
 public static final int PASSTHROUGH_ID_PAUSE       = 0x46;    /* pause */
 public static final int PASSTHROUGH_ID_FORWARD     = 0x4B;    /* forward */
 public static final int PASSTHROUGH_ID_BACKWARD    = 0x4C;    /* backward */
上面是安卓源码定义的控制ID,想要实现控制的app代码如下:
    private void sendCommand(int keyCode){
        if (mAvrcpController == null)
            return;

        List devices = mAvrcpController.getConnectedDevices();
        for (BluetoothDevice device : devices){
            Log.d(TAG, "send command to device: "+ keyCode + device.getName() + " " + device.getAddress());
            mAvrcpController.sendPassThroughCmd(device, keyCode, BluetoothAvrcp.PASSTHROUGH_STATE_PRESS);
            mAvrcpController.sendPassThroughCmd(device, keyCode, BluetoothAvrcp.PASSTHROUGH_STATE_RELEASE);
        }
    }

    public void onPlayButtonClick(View view){
        sendCommand(BluetoothAvrcp.PASSTHROUGH_ID_PLAY);
    }
它们使用的是passthrogh command,这些命令在手册有说明。

蓝牙之十一 AVRCP协议_第4张图片

除此还有获取歌曲信息的接口,android6.0协议栈并没有实现,但是手册中有该协议command和response说明。

信息获取

蓝牙之十一 AVRCP协议_第5张图片

对应需要修改system/bt协议栈中的btif_rc.c文件,将命令封包和解包,对native和frameworks以及package层的修改框架见前一篇文章。

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