zoukankan      html  css  js  c++  java
  • exosip

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

     
  • 相关阅读:
    【搜索】棋盘 luogu-3956
    【动态规划】石子合并 luogu-1880
    【动态规划】合唱队形 luogu-
    【模拟】报名签到 luogu-4445
    【排序+贪心】导弹拦截 luogu-1158
    【模拟】不高兴的津津
    【模拟】选数 luogu-1037
    「JOISC2020」建筑装饰 4
    「清华集训」小 Y 和恐怖的奴隶主
    「CF708E」Student's Camp
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4003042.html
Copyright © 2011-2022 走看看