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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 笑说程序员的工作_程序员工作辛苦吗

    笑说程序员的工作_程序员工作辛苦吗笑说程序员的工作

    2022年4月22日
    38
  • 变电站后台监控系统[通俗易懂]

    变电站后台监控系统[通俗易懂]变电站后台监控系统实现对35KV变电站的主要设备和输、配电线路的自动监视、测量、自动控制和微机保护,以及与调度通信等综合性的自动化功能。实现对电网运行的实时监控,使值班人员和系统调度人员通过管理平台及时把握系统的运行状态和事故处理的主动性,另外配套的手机客户端软件实现了移动终端功能,可随时随地查看或管理电网,提高电网的自动化管理水平、供电质量。为达到这一目的,满足电网运行对变电站后台监控系统的要求,变电站综合电力自动化系统体系由“数据采集和控制”、“继电保护”、“直流电源系统”三大块构成变电站自动化基础。

    2022年7月25日
    15
  • 这个问题让我疯掉!用oledbcommand执行一个插入一条记录的程序,到现在也没有解决!…

    这个问题让我疯掉!用oledbcommand执行一个插入一条记录的程序,到现在也没有解决!…数据库结构:StringStr=”INSERTINTODataHis(时间,开盘价,最高价,最低价,收盘价)VALUES(’98-02-12′,4,34,45,56)”;//StringStr=”select*fromDataHis”;stringstrConn=”Provider=Mic…

    2022年5月12日
    30
  • 【项目实战】登录与注册业务的实现(前端+后端+数据库)

    【项目实战】登录与注册业务的实现(前端+后端+数据库)本示例基于 Vue js 和 mintUI 实现 目录一 数据库的创建二 后端接口与数据库的连接三 前端代码实现 1 注册页相关代码 2 注册页效果 3 登录页相关代码 4 登录页效果四 注册登录演示一 数据库的创建此处以 Navicat 软件进行创建 新建数据库 reg log sql 与数据表 reg log 为了实现注册业务 我们在数据库中设计 ID 用户名 密码 邮箱 电话号 5 个字段 创建结束后保存 便可

    2025年9月26日
    4
  • 使用SecureCRTPortable向Linux上传文件

    使用SecureCRTPortable向Linux上传文件1.打开SecureCRTPortable2.点击上册菜单栏文件->连接SFTP会话(S)3.上传文件sftp>put-r”本地文件目录\文件名”4.输入完成后点击回车,会将文件上传到Linux的当前用户的home目录下解析:如果你是用root连接的sftp,那么上传的文件就会保存到/root目录下…

    2022年6月9日
    36
  • 格式化hdfs的命令_hadoop的启动命令

    格式化hdfs的命令_hadoop的启动命令总结:上传文件:put、copyFromLocal、moveFromLocal下载文件:get、copyToLocal、moveToLocal查看文件:text、cat、tail合并文件:getmerge命令详解HDFS命令基本格式:hadoopfs-cmd<args>表格:选项名称使用格式含义-ls-ls查看指定路径的当前目录结构-lsr-lsr递归查看指定路径的目录结…

    2022年9月1日
    5

发表回复

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

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