藍芽之十一 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.選單功能
這四類裝置都需要支援歌曲控制功能。
歌曲控制
這裡歌曲控制羅列比較通用的功能。
播放/暫停/停止/前一首/下一首。
上面是安卓原始碼定義的控制ID,想要實現控制的app程式碼如下:<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 */
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層的修改框架見前一篇文章。