一、WFD Source作为RTSP Server,如果使用P2P进行WFD的连接,那么WFD device应该在WPA2四次握手的M4(不是RTSP M4)消息后的90s内完成RTSP的TCP连接
二、RTSP流程
三、
M1-M7以及M16实例以及说明
以wireshark录到的空中包进行说明,空中包仅仅说明的是正常交互时的数据
1、M1
M1 Request(Source->Sink)
(1)Date和Server不是必须的,可以不用关注
(2)CSeq的值可以随机设置,但是之后Source每次发送Request,Cseq值都要加1
(3)其余的是固定格式
M1 Response(Sink->Source)
(1)CSeq的值需要跟Request的值相同
(2)其余的是固定格式
2、M2
M2 Request(Sink->Source)
(1)CSeq的值可以随机设置,但是之后Sink每次发送Request,Cseq值都要加1
(2)其余的是固定格式
M2 Response(Source->Sink)
(1)Date和Server不是必须的,可以不用关注
(2)CSeq的值需要跟Request的值相同
(3)其余的是固定格式
3、M3
M3 Request(Source->Sink)
下面是content的内容
(1)Date和Server不是必须的,可以不用关注
(2)Content-length表示Content的长度,即上图中所有数据的总长度。
(3)上一次Source发送Request时CSeq的值是1,所以这一次CSeq需要加1,即CSeq的值为2
(4)上图中每一行都是Source想要从Sink获取的属性,Sink端只需要将自己支持的属性发送给Source即可
(5)其余的是固定格式
M3 Response(Sink->Source)
下面是content的内容
(1)Content-length表示Content的长度,即上图中所有数据的总长度。
(2)CSeq的值需要跟Request的值相同
(3)可以看到,Sink只回复了手机wfd_client_rtp_ports、wfd_audio_codecs、wfd_video_formats、wfd_content_protection、wfd_uibc_capability五项以及Sink端对应的具体属性值,其余的sink端不支持,所以没有回复。各项的具体信息参照wfd的协议
4、M4
M4 Request(Source->Sink)
下面是content的内容
(1)Date和Server不是必须的,可以不用关注
(2)Content-length表示Content的长度,即上图中所有数据的总长度。
(3)上一次Source发送Request时CSeq的值是2,所以这一次CSeq需要加1,即CSeq的值为3
(4)上图中每一行都是Source根据Sink发送的属性以及自己支持的属性进行对比协商后确定的。
(5)其余的是固定格式
M4 Response(Sink->Source)
(1)CSeq的值需要跟Request的值相同
(2)其余的是固定格式
到这里WFD capability negotiation就完成了
5、M5
M5 Request(Source->Sink)
下面是content的内容
(1)Date和Server不是必须的,可以不用关注
(2)Content-length表示Content的长度,即上图中所有数据的总长度。
(3)上一次Source发送Request时CSeq的值是3,所以这一次CSeq需要加1,即CSeq的值为4
(4)上图中wfd_trigger_method: SETUP\r\n表示Source请求Sink触发SETUP动作
(5)其余的是固定格式
M5 Response(Sink->Source)
(1)CSeq的值需要跟Request的值相同
(2)其余的是固定格式
6、M6
M6 Request (Sink->Source)
(1)上一次Sink发送Request时CSeq的值是1,所以这一次CSeq需要加1,即CSeq的值为2
(2)rtsp://192.168.137.95/wfd1.0/streamid=0就是M4 Request中wfd-presentation-url对应的值
(3)Transport中client_port表示的是sink端监听RTP流(里面封装的是MPEG2-TS流)的端口,我们目前只支持RTP,不支持RTCP,所以只有一个端口,如果支持RTCP,client_port应该这么设置client_port=1028-1029
(4)其余的是固定格式
M6 Response(Source->Sink)
(1)Date和Server不是必须的,可以不用关注
(2)CSeq的值需要跟Request的值相同
(3)Session后面的值是session id,timeout表示的是wfd M16发送的最大间隔是30s,两次M16 request的发送间隔,要小于30-5s,M16用wfd用来周期性确定sink端状态的,类似于心跳
(4)client_port是sink端监听RTP流的端口,server_port是source端发送RTP流的端口
(5)其余的是固定格式
到这里WFD session建立完成
7、M7
M7 Request (Sink->Source)
(1)上一次Sink发送Request时CSeq的值是2,所以这一次CSeq需要加1,即CSeq的值为3
(2)rtsp://192.168.137.95/wfd1.0/streamid=0就是M4 Request中wfd-presentation-url对应的值
(3)Session不是必须的,可以没有
(4)其余的是固定格式
M7 Response(Source->Sink)
(1)Date和Server、Session、Range不是必须的,可以不用关注
(2)CSeq的值需要跟Request的值相同
(3)其余的是固定格式
到这里Source端开始发送Audio/Video stream
8、M16
M16 Request(Source->Sink)
(1)Date、Server、Session不是必须的,可以不用关注
(2)上一次Source发送Request时CSeq的值是4,所以这一次CSeq需要加1,即CSeq的值为5
(3)M16 Request是source端根据M6 Response中设置的timeout值进行周期发送的,用来确定sink端是否在线。
(4)其余的是固定格式
M16 Response(Sink->Source)
(1)CSeq的值需要跟Request的值相同
(2)其余的是固定格式
四、
WFD RTSP中用到的一些参数
注意:
DIGIT:表示十进制数字
HEXDIG:表示十六进制数字
SP:表示空格
CR:表示\r
LF:表示\n
CRLF:表示\r\n
IPADDRESS:表示IP地址
IPPORT:表示端口号0-65535
N*N HEXDIG:表示N个byte
1、wfd-audio-codecs指定音频格式
例如:wfd_audio_codecs: LPCM 00000003 00, AAC 0000000f 00, AC3 00000007 00\r\n
这里面包含3个sink-audio-list,分别是LPCM 00000003 00和AAC 0000000f 00以及AC3 00000007 00中间用逗号空格分隔开。其他解释参照协议
2、wfd-video-formats
例如:wfd_video_formats: 40 00 01 10 0001bdeb 051557ff 00000fff 10 0000 001f 11 0780 0438, 02 10 0001bdeb 155557ff 00000fff 10 0000 001f 11 0780 0438\r\n
这里面包含2个H.264-codes,分别是01 10 0001bdeb 051557ff 00000fff 10 0000 001f 11 0780 0438和02 10 0001bdeb 155557ff 00000fff 10 0000 001f 11 0780 0438中间用逗号空格分隔开。其他解释参照协议
3、wfd-content-protection
具体解释参照协议
4、wfd-trigger-method
这个参数是WFD Source使用的,用来触发WFD Sink向WFD Soucre发起一个操作
例如:wfd_trigger_method: SETUP\r\n
5、wfd-presentation-url
这个参数是M6-RTSP Setup Request中用到的一个url,用来创建sink到source端的WFD Session,这个url对应的端口号就是RTSP M4 Request里面的
wfd-client-rtp-ports中的端口号
我们只用wfd-url0就行,wfd-url1为none,对应下面表中标记处
例如:wfd_presentation_URL: rtsp://192.168.137.95/wfd1.0/streamid=0 none\r\n
6、wfd-client-rtp-ports
这个参数是wfd sink用来通知source的,说明sink端会监听哪个端口,并从该端口获取RTP数据流
我们不用关心rtp-port1,直接设置成0
例如:wfd_client_rtp_ports: RTP/AVP/UDP;unicast 1028 0 mode=play\r\n
7、wfd-uibc-capability
这个参数用来描述UIBC的相关属性,如果支持UIBC,在wfd IE中的
WFD Extended Capability IE中也要进行相应的设置。具体参照协议
例如:wfd_uibc_capability: input_category_list=HIDC;generic_cap_list=Keyboard, Mouse;hidc_cap_list=Keyboard/USB, Mouse/USB;port=46531\r\n
8、wfd-uibc-setting
这个参数用来enable/disable uibc
例如:wfd_uibc_setting: enable\r\n
五、
RTSP过程中的timeout
1、WFD Source和WFD Sink之间的TCP连接成功以后,WFD Source需要在6s内发送RTSP M1 Request
2、RTSP Request和对应的Response之间超时是5s,例如:RTSP M1 Request和RTSP M1 Response之间
3、在WFD Session建立之前,Response和下一个Request发送成功的超时是6s,例如:接收到RTSP M3 Response和发送TSP M4 Reques之间
4、在WFD Session建立之前,发送上一个Response和成功发送下一个Request之间的超时是6s,例如:发送RTSP M2 Response和发送RTSP M3 Request之间
5、接收到RTSP M6 Response以后,到发送RTSP M7 Request的超时有两个值,如果支持HDCP则是9s,如果不支持HDCP则是6s
因为我们在RTSP Session建立以后只进行RTSP M16的交互,所以其他的超时不关心。
六、WFD keep-alive
WFD keep-alive是用来周期性确定WFD Session状态的
1、keep-alive的timeout是在RTSP M6的Session中设置的
2、两次连续的RTSP M16之间的时间应该小于(timeout value – 5)s
3、WFD sink接收到RTSP M16 Request以后应该回复RTSP M16 Response
4、如果WFD Source在timeout时间内没有接收到RTSP M16 Response,则WFD Source会断开RTSP和RTP连接,同样如果WFD Sink在timeout时间内没有接收到RTSP M16 Request,则WFD Sink也会断开RTSP和RTP连接。