A2DP和AVRCP蓝牙音频传输协议
1.A2DP全名是Advenced Audio Distribution Profile蓝牙音频传输模型拹定。
A2DP 规定了使用蓝牙非同步传输信道方式,传输高质量音乐文件数据的拹议堆栈软件和使用方法,基于该拹议就能通过以蓝牙方式传事输高品质的音乐了,
例如可以利用立体声蓝牙耳机或蓝牙音响设备来收听音乐了。A2DP和AVRCP是一对兄弟,A2DP里WM设备是控制端,蓝牙耳机是接收端,AVRCP反之,这里说的就是WM如何接收蓝牙耳机发送的AVRCP并处理的过程。
2.AVRCP全名是Audio Video Remote Cortrol Profile音频/视频远程控制配置文件。
AVRCP 设计用于提供控制 TV、Hi-fi 设备等的标准接口。此配置文件用于许可单个远程控制设备(或其它设备)控制所有用户可以接入的 A/V 设备。
AVRCP 定义了如何控制流媒体的特征。包括暂停、停止、启动重放、音量控制及其它类型的远程控制操作。
AVRCP(Audio/Video Remote Control Profile)是一种在蓝牙协议栈A2DP/AVCTP上实现的控制技术,通俗点说,就是你用蓝牙耳机听歌时按一下拨号键它会暂停,按下选曲它会切换,这就是AVRCP的功劳。
栗子:手机通过蓝牙连接音箱,播放手机上的音乐。
Audio Source:发送音频流 //手机端
Audio Sink:接收音频流 //音箱端
A2DP
AVCTP Audio/Video Control Transport Protocol 音频/视频控制传输协议(通过L2CAP传输AV/C指令) 通过L2CAP通道由远程控制规范去发送AV/C指令
AVRCP
AVDTP Audio/Video Distribution Transport Protocol 音频/视频分发传输协议(通过L2CAP向立体声耳机传输音乐文件) 通过L2CAP通道由高级音频分发规范将音乐传输到立体声耳机
Audio 音频
TCP/UDP
PPP/BNEP 网络
SDP 服务发现协议 为实现蓝牙设备之间相互查询及访问对方提供的服务
TCS 电话控制
AT 指令集
OBEX 对象交换协议
RFCOMM 串口仿真
L2CAP 逻辑链路控制与适配协议
persist.bluetooth.btsnoopenable
一次完整的连接:connect Event
设备发现过程:
Advertise: 从机处于广播状态
Scan Request: 主机接收到广播后发送扫描请求到外设
Scan Response: 从机接收请求后返回扫描响应到主机
Establish Link Request:主机向从机发送一个链接请求
Pairing:配对过程,产生加密肯认证密钥
Bonding:绑定过程,主从机绑定后下次连接可以快速配对
蓝牙技术应用框架协议堆栈
通用访问框架(GAP)
服务发现框架(SDAP)
扩展服务发现框架(ESDP)
硬拷贝电缆替代框架(HCRP)
个人局域网框架(PANP)
电话控制协议规范框架(TCSP)
无绳电话框架(CTP)
对讲机框架(IntP)
音频/视频遥控框架(AVRCP)
蓝牙音频视频控制传输协议(AVCTP)
通用音频/视频分发框架(GAVDP)
高级音频分发框架(A2DP)
视频分发框架(VDP)
串口框架(SPP)
拨号上网框架(DUNP)
传真框架(FaxP)
头戴式设备框架(HSP)
局域网访问框架(LAP)
免提框架(HFP)
通用对象交换框架(GOEP)
文件传输框架(FTP)
对象推送框架(OPP)
同步框架(SP)
基本打印框架(BPP)
基本成像框架(BIP)
A2DP 高级音频分发框架
异步无连接链路(ACL)
音频数据 -> 耳机或音箱
点对点的音频分发
AVCTP
09-03 21:01:02.187 503 787 W bt_btif : bta_av_str_closed: peer_addr=18:bb:26:e1:61:14 open_status=0 chnl=64 hndl=65 co_started=1
09-03 21:01:02.187 503 787 E bt_btif : bta_av_str_stopped: audio_open_cnt=1, p_data 0x0
09-03 21:01:02.187 503 787 W bt_btif : bta_dm_rm_cback:2, status:6
09-03 21:01:02.188 503 639 W bt_btif : btif_av_state_started_handler: event=BTA_AV_STOP_EVT flags=0x0
09-03 21:01:02.188 503 787 W bt_btif : bta_dm_rm_cback:2, status:1
09-03 21:01:02.188 503 639 W bt_btif : ## ON A2DP STOPPED ##
09-03 21:01:02.188 503 639 I BluetoothA2dpServiceJni: bta2dp_audio_state_callback
09-03 21:01:02.188 503 787 E bt_btif : bta_av_rc_create ACP handle exist for shdl:0
09-03 21:01:02.189 503 807 W bt_btif : btif_a2dp_command_ack: ## a2dp ack : A2DP_CTRL_CMD_NONE, status 0 ##
09-03 21:01:02.189 503 808 W bt_btif : btif_a2dp_data_cb: BTIF MEDIA (A2DP-DATA) EVENT UIPC_CLOSE_EVT
09-03 21:01:02.189 503 807 E bt_btif : btif_a2dp_command_ack: warning : no command pending, ignore ack
09-03 21:01:02.189 503 808 W bt_btif : btif_a2dp_command_ack: ## a2dp ack : A2DP_CTRL_CMD_NONE, status 0 ##
09-03 21:01:02.189 503 807 D a2dp_sbc_encoder: a2dp_sbc_feeding_reset: PCM bytes per tick 3528
09-03 21:01:02.189 503 808 E bt_btif : btif_a2dp_command_ack: warning : no command pending, ignore ack
09-03 21:01:02.190 503 639 W bt_btif : ## ON A2DP STOPPED ##
09-03 21:01:02.190 503 806 D A2dpStateMachine: Connected process message: 101
09-03 21:01:02.191 503 639 I BluetoothA2dpServiceJni: bta2dp_connection_state_callback
09-03 21:01:02.191 503 807 D a2dp_sbc_encoder: a2dp_sbc_feeding_reset: PCM bytes per tick 3528
09-03 21:01:02.191 503 639 D a2dp_codec: init
09-03 21:01:02.191 503 639 D a2dp_codec: createCodec: codec SBC
09-03 21:01:02.191 503 639 I a2dp_codec: init: updated SBC codec priority to 1001
09-03 21:01:02.192 503 639 D a2dp_codec: createCodec: codec AAC
09-03 21:01:02.192 503 639 I a2dp_codec: init: updated AAC codec priority to 2001
09-03 21:01:02.192 503 639 D a2dp_codec: createCodec: codec aptX
09-03 21:01:02.193 503 806 D A2dpStateMachine: A2DP Playing state : device: 18:BB:26:E1:61:14 State:10->11
09-03 21:01:02.193 503 806 D A2dpStateMachine: Connected process message: 101
09-03 21:01:02.195 503 639 D a2dp_codec: createCodec: codec aptX-HD
09-03 21:01:02.202 503 806 D A2dpStateMachine: Enter Disconnected: 101
09-03 21:01:02.204 503 503 D A2dpStateMachine: Connection state 18:BB:26:E1:61:14: 2->0
09-03 21:01:02.225 503 808 W bt_btif : btif_a2dp_ctrl_cb: A2DP-CTRL-CHANNEL EVENT UIPC_RX_DATA_READY_EVT
09-03 21:01:02.225 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: a2dp-ctrl-cmd : A2DP_CTRL_CMD_START
09-03 21:01:02.225 503 808 W bt_btif : btif_av_stream_started_ready: sm_handle=-448876552 state=0 flags=0x0 ready=0
09-03 21:01:02.226 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: A2DP command A2DP_CTRL_CMD_START while AV stream is not ready
09-03 21:01:02.226 503 808 W bt_btif : btif_a2dp_command_ack: ## a2dp ack : A2DP_CTRL_CMD_START, status 1 ##
09-03 21:01:02.226 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: a2dp-ctrl-cmd : A2DP_CTRL_CMD_START DONE
09-03 21:01:02.248 503 808 W bt_btif : btif_a2dp_ctrl_cb: A2DP-CTRL-CHANNEL EVENT UIPC_RX_DATA_READY_EVT
09-03 21:01:02.248 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: a2dp-ctrl-cmd : A2DP_CTRL_CMD_START
09-03 21:01:02.248 503 808 W bt_btif : btif_av_stream_started_ready: sm_handle=-448876552 state=0 flags=0x0 ready=0
09-03 21:01:02.248 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: A2DP command A2DP_CTRL_CMD_START while AV stream is not ready
09-03 21:01:02.248 503 808 W bt_btif : btif_a2dp_command_ack: ## a2dp ack : A2DP_CTRL_CMD_START, status 1 ##
09-03 21:01:02.248 503 808 W bt_btif : btif_a2dp_recv_ctrl_data: a2dp-ctrl-cmd : A2DP_CTRL_CMD_START DONE
09-03 21:01:02.248 503 639 D a2dp_codec: createCodec: codec LDAC
09-03 21:01:02.249 503 639 I a2dp_codec: init: updated LDAC codec priority to 5001
09-03 21:01:02.249 503 639 D a2dp_codec: createCodec: codec SBC SINK
09-03 21:01:02.250 503 639 I a2dp_codec: init: initialized Source codec LDAC
09-03 21:01:02.250 503 639 I a2dp_codec: init: initialized Source codec AAC
09-03 21:01:02.250 503 639 I a2dp_codec: init: initialized Source codec SBC
09-03 21:01:02.251 503 639 I a2dp_codec: init: initialized Sink codec SBC(Sink)
09-03 21:01:02.253 503 639 W bt_btif : ## ON A2DP IDLE ## peer_sep = 1
09-03 21:01:02.254 503 807 D a2dp_sbc_encoder: a2dp_sbc_feeding_reset: PCM bytes per tick 3528
09-03 21:01:02.254 503 639 I BluetoothA2dpServiceJni: bta2dp_audio_config_callback