exosip针对UA是对osip进行扩展,oSIP不提供不论什么高速产生请求消息和响应消息的方法,全部请求消息和响应消息的形成必须调用一组sip message api来手动组装完毕,所以作者在osip上基础上开发了exosip,用exosip开发软电话非常方便,仅需几个API就能够完毕.exosip中附带一个样例:josua,只是josua相对复杂了点,以下给出一个最简单的样例供大家參考,由于样例实在太简单所以没有给出凝视,用到exosip的API的參数请參看exosip源码,看懂这个样例再研究josua就非常easy了.我使用的是osip 2.0.9+exosip 0.77.

#include "assert.h"
#include <conio.h>
#include <iostream>
#include <osip2/osip_mt.h>
#include <eXosip/eXosip.h>
#include <eXosip/eXosip_cfg.h>

using namespace std;

class jcall;

class jcall {
public:
 int cid;
 int did;
 
 char reason_phrase[50];
 int  status_code;
 
 char textinfo[256];
 char req_uri[256];
 char local_uri[256];
 char remote_uri[256];
 char subject[256];
 
 char remote_sdp_audio_ip[50];
 int  remote_sdp_audio_port;
 int  payload;
 char payload_name[50];
 
 int state;
 
 jcall() {}
 
 int build(eXosip_event_t *je)
 {
  jcall *ca = this;
  
  ca->cid = je->cid;
  ca->did = je->did;
  
  if (ca->did<1 && ca->cid<1)
  {
   assert(0);
   return -1; /* not enough information for this event?? */
  }
  
  osip_strncpy(ca->textinfo,   je->textinfo, 255);
  osip_strncpy(ca->req_uri,    je->req_uri, 255);
  osip_strncpy(ca->local_uri,  je->local_uri, 255);
  osip_strncpy(ca->remote_uri, je->remote_uri, 255);
  osip_strncpy(ca->subject,    je->subject, 255);
  
  if (ca->remote_sdp_audio_ip[0]=='/0')
  {
   osip_strncpy(ca->remote_sdp_audio_ip, je->remote_sdp_audio_ip, 49);
   ca->remote_sdp_audio_port = je->remote_sdp_audio_port;
   ca->payload = je->payload;
   osip_strncpy(ca->payload_name, je->payload_name, 49);
   
  }
  
  if (je->reason_phrase[0]!='/0')
  {
   osip_strncpy(ca->reason_phrase, je->reason_phrase, 49);
   ca->status_code = je->status_code;
  }
  
  ca->state = je->type;
  return 0;
 }
 
};

jcall call;

void __exit( int r )
{
 char line[256];
 gets( line );
 exit( r );
}

void josua_printf(char* buf)
{
 printf( "/n" );
}

int josua_event_get()
{
 int counter =0;
 /* use events to print some info */
 eXosip_event_t *je;
 for (;;)
 {
  char buf[100];
  je = eXosip_event_wait(0,50);
  if (je==NULL)
   break;
  counter++;
  if (je->type==EXOSIP_CALL_NEW)
  {
   printf( "<- (%i %i) INVITE from: %s",
    je->cid, je->did,
    je->remote_uri);
   josua_printf(buf);
   
   call.build(je);
  }
  else if (je->type==EXOSIP_CALL_ANSWERED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_PROCEEDING)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_RINGING)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_REDIRECTED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_REQUESTFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_SERVERFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_GLOBALFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_CLOSED)
  {
   printf( "<- (%i %i) BYE from: %s",
    je->cid, je->did, je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_HOLD)
  {
   printf( "<- (%i %i) INVITE (On Hold) from: %s",
    je->cid, je->did, je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_CALL_OFFHOLD)
  {
   printf( "<- (%i %i) INVITE (Off Hold) from: %s",
    je->cid, je->did, je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_REGISTRATION_SUCCESS)
  {
   printf( "<- (%i) [%i %s] %s for REGISTER %s",
    je->rid,
    je->status_code,
    je->reason_phrase,
    je->remote_uri,
    je->req_uri);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_REGISTRATION_FAILURE)
  {
   printf( "<- (%i) [%i %s] %s for REGISTER %s",
    je->rid,
    je->status_code,
    je->reason_phrase,
    je->remote_uri,
    je->req_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_OPTIONS_NEW)
  {
   printf( "<- (%i %i) OPTIONS from: %s",
    je->cid, je->did,
    je->remote_uri);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_OPTIONS_ANSWERED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_OPTIONS_PROCEEDING)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_OPTIONS_REDIRECTED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_OPTIONS_REQUESTFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_OPTIONS_SERVERFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_OPTIONS_GLOBALFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_NEW)
  {
   printf( "<- (%i %i) INFO from: %s",
    je->cid, je->did,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_ANSWERED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_PROCEEDING)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_REDIRECTED)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_REQUESTFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_SERVERFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_INFO_GLOBALFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s",
    je->cid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  
  else if (je->type==EXOSIP_SUBSCRIPTION_ANSWERED)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
   
   printf( "<- (%i %i) online=%i [status: %i reason:%i]",
    je->sid, je->did,
    je->online_status,
    je->ss_status,
    je->ss_reason);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_PROCEEDING)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_REDIRECTED)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_REQUESTFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_SERVERFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_GLOBALFAILURE)
  {
   printf( "<- (%i %i) [%i %s] %s for SUBSCRIBE",
    je->sid, je->did,
    je->status_code,
    je->reason_phrase,
    je->remote_uri);
   josua_printf(buf);
  }
  else if (je->type==EXOSIP_SUBSCRIPTION_NOTIFY)
  {
   printf( "<- (%i %i) NOTIFY from: %s",
    je->sid, je->did,
    je->remote_uri);
   josua_printf(buf);
   
   printf( "<- (%i %i) online=%i [status: %i reason:%i]",
    je->sid, je->did,
    je->online_status,
    je->ss_status,
    je->ss_reason);
   josua_printf(buf);
   
  }
  else if (je->type==EXOSIP_IN_SUBSCRIPTION_NEW)
  {
   printf( "<- (%i %i) SUBSCRIBE from: %s",
    je->nid, je->did,
    je->remote_uri);
   josua_printf(buf);
   
   /* search for the user to see if he has been
   previously accepted or not! */
   
   eXosip_notify(je->did, EXOSIP_SUBCRSTATE_PENDING, EXOSIP_NOTIFY_AWAY);
  }
  else if (je->textinfo[0]!='/0')
  {
   printf( "(%i %i %i %i) %s", je->cid, je->sid, je->nid, je->did, je->textinfo);
   josua_printf(buf);
  }
  
  
  eXosip_event_free(je);
    }
 if (counter>0)
  return 0;
 return -1;
}

