android-蓝牙A2dp-avrcp-hfp-opp-配对流程-ble-rfcomm源码流程
Android 蓝牙A2dp-Avrcp初始化-连接-播放源码分析文档大全 - 点击下载
一、AVDTP概述
1.概念:
AVDTP( A/V Distribution Transport Protocol)就是音视频分布传输协议,主要用于传输音频/视频数据。在整个协议栈的架构图如下:
AVDTP的底层为L2CAP层,上层为A2DP层。
2.AVDTP常用的术语
Stream:两个点对点设备之间的流媒体数据;
Source (SRC) and Sink (SNK):SRC是音视频的发送方,SNK是音视频的接收方;
Initiator (INT) and Acceptor (ACP):启动过程的设备作为启动者、接受启动的设备为接收者。要注意的是INT和ACP独立于上层应用定义的SRC和SNK,也就是在一个CMD和RESPONSE中,发送CMD的是INT角色,回送RESPONSE的就是ACP角色;
Application and Transport Service Capabilities:应用服务和传输服务的功能。应用服务功能比如协商、配置音源设备的codec,内容保护系统等;传输服务能力比如数据报文的分割和重组,数据包的防丢检测等等;
Services, Service Categories, and Service Parameters:服务、服务类别、服务参数;
Media Packets, Recovery Packets, and Reporting Packets:流媒体包,数据恢复包,报告报文;
Stream End Point (SEP):流端点,流端点是为了协商一个流而公开可用传输服务和A/V功能的应用程序;
Stream Context (SC):流上下文。指在流设置过程中,两个对等设备达到一个公共的了解流的配置,包括选择的服务,参数,以及传输通道分配;
Stream Handle (SH):流句柄。在SRC和SNK建立了连接之后分配的一个独立的标识符,代表了上层对流的引用;
Stream End Point Identifier (SEID):流端点标识,对特定设备的跨设备引用,该引用用于信令事物;
Stream End Point State:流端点状态;
Transport Session:传输会话。在A/V传输层的内部,在配对的AVDTP实体之间,流可以分解为一个、两个或多个三个传输会话;
Transport Session Identifier (TSID):传输会话标识。代表对一个传输会话的引用;
Transport Channel:传输通道。传输通道指的是对A/V传输层下层承载程序的抽象,始终对应L2CAP的通;
Transport Channel Identifier (TCID):传输通道标识。代表对一个传输通道的引用。
3.AVDTP一共有以下几个组件(如下图):
(1)Signalling :命令以及命令响应交互通道;
(2)Stream Manager:流管理组件,一共有以下几种能力:传输流,组合media封包,时间戳管理,media封包序号管理,报告丢包给上层,抖动计算;
(3)Recovery:封包回复组件;
(4)Adaptation Layer:这层提供了一下几个能力:多路复用模式,允许在一个传输通道(TCID)上多路复用多个传输会话(TSID),使用更强劲头压缩。
除此之外,以上图示提供的功能如下表所示:
4.AVDTP传输服务
1)Basic Service:基本服务,当基本服务开启的时候只有两个组件可用(Signalling ,Stream Manager)。AVDTP基本服务确保通过单个传输通道传输每个会话的媒体包。该服务提供了适当的接口,使应用程序能够流进/流出满足传输通道的最大大小要求的包单元。当通道成功配置后,此包大小限制将返回给应用程序。
2)Recovery Service:在basic service的基础上加了Recovery组件。该恢复服务使用SRC端上的一个传输会话的媒体包来生成附加的编码包,这些恢复包可以在SNK端用于重建在空气传输路径上丢失的原始媒体包。这种服务特别适用于需要巨大带宽和重传能力有限的应用程序,为了有效地对抗干扰,所有恢复包都通过一个单独的传输通道传送。
3)Reporting Service:在recovery Service服务上增加了reporting,打开时,报告服务向本地用户提供统计信息应用程序和到远程设备的媒体流的时间对齐。报告服务可以配置为单向(从SNK到SRC或从SRC到SNK),也可以配置为双向。报告服务可以使用独立的传输通道传输报表数据包到远程端。
4)Adaptation Service – Multiplexing:在多路复用模式中,属于同一种或属于某一种的多个传输会话不同的流,可以共享一个公共传输(L2CAP)通道。此外,一个L2CAP数据包可以包含属于相同或不同传输的多个数据包会话。因此,每个封装头都需要媒体/报告/恢复包。包含在这个头中的TSID允许正确SNK设备上数据包的路由。
5)Adaptation Service – Robust Header Compression
6)Transport and Signaling Channel Establishment
二、AVDTP封包格式
1.AVDTP Signal封包格式
上表所示的就是Signal的header format,可以看到分3种封包格式:
1)单一封包
2)开始封包,一般用于封包大小>MTU的拆包的第一个封包
3)继续封包和结束封包,一般用于封包大小>MTU的继续封包和结束封包
参数解释:
Transaction Label:传输标示,4bit,INT角色来填写一个值,ACP必须回送一样的值
Packet Type:封包类型,有以下几种
Message Type:消息类型,有以下几种
Signal Identifier:信令标识符,有以下几种值
NOSP = Number Of Signal Packets:Start封包会告知后续有多少个封包要传输
2.AVDTP Media封包格式
其中有12byte是强制的一定要存在的,也就是上图浅灰色,也有可选存在的,也就是上图深灰色,下面我们来看下各个的field的概念。
Version(V):RTP版本,一般值是2,还有两个值但是一般不用,值为1就是RTP的草案版本,值为0是在最开始的”vat”音频工具中使用;
Padding(P):在包末尾填充1个或者多个byte表示填充,这部分忽略;
Extension(X):扩展位,此值如果是1,那么在固定头部后面加一个byte扩展位;
CSRC count(CC):表示CSRC标识符后面有多少Byte;
Marker (M):marke是由一个 profile定义的,用来允许在分组流中标记像帧边界之类的重要事件;
Payload Type (PT):有效荷载类型,占7位,用于说明RTP报文中有效载荷的类型,如GSM音频、JPEM图像等,在流媒体中大部分是用来区分音频流和视频流的,这样便于客户端进行解析。
Sequence Number:占16位,用于标识发送者所发送的RTP报文的序列号,每发送一个报文,序列号增1。这个字段当下层的承载协议用UDP的时候,网络状况不好的时候可以用来检查丢包。同时出现网络抖动的情况可以用来对数据进行重新排序,序列号的初始值是随机的,同时音频包和视频包的sequence是分别记数的。
Time Stamp:时间戳。实际上,时间戳增加1并不是我们通常意义上的过了一个微秒,而是增加了一个采样间隔那么长的时间。
SSRC:占32位,用于标识同步信源。该标识符是随机选择的,参加同一视频会议的两个同步信源不能有相同的SSRC。
CSRC list:每个CSRC标识符占32位,可以有0~15个。每个CSRC标识了包含在该RTP报文有效载荷中的所有特约信源。
后续的Media payload就是音频数据了。
三、AVDTP Service Capablities
Service Capablities格式如下:
此部分类似于T L V(Type Length Value)的类型,Service Category就是TYPE,Length Of Service Capabilities (LOSC)就是类似于length,也就是后面Service Capabilities Information Elements的长度,Service Capabilities Information Elements 这个就是特定的值。
Service Category有Media Transport、Reporting、Recovery、Media Codec、Content Protection、Header Compression、Multiplexing、Delay Reporting 8种类型,具体值如下表所示:
其中,Media Codec Capabilities 的命令格式如下表:
从表中可以看出,Media Codec Capabilities主要由Media Type、Media Codec Type、Media Codec Specific Information Elements三部分组成。其中Media Type有Audio、Video等值,Media Codec Type有SBC、AAC等类型,而Media Codec Specific Information Elements就是上层的一些codec信息,比如SBC等。
其中Media Type的值如下表所示:
其中Media Codec Type的值如下表所示:
其中A2DP定义的SBC的media codec信息如下所示
三、AVDTP错误码
四、AVDTP命令(signal)封包介绍
1.Stream End Point Discovery
每个AVDTP端都会注册一个或者多个SEP,通过SEID来标示,这个命令就是获取对端的SEP信息,包括SEID(SEP的ID),In Use(是否被使用),Media Type(Audio,Media,MultiMedia),TSEP(角色是Sink还是Source),流程如下:
AVDTP_DISCOVER_CMD这个命令是获取到remote端所有的SEP的信息,格式如下:
AVDTP_DISCOVER_RSP是对AVDTP_DISCOVER_CMD的回应,Payload中带有所有SEP的信息。格式如下:
SEID:SEP的ID,长度6bits,可用值是0x1~0x3e;
In Use:长度1bits,表示这个SEP是否被使用,为0表示未被使用,为1表示已被使用;
Media Type:长度1bits,用于表示type,0为audio,1为video;
TESP:长度1bits,用于表示Stream End Point类型是SRC还是SNK,为0表示SRC,为1表示SNK。
Stream End Point Discovery Reject命令格式如下:
2. Get All Capabilities
此命令是通过SEID来获取对方的Capabilities,其中Capabilities在第二节已经介绍,其程序流程如下:
Get All Capabilities Command格式如下:
Get All Capabilities Response命令格式如下:
Service Capablities主要由Service Category、Length Of Service Capabilities (LOSC)、Service Capabilities Information Elements三部分组成。其中,LOSC是Service Capabilities Information Elements的长度,Service Capabilities Information Elements 这个就是特定的值。具体的命令格式在第二小节已经介绍过了。
3. Set Configuration Command
在获取Capabilities后,此部分就是选择特定的功能参数,程序流程如下:
Get All Capabilities Command格式如下:
Get All Capabilities Response命令格式如下:
Service Capablities主要由Service Category、Length Of Service Capabilities (LOSC)、Service Capabilities Information Elements三部分组成。其中,LOSC是Service Capabilities Information Elements的长度,Service Capabilities Information Elements 这个就是特定的值。具体的命令格式在第二小节已经介绍过了。
3. Set Configuration Command
在获取Capabilities后,此部分就是选择特定的功能参数,程序流程如下:
其中,Set Configuration Command命令格式如下:
Set Configuration Response命令格式如下:
Set Configuration Reject命令格式如下:
4. Get Stream configuration
此命令用于根据SEID来获取配置,程序流程如下:
其中,Get Configuration Command命令格式如下:
Get Configuration Response命令格式如下:
5. Stream Reconfigure
此命令用于重新配对设置,程序流程如下:
其中:Reconfigure Command命令格式如下:
Reconfigure Response命令格式如下:
6. Stream Establishment
此命令用于打开某一个SEID,程序流程如下:
其中:Open Stream Command命令格式如下:
Open Stream Response 命令格式如下:
7. Stream Start
其中:Start Stream Command命令格式如下:
Start Stream Response命令格式如下:
Start Stream Reject命令格式如下:
8. Stream Release
此命令用于关闭一个media传输,程序流程如下:
其中:Close Stream Command命令格式如下:
Close Stream Response 命令格式如下:
9. Stream Suspend
此命令用于暂停一个media的传输,程序流程如下:
其中:Suspend Command命令格式如下:
Suspend Response命令格式如下:
10. Abort
此命令用于终止程序,在任何状态都可以下,程序指令流程如下:
11. Delay Report
程序流程如下:
其中:Delay Report Command命令格式如下:
Delay Report Response命令格式如下: