1. 程式人生 > >藍芽之十一 AVRCP協議

藍芽之十一 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)協議。

Audio/Video Remote Control Profile  依賴


Profile棧

裝置角色

CT(controller)裝置:通過傳送命令幀到目標發起傳輸。如PC,PDA,電話, 車載系統,耳機,播放/錄音裝置

TG(target)裝置:接收命令並按命令響應的裝置,如播放/錄音裝置,電視,耳機等。

分為四類裝置


1. 播放/錄音功能

支援播放或者錄音裝置的基本操作

2.監視器/放大器功能

視訊監視器或者音訊放大器的基本操作

3.調諧器功能

音視訊調諧器的基本操作

4.選單功能

這四類裝置都需要支援歌曲控制功能。

歌曲控制

這裡歌曲控制羅列比較通用的功能。

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

<BluetoothAvrcp.java> 
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<BluetoothDevice> 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,這些命令在手冊有說明。

除此還有獲取歌曲資訊的介面,android6.0協議棧並沒有實現,但是手冊中有該協議command和response說明。

資訊獲取

對應需要修改system/bt協議棧中的btif_rc.c檔案,將命令封包和解包,對native和frameworks以及package層的修改框架見前一篇文章。