int main(int argc, char* argv[])
{
 int i;
 memset( &call, 0, sizeof(call) );
 
 cout << "Usage:"<< endl;
 cout << "a - answering call"<< endl;
 cout << "h - hangup"<< endl;
 cout << "r - ringing"<< endl;
 cout << "c - call"<< endl;
 cout << "q - quit"<< endl;
 
 FILE* logfile = fopen( "logfile.txt", "w");
 // osip_trace_initialize( (_trace_level)0, logfile );
 // osip_trace_initialize( (_trace_level)8, stdout );
 i = eXosip_init(stdin, stdout, 5060);
 if (i!=0)
    {
  fprintf (stderr, "test: could not initialize eXosip/n");
  __exit(0);
  
    }
 
 
 eXosip_sdp_negotiation_remove_audio_payloads();
 eXosip_sdp_negotiation_add_codec(osip_strdup("0"),
  NULL,
  osip_strdup("RTP/AVP"),
  NULL, NULL, NULL,
  NULL,NULL,
  osip_strdup("0 PCMU/8000"));
 
 eXosip_sdp_negotiation_add_codec(osip_strdup("8"),
  NULL,
  osip_strdup("RTP/AVP"),
  NULL, NULL, NULL,
  NULL,NULL,
  osip_strdup("8 PCMA/8000"));
   
 /* register callbacks? */
 eXosip_set_mode(EVENT_MODE);
 
 osip_message_t *invite;
 i = eXosip_build_initial_invite(&invite,
  "sip:192.168.197.5:5060",       //被叫对IP
  "sip:192.168.197.254:5060",     //自己IP
  NULL,
  "oSIP phone");
 if (i!=0)
 {
  fprintf (stderr, "eXosip_build_initial_invite failed/n");
  __exit(0);
 }
 
 
 cout << "oSIP>";
 bool run = true;
 while( run )
 {
  josua_event_get();
  
  if ( _kbhit() )
  {
   switch ( _getch() )
   {
   case 'a':
    cout << "answer"<< endl;
    eXosip_lock();
    eXosip_answer_call(call.did, 200, 0);
    eXosip_unlock();
    break;
    
   case 'h':
    cout << "hangup"<< endl;
    eXosip_lock();
    eXosip_terminate_call( call.cid, call.did );
    eXosip_unlock();
    break;
    
   case 'r':
    cout << "ringing"<< endl;
    eXosip_lock();
    eXosip_answer_call(call.did, 180, 0);
    eXosip_unlock();
    break;
    
   case 'c':
    cout << "call"<< endl;
    eXosip_lock();
    eXosip_initiate_call(invite, NULL, NULL, "10500");
    eXosip_unlock();
    break;
    
   case 'q':
    cout << "quit"<< endl;
    run = false;
    break;
    
   default :
    cout << "/noSIP>";
   }
  }
 }
 
 
 return 0;
}

