有关软电话网络电话linphone代码分析

上传人:wuy****ng 文档编号:133656544 上传时间:2022-08-10 格式:DOCX 页数:10 大小:19.88KB
收藏 版权申诉 举报 下载
有关软电话网络电话linphone代码分析_第1页
第1页 / 共10页
有关软电话网络电话linphone代码分析_第2页
第2页 / 共10页
有关软电话网络电话linphone代码分析_第3页
第3页 / 共10页
资源描述:

《有关软电话网络电话linphone代码分析》由会员分享,可在线阅读,更多相关《有关软电话网络电话linphone代码分析(10页珍藏版)》请在装配图网上搜索。

1、linphone分析看Linphone的代码,主程序很简单,只有三个函数:linphone-1.7.1console下的linphonec.c中的:main (int argc, char *argv)if (! linphonec_init(argc, argv) ) exit(EXIT_FAILURE);linphonec_main_loop (&linphonec, sipAddr);linphonec_finish(EXIT_SUCCESS);exit(EXIT_SUCCESS); /* should never reach here */可以看到,主要的事物处理在linphonec_

2、main_loop这个函数里面,该函数是一个while循环,他的主要流程就是等待终端输入命令,然后根据命令来进行不同的响应或者发出不同的SIP消息,完毕然后进入下一轮循环重新等待命令的输入。既然linphonec_main_loop只是对输入命令的处理,那么对于从网络上接收到的数据的处理是在哪里实现的呢?既然linphonec_main_loop里面没有,那肯定是在linphonec_init(argc, argv)的时候启动了某个监听网络的线程。通过对linphonec_init这个函数的代码分析,终于找到了关键点:在这里面他调用了eXosip_init()函数,而在eXosip_init(

3、)里面加载了四个有限状态机,正是这四个有限状态机线程能够对接收到的网消息进行自动的状态跳转并处理。下面对eXosip_init()进行详细的分析。eXosip_init()是eXosip的初始化函数,我们来看看它的内部实现:首行是定义的osip_t *osip,这在oSIP的官方手册里我们看到,所有使用oSIP的程序都要在最开始处声明一个osip_t的指针,并使用osip_init(&osip)来初始化这个指针。我们可以在代码中看到很多OSIP_TRACE,这是调试输出宏调用了函数osip_trace,可以用ENABLE_TRACE宏来打开调试以方便我们开发调试。其它就是很多的eXosip_t

4、的全局变量eXosip的一些初始化操作,包括最上面的memset(&eXosip,0, sizeof (eXosip)完全清空和下面的类似eXosip.user_agent = osip_strdup (eXosip/ EXOSIP_VERSION)的exosip变量的一些初始值设置,其中有一个eXosip.j_stop_ua = 0应该是一个状态机开关,后面可以看到很多代码检测这个变量来决定是否继续流程处理,默认置成了0表示现在exosip的处理流程是就绪的,即ua是not stop的。osip_set_application_context(osip, &eXosip)是比较有意思的,它让

5、下面的eXosip_set_callbacks(osip)给osip设置大量的回调函数时,能让osip能访问到eXosip这个全局变量中设置的大量程序运行时交互的信息,相当于我们在下开启一个线程时,给线程传入的一个指针指向我们的应用程序的当前dialog对象实例,可以用void *osip_get_application_context (osip_t * osip)这个函数来取出指针来使用,不过好象exosip中并没有用到它,可能是留给个人自已扩展的吧还能看到初始化代码前面有一段Win32平台下的SOCK的初始化代码,可以知道eXosip是用的原生的winsock api函数,也就是我们可能

6、以前学过的用VC和WINAPI写sock程序时(不是MFC),用到的那段SOCK初始代码,还有一段有意思的代码,就是jpipe()函数,它们返回的是一个管道,一个有个整型数值的数组(一个进一个出),查看其代码发现,非WIN32平台是直接使用的pipe系统函数,而WIN32下则是用一对TCP的本地SOCK连接来模拟的管道,一个SOCK写一个SOCK读,这段代码是比较有参考价值的:)j = 50;while (aport+ & j- 0)raddr.sin_port = htons (short) aport);if (bind (s, (struct sockaddr *) &raddr, si

7、zeof (raddr) transactionid);即,只是打印一下调试,并没有完整实现什么功能,我们学习时,完全可以用相同的方法,定义一大堆回调函数,并不忙想怎么完全实现,先都是只打印一下调试信息,看具体的应用逻辑根据抓包测试分析和看调试看程序走到了哪一步,调用了哪一个回调,来明白具体回调函数要实现什么用途,再来实现代码就方便多了,当然,如果看透了RFC文档,应该从字面就能知道各个回调函数的用途了,这是后话,不是谁都能快速完全看懂RFC的,所以我们要参考eXosip:)我们对其中的重要的回调函数进行逐个的分析: osip_set_cb_send_message (osip, &cb_sn

8、d_message)SIP消息发送回调函数这个函数可能是最重要的回调函数之一,消息发送,包括请求消息和回应消息,一般情况下,状态机的状态就是由它控制的,发起一个消息初始化一个状态机,回应一个消息对状态机修改,终结消息发送结束状态机。看cb_snd_message的函数实现,可以发现,其主要代码是对参数中的要发送的消息osip_message_t * sip进行分析,找出消息要发送的真实char *host,int port的值(这些参数可以省略,但要发送消息肯定需要host和port,所以要从sip中解析),最后根据sip中解析出的传输方式是TCP还是UDP选择最终进行消息发送处理的函数cb_

9、udp_snd_message,cb_tcp_snd_message处理(它们的参数一致,即本函数只是补全一些省略的参数并对消息进行合法性检查)。*毕竟eXosip是一个通用的开发库,它考虑了要支持TCP,UDP,TCPs,IPV4,IPV6,WIN32,*nix,WINCE等等多样化的复杂环境,所以,我们可以略过我们暂时不需要的部分,比如,相关的代码实现等。由于我们大多数情况下SIP是用的UDP,所以先来看一下cb_udp_snd _message的实现,它从全局变量exosip中获取可用的sock,并尽最大能力解析出host和port(?难道前面的函数还不够解析彻底?如最终仍无port信息

10、则默认设置为5060),使用osip_message_to_str (sip, &message, &length)函数将要发送的格式化的SIP消息转换成能用SOCK传输的简单数据并发送即完成消息发送,代码中有许多复杂的环境探测和错误控制等等等等,我们可以暂时不用过多关注,可以继续向下,结尾处有一个keeplive相关代码,从代码字面分析,可能是SIP的Register消息的自动重发相关代码,可以在后面再细化分析。cb_tcp_snd_essage的函数实现要比上文的udp的实现简单很多,主要是环境探测错误控制方面,因为毕竟tcp是稳定连接的,对比一下代码,可以看到主要流程还是将SIP消息转换

11、后,发送到从SIP消息中解析出的host和port对应的目标。看完两个函数,可以知道,eXosip需要有两个sock,是一个数组,0是给UDP用的,是给TCP用的,要用SOCK当然要初始化,就是下文要介绍的eXosip的网络相关的初始化了,上面的exosip_init可以看成是这个开发库的系统初始化吧:)至些,我们应该知道了oSip开发的SIP应用程序的消息是从哪里发出的吧,对了,就是从这个回调函数里,所谓万事开头难,就象开发WIN32应用程序时,找到了WIN32程序的main函数入口下面的工作就好办了,下面就都是为一些事件消息开发对应的处理函数而已了:)osip_set_kill_trans

12、action_callback事务终结回调函数对应ICT,IST,NICT,NIST客户/服务器注册/非注册事务状态机的终结,主要是使用osip_remove_transaction (eXosip.j_osip, tr)将当前tr事务删除,再加上一系列的清理工作,其中,NICT即客户端的非Invite事务的清理比较复杂一些,要处理的内容也比较多,可以根据实际应用的情况进行有必要的清理工作:)cb_transport_error传输失败处理回调对应于上面说到的四种事务状态机,如果它们在处理时失败,则在这时进行统一处理。从代码可知,只是在NOTIFY,SUBSCRIBE,OPTION操作失败才进

13、行处理,其它错误可直接忽略。osip_set_message_callback消息发送处理回调根据type不同,表示不同的消息发送状态OSIP_XXX_AGAIN 重发相关消息OSIP_ICT_INVITE_SENT 发起呼叫OSIP_ICT_ACK_SENTACK回应OSIP_NICT_REGISTER_SENT发起注册OSIP_NICT_BYE_SENTBYE发出OSIP_NICT_CANCEL_SENTCancel发出OSIP_NICT_INFO_SENT,OSIP_NICT_OPTIONS_SENT,OSIP_NICT_SUBSCRIBE_SENT,OSIP_NICT_NOTIFY_S

14、ENT,OSIP_NICT_UNKNOWN_REQUEST_SENT我们可以看到,eXosip没有对它们作任何处理,我们可以根据自己需要,比如,重发2xx消息前记录一下日志之类的,扩展一下retransmission的处理方式,发起Invite前记录一下通话日志等等。OSIP_ICT_STATUS_1XX_RECEIVEDuac收到1xx消息,一般是表示对端正在处理中,这时,主要是设置一下事务状态机的状态值,并对会话中的osip的一些参数根据返回值进行相应设置,里面有许多条件判断,但我们常用的一般是100,180,183的判断而已,暂时可以忽略里面复杂的判断代码。OSIP_ICT_STATUS

15、_2XX_RECEIVED uac收到2xx消息,这里主要跟踪一下Register情况下的2xx,表示注册成功,这时会更新一下exosip的注册字段值,以便让eXosip能自动维护uac的注册,的回应是终结消息,Invite的2xx回应,则主要是初始化一下会话相关的数据,表示已成功建立连接。其它xx,xx,xx则分别是对应的处理,根据实现情况进行概要的查看即可。report_event (je, sip)是代码中用来进行事件处理的一个函数,跟踪后发现,其最终是使用了我们上文提到的jpipe管道,以便在状态机外实时观测状态机内的处理信息。OSIP_NIST_STATUS_XXX_SENT即对应于

16、上面的uac的处理,这里是uas的对应的消息处理,相比较于uac简单一点。linphone编译移植的建议1.首先在x86上编译使用(最好用新的gcc或fc版本)(./configure,make,make install),ortp(./configure,make,make install),ffmpeg-0.cvs20060823(./configure -prefix=/usr,make,make install),speex-1.1.12(./configure -prefix=/usr,make,make install),mediastreamer2(./configure -pr

17、efix=/usr,make,make install),linphone-1.7.1(./configure,make,make install)linphone的使用:cd /usr/local/binlinphonec(无视频),linphonec -V(有视频)进入linphonec,可以输入help看操作说明。LINPHONE的编译(LINUX下的)1、先装OSIP。建议下比较新的OSIP2。直接./configure make make install2、装ORTP。在linphone下也有。直接./configure make make install3、下载SPEEX。(新的l

18、inphone版本就不需要,我用的是的,需要),后安装4、安装Linphone。直接./configure make make install然后就可以用了。TIPS:建议用新点的系统。REDHAT9的编译器比较旧了,编译的话,通过不了。更新之 2. arm移植(前面的几个步骤)1.2.vi /root/.bash_profile PATH=/usr/local/arm/2.95.3/bin:$PATHsource .bash_profile3.libosip2-2.2.2,ncurses-5.5,readline-5.2,libogg-1.1.3,speex-1.1.12,ffmpeg-0.

19、cvs20060823,sdl-1.2.11,alsa-lib-1.0.10,4.mkdir /work/usrmake clean make make instll(1)libosip2 ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static(2) Ortp ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static(3) ncurses-5.5 ./configure -host=arm-linux -pre

20、fix=/work/usr -with-gnu-ld-with-shared -without-ada(4) readline-5.2 ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static(5) ffmpeg-0.cvs20060823 ./configure cc=arm-linux-gcc -cross-compile -prefix=/work/usr -cpu=armv41 ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld

21、-disable-static ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static -with-ogg-libraries=/work/usr/lib -with-ogg-includes=/work/usr/include(8) alsa-lib-1.0.10 ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static(9) sdl-1.2.11 ./configure-host=arm-linux -pr

22、efix=/work/usr -disable-video-dga -disable-arts-disable-esd -disable-video-x11 -disable-nasm -with-gnu-ld -with-share ./configure -host=arm-linux -prefix=/work/usr -with-gnu-ld -disable-static -disable-glib -with-osip=/work/usr -with-readline=/work/usr -with-ffmpeg=/work/usr -with-sdl=/work/usr 需要交叉编译的软件包包括:libosip2-2.2.2,ncurses-5.5,readline-5.2,libogg-1.1.3,speex-1.1.12,ffmpeg-0.cvs20060823,sdl-1.2.11,alsa-lib-1.0.10,linphone-1.7.1(包含Ortp, exosip, mediastreamer)特此声明此资料均来自互联网.

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!