大家好,又见面了,我是你们的朋友全栈君。
<!– /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:”/@宋体”; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:””; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:10.0pt; font-family:”Times New Roman”; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} –>
刚好有一篇 osip 安装的文档,环境是( Windows xp sp2 + VC 6) 写的不错,还有例子。转过来请参考。
注: 文中的 platform SDK 包到 http://www.image2003.com/softdown/3344520.asp?id=38&url=1 下载。 记住 VC6 要在 tools->options->directories 中的 include files , executable files,Library files 的 VC6 自带目录前面加入 SDK 的目录。
oSIP 协议栈使用(原创+持续更新中)
一直没空仔细研究下 oSIP ,最近看到其版本已经到了 3.x 版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~
Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
------------------------------------------------------
先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src 目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:
Project-Add To Project-Files
将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到 osipparser2/xxxxx.h 头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到 /usr/inclue;/usr/lib 之类的目录下,c源程序里直接写 #include <xxx.h> 时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2 目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:/Program Files/Microsoft Visual Studio/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/Library Modules:
kernel32.lib user32.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的扩展开发库 exosip 2,使用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 自带的开发库太古董了,需要升级系统的Platform SDK,下载地址如下:
http://www.microsoft.com/msdownl … 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.lib osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.Lib WS2_32.Lib Dnsapi.lib
其中,除了我们上面编译得到的三个 oSIP 库外,其它库都是系统库,其中有一些是新安装的 P latform SDK所新提供的。
至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:)
------------------------------------------------------
我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除 MSVCRT[D] 开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。
其主要流程为:
初始化eXosip库-启动事件监听线程-向SIP Proxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接
初始化代码:
int ret = 0;
ret = eXosip_init ();
eXosip_set_user_agent(“##YouToo0.1”);
if(0 != ret)
{
AfxMessageBox(“Couldn’t initialize eXosip!/n”);
return false;
}
ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);
if(0 != ret)
{
eXosip_quit ();
AfxMessageBox(“Couldn’t initialize transport layer!/n”);
return false;
}
启动事件监听线程:
AfxBeginThread(sip_uac,(void *)this);
向SIP Proxy注册:
eXosip_clear_authentication_info();
eXosip_add_authentication_info(uname, uname, upwd, “md5”, NULL);
real_send_register(30); /* 自定义函数代码请见源码 */
发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):
osip_message_t *invite = NULL; /* 呼叫发起消息体 */
int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, “## YouToo test demo!”);
if (i != 0)
{
AfxMessageBox(“Intial INVITE failed!/n”);
}
char localip[128];
eXosip_guess_localip (AF_INET, localip, 128);
snprintf (tmp, 4096,
“v=0/r/n”
“o=josua 0 0 IN IP4 %s/r/n”
“s=conversation/r/n”
“c=IN IP4 %s/r/n”
“t=0 0/r/n”
“m=audio %s RTP/AVP 0 8 101/r/n”
“a=rtpmap:0 PCMU/8000/r/n”
“a=rtpmap:8 PCMA/8000/r/n”
“a=rtpmap:101 telephone-event/8000/r/n”
“a=fmtp:101 0-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 ();
挂断或取消通话:
int ret;
ret = eXosip_call_terminate(call_id, dialog_id);
if(0 != ret)
{
AfxMessageBox(“hangup/terminate Failed!”);
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150074.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...