exosip的更多相关文章

  1. linux下编译eXosip、osip,以及UAC和UAS的例子

    从网站上看到了这样的一篇博文 :Windows下编译eXosip.osip,以及UAC和UAS的例子 (链接:http://www.cnblogs.com/dyllove98/archive/2013 ...

  2. Windows下编译eXosip、osip,以及UAC和UAS的例子

    今天开始了SIP开源库的学习,我选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,最后终于编译成功! ...

  3. osip及eXosip的编译方法

    osip及eXosip的编译方法 在最新版本的osip2.exosip2中不支持在VC6.0下编译osip.exosip协议栈的方法 说明: 1.以下文章中的osip版本为3.1.0 2.eXosip ...

  4. [置顶] 我的GB28181标准开发里程碑——基于eXosip的IPC端与SPVMN注册成功

    昨天编译搭建好eXosip的开发环境后,今天完成了SIP注册功能,里程碑一战啊!加油加油,成功就在眼前! 今天基于eXosip做了一个IPC客户端,成功与公安部的SPVMN视频监控联网调测软件自测工具 ...

  5. eXosip sip

    eXosip是对osip的封装,是对sip协议的使用更简单.osip是gnu开源的sip协议实现. 介绍: http://savannah.nongnu.org/projects/exosip 下载地 ...

  6. 利用exosip DNS CACHE自定义SIP服务器地址和端口

    文章标题可能表述不清,罢了,我这里描述一个场景: 当使用exosip开发UA时,服务器地址是域名example.com和端口形式,但存在两个限制: 1.example.com没有DNS记录.没有NAP ...

  7. Osip2和eXosip协议栈的简析

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

  8. exosip/osip 杂项

    exosip 对比osip osip2和eXosip2协议 exosip 和 pjsip 简介 如果要实现嵌入式设备上的SIP电话或者其它,PJSIP是我所见的Coding和Design最为优秀的了, ...

  9. exosip 和 pjsip 简介

     oSIP oSIP的开发开始于2000年7月,第一个版本在2001年5月发 布,到现在已经发展到3.x了.它采用ANSI C编写,而且结 构简单小巧,所以速度特别快,它并不提供高层的SIP会话 控制 ...

随机推荐

  1. Oracle 课程六之hint

    课程目标 完成本课程的学习后,您应该能够: •什么是oracle hint •Hint的使用范围 •Hint 汇总 •演示常用的hint   Hint简介 Hint是oracle 提供的一种SQL语法 ...

  2. Android-onTouchEvent方法的使用

    手机屏幕事件的处理方法onTouchEvent.该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件.该方法的签名如下所示. public ...

  3. POJ 1423 Big Number

    题意:求n阶乘的位数. 解法:斯特林公式,,然后取log10就是位数了,因为精度问题需要化简这个式子,特判1. 代码: #include<stdio.h> #include<iost ...

  4. [Everyday Mathematics]20150114

    设 $a_0$, $d$ 给定, $a_k=a_0+kd$, $k=0,1,\cdots,n$. 试求如下 $n+1$ 阶行列式的值: $$\bex \sev{\ba{ccccc} a_0&a ...

  5. Grep 命令 用法大全

    查找x文件 find / -name "x*" -ls 查找文件中x所在的行数 grep -n "x" -r *find . -name "*.jav ...

  6. Android 中屏幕点击事件的实现

    在Android中如何用代码触发按钮点击事件?我想要触发代码执行按钮点击.实现对于单击按钮事件的模拟,触发单击按钮进入另一个界面. 就是声明一下什么moonlightcheese被声明了:在andro ...

  7. 数据库表中MAX ID获取,确保每次调用没有重复工具类(NumberUtil)

    下面这个类是获取数据库中一个字段的最大值.配置在数据库中. public class NoFactory { private final static Logger cLogger = Logger. ...

  8. 添加删除ASM磁盘

    创建磁盘: [root@kel ~]# oracleasm createdisk KEL3 /dev/sdf1 Writing disk header: done Instantiating disk ...

  9. BITED数学建模七日谈之二:怎样阅读数学模型教材

    今天进入我们数学建模七日谈的第二天:怎样阅读数学建模教材? 大家再学习数学建模这门课程或准备比赛的时候,往往都是从教材开始的,教材的系统性让我们能够很快,很深入地了解前人在数学模型方面已有的研究成果, ...

  10. Hadoop在百度的应用

    百度作为全球最大的中文搜索引擎公司,提供基于搜索引擎的各种产品,包括以网络搜索为主的功能性搜索:以贴吧为主的社区搜索:针对区域.行业的垂直搜索.MP3音乐搜索,以及百科等,几乎覆盖了中文网络世界中所有 ...