osip安装 与使用

osip安装 与使用Normal07.8磅02falsefalsefalseMicrosoftInternetExplorer4

大家好,又见面了,我是你们的朋友全栈君。

<!– /* 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账号...

(0)


相关推荐

  • 数据结构_十字链表(C语言)[通俗易懂]

    数据结构_十字链表(C语言)[通俗易懂]十字链表1.十字链表图文解析十字链表是有向图的一种存储结构在十字链表里我们称每一条有向边为:弧十字链表的存储结构主要包括:弧结点和顶点结点,如下图:由以上结构组成的有向图如下:红线:与邻接表一样,可以采用头插法插入弧结点绿线:指向同一个尾顶点的弧结点黑线:指向该顶点的绿线弧结点链表,例如顶点V2—>弧的链表(每个弧结点的头顶点都为V2)十字链表的构造方法:2.源代码及测试#include<stdio.h>#include<stdlib.h

  • emWin专题——emWin简介及模拟器的使用「建议收藏」

    emWin专题——emWin简介及模拟器的使用「建议收藏」一、emWin简介1、emWin和ucGUI的关系记得刚上大学的时候接触到单片机领域的一个图形界面叫ucGUI,也是跑在STM32上的,后来过了没多久网上查资料发现大家都是用的emWIn了,了解了一下它们之间的关系,其实是同一个东西。emWIn是在ucGUI的基础上发展起来的,两者同属一家公司(SEEGER)开发,没错就是咱买的JLINK调试器的那家公司,以前旧版本的ucGUI是开源的,后…

    2022年10月14日
  • QString与char *的相互转换

    QString与char *的相互转换在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt库中也对字符串类型进行了封装,QString类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。  但是我们在编写程序时,不可避免地会在Qt框架上使用第三方的开源库,由于库的类型基本上都是标准的类型,即使用char*来表示字符串类型。那么问题来了,QString和char*之间如何进行转换呢?  下面分两

  • 考研数学真题用谁的_蓝桥杯编程题

    考研数学真题用谁的_蓝桥杯编程题⭐️引言⭐️大家好,我是执梗,蓝桥杯的报名快接近尾声,如果有兄弟还没报名不了解比赛,缺少视频讲解和真题资源的一定要阅读一下我的这篇蓝桥全解析——蓝桥全解析。为了帮助兄弟们更好准备比赛,我特意选取了蓝桥往年真题中许多能体现出蓝桥经典题型的题目——如暴力遍历、动态规划等等。有帮助的兄弟们一定要收藏一下,后面会陆续更新。????博客首页:执梗的博客????欢迎关注????点赞????收藏⭐️留言????❤️:热爱Java学习,期待一起交流!????作者水平很有限,如果发现错误

  • getClassLoader能否为null

    getClassLoader能否为null前言我们Javaer都知道类想要被加载是需要一个个ClassLoader来执行的,并且类加载的方案叫双亲委派模式,说是双亲,其实就是单亲,可能我们最初的翻译人想让我们的加载器的家庭更完整吧,所以翻译成双亲。默认的类加载器包括BootstrapClassLoader、ExtClassLoader、AppClassLoader,他们都定义在在rt.jar中的sun….

  • android菜鸟教程_菜鸟软件下载app

    android菜鸟教程_菜鸟软件下载app相对布局是通过相对定位的方式让控件出现在布局任意位置; 在相对布局中如果不指定控件摆放的位置,那么控件都会被默认放在RelativeLayout的左上角。因此要先指定第一个控件的位置,其他控件为该位置的相对位置;RelativeLayout属性:(使用相对布局属性需要先指定控件的id,其他控件根据该控件的id,来确定相对于该控件的相对位置)示例:xmlversion=”1

    2022年10月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号