sip phone系列之Java sip phone(peers)源码浅析

从整理几款sip phone,到简单修改播放声音文件,发现少了最基本的环境搭建及源码的认识,现在重新记录下。
1.sip简要介绍
这里提及一些sip相关的必要知识,方便对该协议有个整体的了解,同时也可以为后续相关的应用开发提供准备。更详细的内容可以参考对应的RFC文档(RFC3261等等)。sip(Session Initiation Protocol)会话初始协议,简单来说就是负责多媒体通信(两个或者多个终端)会话的建立、修改和终止,而且是一个应用层控制协议。可以看到它是不足以支撑完整的多媒体会话的,但它可以方便的通过与SDP(会话描述协议,协商采用的协议)、RTP(实时传输协议)等结合提供完整多媒体通信功能。后面在介绍这款Java sip phone(peers)的源码框架时会看到。
单就sip协议来说(RFC3261),sip协议的功能实现用户的注册,会话的邀请或者接受会话,会话参数服务的修改,会话的结束等(没有用官方的用户定位等功能描述,需要的可以自己查看),因此需要注册服务器、代理服务器实现用户注册,位置查找,进而实现会话邀请等sip消息(主要就是请求和响应两种)的转发,对应的客户端有UserAgent(包括UAC:UserAgent Client和UAS:UserAgent Server )来负责实现会话的邀请和响应等。
sip协议栈如下图所示,但据说只是逻辑实体,真正的实现上可能会有所重合的

sip phone系列之Java sip phone(peers)源码浅析
SIP的最底层是语法和编码层(对应上图协议栈),其上是传输层(记住sip协议是应用层协议),传输层之上是事务层,再上是事务用户层;其中一个事务定义为UAC发送的一个请求报文和由这个请求报文所引起的所有由UAS发送的响应报文。事务层负责处理应用层的报文超时重传、定时器设置、报文排序、重复报文处理和响应报文与请求报文的匹配等等;事务用户层它描述了不同SIP实体在事务层之上对SIP报文的处理,例如当要发送一个请求时,事务用户会创建一个客户机事务的实例并将请求报文和目标必要信息(包括目标IP地址、端口号、传输层协议等)传递给该事务进行处理。
2.环境搭建及使用
在了解上述概念后,我们来看环境搭建,本人是在Windows XP下配合使用虚拟机完成。sip phone一般的使用方式还是C/S模式的,因此,需要一个服务器来实现注册、代理转发、重定向等功能,我这里使用的是sipfoundry,客户端使用Peers,配合X-Lite,Jitsi(功能强大的软电话,前者是个商用产品,后者也是个开源软件,前文里有说。)sipfoundry可以直接下载光盘镜像,我的是和CentOS系统一起的Iso文件,从虚拟机中安装即可,官方有详细的安装文档,当系统安装完成后,启动有如下界面:
sip phone系列之Java sip phone(peers)源码浅析

然后可以通过上述的IP从浏览器中直接访问,当然那个IP是需要在安装时配置的。进入管理界面后的添加用户之类的操作之类不再细说。
X-Lite和Jitsi下载后直接可以使用,Peers下载后点击bat文件直接运行,当下载的为源码时,可以通过Eclipse导入工程,然后运行即可。注意Jitsi和Peers拨号时的名称完整为sip:[email protected],在Jitsi中省略了sip:。可以来体验下,现在服务器中添加200 和201用户,假设服务器地址为192.168.0.50,那么启动X-Lite,Accounts setting中配置用户名和地址(200),启动Peers设置用户名201或者不设也行,在Peers中输入[email protected],点击call即可拨打,后面都简单了。
3.peers源码框架
peers的文档也非常详细,可以好好阅读下。Peers的源码包目录如下:

sip phone系列之Java sip phone(peers)源码浅析
其中conf中包括peers的配置文件,有用户名、密码等等;logs里是日志文件,media中在调试模式下时,会产生媒体调试输出信息,一般导出的可执行Jar包包括这三个目录即可。

net.sourceforge.peers目录中为Log,config等信息代码,其它的可以从下图中看到其作用,因此如果没有特别要求,标准的JDK已经足够,不需要下载额外的库。

sip phone系列之Java sip phone(peers)源码浅析

在源码目录中的core.useragent也正是上面阐述的,包括UAC和UAS,而我们接触最多的也正是这两个。在peers运行中,gui目录中维持了会话状态的状态机,而其中实现各种事件响应的主要是CallFrame和Eventmanager,其中CallFrame主要负责界面上的按键响应,Eventmanager则一方面实现CallFrameListener的事件响应,另一方面建立了UserAgent实例,并实现了SipListener的事件响应。UserAgent则是sip phone中最重要的部分了,里面包括了UAC UAS等等一系列实现多媒体通信的实例对象,因此,集成自己的应用可以再gui目录中提取出自己想要的部分,主要是EventManager类。
最后,提醒注意几个问题,一是如果本机有虚拟机,会造成Peers接收挂断等消息错误,主要是因为其绑定的IP可能是虚拟机IP,因此需要正确设置IP;另一方面是如果想建立多个sip客户端时,即使在gui等方面取消了限制,注意端口绑定的问题。

转载注明出处: http://blog.csdn.net/w7849516230/article/details/7714552
联系邮箱:[email protected]

你可能感兴趣的:(java)