oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx

上传人:b****4 文档编号:3206670 上传时间:2022-11-20 格式:DOCX 页数:11 大小:25.64KB
下载 相关 举报
oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx_第1页
第1页 / 共11页
oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx_第2页
第2页 / 共11页
oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx_第3页
第3页 / 共11页
oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx_第4页
第4页 / 共11页
oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx

《oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx》由会员分享,可在线阅读,更多相关《oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx(11页珍藏版)》请在冰豆网上搜索。

oSIP协议栈 及eXoSIP Ortp等 使用入门共14页word资料.docx

oSIP协议栈及eXoSIPOrtp等使用入门共14页word资料

oSIP协议栈及eXoSIPOrtp等使用入门

作者:

不祥

一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~

Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。

虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。

第一阶段:

先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。

同样,将oSIP2版本3.0.1src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:

Project-AddToProject-Files

将所有的源程序和头文件都加入到工程内,保存工程。

这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。

处理:

在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#includexxx.h时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为C:

\ProgramFiles\MicrosoftVisualStudio\VC98\Include。

这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们这里没有生成:

最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。

上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。

在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:

Project-Setting-Link中的Object/LibraryModules:

kernel32.libuser32.lib.xxx.lib之类的内容最后增加:

osipparser2.lib

保存工程后再次编译,即可成功编译osip2.dll。

至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。

下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。

在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。

该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。

由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。

而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的PlatformSDK,下载地址如下:

.PSP2FULLInstall.htm(VC6的支持已经停止,这是VC6能使用的最新SDK)

成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:

),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。

创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库:

exosip2.libosip2.libosipparser2.libWSock32.LibIPHlpApi.LibWS2_32.LibDnsapi.lib

其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的PlatformSDK所新提供的。

至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:

我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。

其主要流程为:

初始化eXosip库-启动事件监听线程-向SIPProxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接

初始化代码:

intret=0;

ret=eXosip_init();

eXosip_set_user_agent("##YouToo0.1");

if(0!

=ret)

AfxMessageBox("Couldn'tinitializeeXosip!

\n");

returnfalse;

ret=eXosip_listen_addr(IPPROTO_UDP,NULL,0,AF_INET,0);

if(0!

=ret)

eXosip_quit();

AfxMessageBox("Couldn'tinitializetransportlayer!

\n");

returnfalse;

启动事件监听线程:

AfxBeginThread(sip_uac,(void*)this);

向SIPProxy注册:

eXosip_clear_authentication_info();

eXosip_add_authentication_info(uname,uname,upwd,"md5",NULL);

real_send_register(30);/*自定义函数代码请见源码*/

发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):

osip_message_t*invite=NULL;/*呼叫发起消息体*/

inti=eXosip_call_build_initial_invite(&invite,dest_call,source_call,NULL,"##YouTootestdemo!

");

if(i!

=0)

AfxMessageBox("IntialINVITEfailed!

\n");

charlocalip[128];

eXosip_guess_localip(AF_INET,localip,128);

snprintf(tmp,4096,

"v=0\r\n"

"o=josua00INIP4%s\r\n"

"s=conversation\r\n"

"c=INIP4%s\r\n"

"t=00\r\n"

"m=audio%sRTP/AVP08101\r\n"

"a=rtpmap:

0PCMU/8000\r\n"

"a=rtpmap:

8PCMA/8000\r\n"

"a=rtpmap:

101telephone-event/8000\r\n"

"a=fmtp:

1010-11\r\n",localip,localip,"9900");

osip_message_set_body(invite,tmp,strlen(tmp));

osip_message_set_content_type(invite,"application/sdp");

eXosip_lock();

i=eXosip_call_send_initial_invite(invite);

eXosip_unlock();

挂断或取消通话:

intret;

ret=eXosip_call_terminate(call_id,dialog_id);

if(0!

=ret)

AfxMessageBox("hangup/terminateFailed!

");

可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程,后面跟贴中可以下载基本可用的完整SIP软电话的VC源码工程文件供参考使用,完全CopyLeft,欢迎转载,但请在转载时注明作者信息,谢谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1