您的位置:首页 > 理论基础 > 计算机网络

RTSP客户端模拟器(TCP方式,Python实现)

2012-10-29 23:40 567 查看
由于某种需求,工作中需要自己要开发RTSP客户端模拟器……这里以DarwinStreamingServer(简称DSS)为例进行演示,把思路记录下来,算是开发了一个测试工具,也方便我以后查阅。在我之前的文章(/article/4902450.html )中介绍过怎样通过TCP的方式来访问DSS,在那个实例中,我用的是VLC作为客户端,通过命令行参数进行调用的。

一、通信端口分析

首先通过抓包分析确定数据通信端口。

RTSP数据包截图:



RTP数据包截图:



RTCP数据包截图:



由图可知,在以TCP方式访问DSS时,RTSP数据、RTP数据和RTCP数据都是通过554端口进行传输的,所以DSS服务器只通过554端口和客户端通信。

二、通信过程分析



OPTIONS :查询到服务器所提供的方法;

DESCRIBE :得到会话描述信息(SDP);

SETUP :提醒服务器建立会话,并确定传输模式;

PLAY  :客户端发送播放请求;

TEARDOWN :客户端发起关闭请求;

当然中间还有RTP和RTCP的交互,这里就不叙述了。

三、模拟器实现

1、建立链接

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((m_Vars["defaultServerIp"],m_Vars["defaultServerPort"]))


2、查询服务器所提供的方法

向服务器发送OPTIONS请求,得到服务器所提供的方法。

s.send(genmsg_OPTIONS(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"]))
print s.recv(m_Vars["bufLen"])


3、得到会话描述信息

向服务器发送DESCRIBE请求,得到SDP

s.send(genmsg_DESCRIBE(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"]))
msg1 = s.recv(m_Vars["bufLen"])
print msg1


4、提醒服务器建立会话,并确定传输模式

向服务器发送SETUP请求,通知服务器产生session,并和服务器确定传输模式等。

s.send(genmsg_SETUP(m_Vars["defaultTestUrl"] + "/trackID=3",seq,m_Vars["defaultUserAgent"]))
msg1 = s.recv(m_Vars["bufLen"])
print msg1
seq = seq + 1

sessionId = decodeMsg(msg1)['Session']

s.send(genmsg_SETUP2(m_Vars["defaultTestUrl"] + "/trackID=4",seq,m_Vars["defaultUserAgent"],sessionId))
msg1 = s.recv(m_Vars["bufLen"])
print msg1


5、客户端发起播放请求

向服务器发送PLAY请求,通知服务器发送RTP数据。

s.send(genmsg_PLAY(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId))
msg1 = s.recv(m_Vars["bufLen"])
print msg1


客户端接收RTP数据

while True :
msgRcv = s.recv(m_Vars["bufLen"])
if 0 == len(msgRcv) : break
print len(msgRcv)


6、客户端发起关闭请求

客户端向服务器发送TREADOWN请求,通知服务器关闭。

s.send(genmsg_TEARDOWN(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId))
msg1 = s.recv(m_Vars["bufLen"])
print msg1


完整代码:https://gist.github.com/3974202

四、运行效果



个人见解,不足之处欢迎指出。

好,就这些了,希望对你有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: