Fork me on GitHub

osip2和eXosip2协议

http://blog.csdn.net/flyhawk007j2me/article/details/6830586

Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高

eXosip2是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。

exosip2增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。

//========================================================================================================================

osip2协议栈分为三部分:sip协议的语法分析,sip协议的过程分析和协议栈框架。

1>>sip协议的语法分析

  主要是osipparser2部分,目前支持RFC3261和RFC3265定义的sip协议消息,

   包括INVITE、ACK、OPTIONS、CANCEL、BYE、SUBSCRIBE、NOTIFY、MESSAGE、REFER和INFO。不支持RFC3262定义的PRACK。 

  遵循RFC3264关于SDP的offer/answer模式。带有SDP的语法分析。
  支持MD5加解密算法。支持Authorization、www_authenticate和proxy_authenticate

2>>sip协议的过程分析

       主要是osip2部分,基于RFC3261、RFC3264和RFC3265的sip协议描述过程,围绕transaction这一层来实现sip的解析。 
       Transaction是指一个发送方和接收方的交互过程,由请求和应答组成。请求分为Invite类型和Non-Invite类型。应答分为响应型的应答和确认型的应答。

       响应型的应答是指这个应答仅代表对方收到请求。请求经过处理后都必须返回确认型的应答。响应型的应答有1xx,确认型的应答包括2xx、3xx、4xx、5xx和6xx。

      一个transaction由一个请求和一个或多个响应型应答、一个确认型应答组成。

 

3>>sip协议框架

    主要有三部分:底层套接字接收/发送,模块间通信管道,上层调用api接口。

    Osip2并不实现底层套接字的接收/发送,由eXosip2实现;

   上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接口。
   EXosip封装了大部分的sip协议调用接口

//********************************************************************************************************************************//

exosip2协议栈的分析

     exosip是osip2协议的封装和调用。它实现了作为单个sip终端的大部分功能,如register、call、subscription等

     exsiop使用udpsocket套接字实现底层sip协议的接受和奉送,并且封装了sip消息的解释器。

 

参考:http://blog.163.com/haidiniao@126/blog/static/117538091200961093456878/?latestBlog

 

 eXosip_init()是eXosip的初始化函数,我们来看看它的内部实现:

  首行是定义的 osip_t *osip,这在oSIP的官方手册里我们看到,所有使用oSIP的程序都要在最开始处声明一个osip_t的指针,并使用 osip_init(&osip)来初始化这个指针,销毁这个资源使用osip_release(osip)即可。

 

  我们可以在代码中看到很多OSIP_TRACE,这是调试输出宏调用了函数osip_trace,可以用ENABLE_TRACE宏来打开调试以方便我们开发调试。
  其它就是很多的eXosip_t的全局变量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)是比较有意思的,它让下面的eXosip_set_callbacks (osip)给osip设置大量的回调函数时,能让osip能访问到eXosip这个全局变量中设置的大量程序运行时交互的信息,相当于我们在VC下开启一个线程时,给线程传入的一个void指针指向我们的MFC应用程序的当前dialog对象实例,可以用void *osip_get_application_context (osip_t * osip)这个函数来取出指针来使用,不过好象exosip中并没有用到它,可能是留给个人自已扩展的吧:)

 

 

osip_set_cb_send_message (osip, &cb_snd_message) SIP消息发送回调函数

这个函数可能是最重要的回调函数之一,消息发送,包括请求消息和回应消息,一般情况下,状态机的状态就是由它控制的,发起一个消息初始化一个状态机,回应一个消息对状态机修改,终结消息发送结束状态机……


//==================================================================================

exosip协议示例: 

linphone  http://download-mirror.savannah.gnu.org/releases/linphone/docs/liblinphone/group__tutorials.html

 

Modules

  Basic buddy status notification
  Chat room and messaging
  Basic call
  Basic registration


 

 

参考:http://blog.163.com/haidiniao@126/blog/static/117538091200961093238143/

 

posted on 2012-04-27 20:32  pengyingh  阅读(2913)  评论(0编辑  收藏  举报

导航