Miracast(五)RTSP

一、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连接。

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值