exosip「建议收藏」

exosip「建议收藏」exosip针对UA是对osip进行扩展,oSIP不提供不论什么高速产生请求消息和响应消息的方法,全部请求消息和响应消息的形成必须调用一组sipmessageapi来手动组装完毕,所以作者在osi

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

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;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154497.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图形推理1000题pdf_2019和平区一模24题解析

    图形推理1000题pdf_2019和平区一模24题解析2019和平区数学一模24题解析推理与论证是在探索图形性质、与他人合作交流等活动过程中,发展合情推理,进一步学习有条理的思考与表达;数学推理的内涵是从数和形的角度进行合情推理和演绎推理,是对归纳类比的发展,判断和证明的过程。和平区数学一模试卷24题第(1)问在正方形中利用全等证明线段相等,考察几何问题的推理论证,推理探究。思考的角度不同,方法各异,但殊途同归,考察学生的逻辑推理论证,书写…

    2025年10月16日
    2
  • IntelliJ IDEA设置类注释和方法注释带作者和日期「建议收藏」

    IntelliJ IDEA设置类注释和方法注释带作者和日期「建议收藏」当我看到别人的类上面的多行注释是是这样的:这样的:这样的:好装X啊!我也想要!怎么办呢?往下瞅:跟着我左手右手一个慢动作~~~File—>Settings—->Editor—->FileandCodeTemplates—>Includes—>FileHeader:之后点applay–…

    2022年9月30日
    4
  • document.getElementById的理解

    document.getElementById的理解个人现在的理解就是在一个页面中找到对应id的模块

    2022年7月15日
    24
  • django的drf框架的优点_道德经的理解与感悟

    django的drf框架的优点_道德经的理解与感悟Django是基于Python编程语言开发的一套重量级的用于web开发的框架所谓web开发框架,就是基于网络通信原理,为了便于开发,对代码流进行了统一的封装和集成Django是对Python的封装,而DRF又在Django的基础上做了进一步的封装相较于Django,DRF更加适用于前后端分离的开发模式Django自带template模板,最终会生成一个html页面。而DRF通过序列化器和丰富的视图类,向服务器提交json格式的数据。…

    2025年8月2日
    4
  • 安卓反编译_apk可以反编译吗

    安卓反编译_apk可以反编译吗本帖最后由好奇害死猫咪啊于2017-5-621:48编辑本教程为长期更新贴,有问题请及时反馈。如有更新请恕不另行通知。【前言】闲来无事水一贴。。。今天写个教程吧,反编译SystemUI实现状态栏时钟居中。其实说实话本来对华为靠右边的时间不怎么介意的,可一位朋友说什么也想换成类似iPhone的居中式,甚至不惜去刷XP框架,装重力工具箱。。当然了,结果大家可能已经想到了,首先是重力工…

    2026年1月20日
    3
  • FileStream 总结[通俗易懂]

    FileStream 总结[通俗易懂]FileStream如何去理解FileStream?通过前3章的学习相信大家对于Stream已经有一定的了解,但是又如何去理解FileStream呢?http://tudou.fzl1314.com 请看下图   我们磁盘的中任何文件都是通过2进制组成,最为直观的便是记事本了,当我们新建一个记事本时,它的大小是0KB,我们每次输入一个数字或字母时文件便会自动增大4kb,可…

    2022年7月12日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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