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;
}
exosip的更多相关文章
- linux下编译eXosip、osip,以及UAC和UAS的例子
从网站上看到了这样的一篇博文 :Windows下编译eXosip.osip,以及UAC和UAS的例子 (链接:http://www.cnblogs.com/dyllove98/archive/2013 ...
- Windows下编译eXosip、osip,以及UAC和UAS的例子
今天开始了SIP开源库的学习,我选择了osip和eXosip,但是这两个库的编译使用有些麻烦,源码下来之后编译会出现很多问题,网上也没有找到完整的编译介绍,只能一步一步的找办法解决,最后终于编译成功! ...
- osip及eXosip的编译方法
osip及eXosip的编译方法 在最新版本的osip2.exosip2中不支持在VC6.0下编译osip.exosip协议栈的方法 说明: 1.以下文章中的osip版本为3.1.0 2.eXosip ...
- [置顶] 我的GB28181标准开发里程碑——基于eXosip的IPC端与SPVMN注册成功
昨天编译搭建好eXosip的开发环境后,今天完成了SIP注册功能,里程碑一战啊!加油加油,成功就在眼前! 今天基于eXosip做了一个IPC客户端,成功与公安部的SPVMN视频监控联网调测软件自测工具 ...
- eXosip sip
eXosip是对osip的封装,是对sip协议的使用更简单.osip是gnu开源的sip协议实现. 介绍: http://savannah.nongnu.org/projects/exosip 下载地 ...
- 利用exosip DNS CACHE自定义SIP服务器地址和端口
文章标题可能表述不清,罢了,我这里描述一个场景: 当使用exosip开发UA时,服务器地址是域名example.com和端口形式,但存在两个限制: 1.example.com没有DNS记录.没有NAP ...
- Osip2和eXosip协议栈的简析
Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高. eXosip是Osip2的一个扩展协议集,它部分封装 ...
- exosip/osip 杂项
exosip 对比osip osip2和eXosip2协议 exosip 和 pjsip 简介 如果要实现嵌入式设备上的SIP电话或者其它,PJSIP是我所见的Coding和Design最为优秀的了, ...
- exosip 和 pjsip 简介
oSIP oSIP的开发开始于2000年7月,第一个版本在2001年5月发 布,到现在已经发展到3.x了.它采用ANSI C编写,而且结 构简单小巧,所以速度特别快,它并不提供高层的SIP会话 控制 ...
随机推荐
- 【转】android Apk打包过程概述_android是如何打包apk的
最近看了老罗分析android资源管理和apk打包流程的博客,参考其他一些资料,做了一下整理,脱离繁琐的打包细节和数据结构,从整体上概述了apk打包的整个流程. 流程概述: 1.打包资源文件,生成 ...
- Linux下GPIO驱动
编写驱动程序,首先要了解是什么类型的设备.linux下的设备分为三类,分别为:字符设备,块设备和网络设备.字符设备类型是根据是否以字符流为数据的交换方式,大部分设备都是字符设备,如键盘,串口等,块设备 ...
- The Automated Testing Handbook 自动化测试手册简介
Learn what works, what doesn't and why. The Automated Testing Handbook is a practical blueprint for ...
- 对象指针与this指针
对象指针分为三大类 [1]指向对象的指针 [2]指向对象成员的指针(数据类) [3]指向对象成员的指针(函数类) #include<iostream> using namespace st ...
- Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2以后版本)
本来这个问题真的没必要写的,可是真的困扰我太久%>_<%,决定还是记录一下. 首先,最权威清晰的安装文档还是官方的: Building the NetCDF-4.2 and later F ...
- 找不到或无法加载已注册的 .Net Framework Data Provide
在使用数据库的工程模式时,运行到下面代码第四行时,出现“找不到或无法加载已注册的 .Net Framework Data Provide”的错误! private DbProviderFactory ...
- 更换Oracle备份数据文件
应用背景:需要查看和修改一下Interlib中的数据,所以要反复的将备份数据进行导入和清空.整理一下步骤 删除tablespace drop tablespace interlib including ...
- 使用SignalR实现比特币价格实时刷新
ASP.NET SignalR是微软支持的一个运行在 Dot NET 平台上的 HTML Websocket 框架.它出现的主要目的是实现服务器主动推送(Push)消息到客户端页面,这样客户端就不必重 ...
- 【转】使用JavaScriptCore在JS和OC间通信
http://www.cocoachina.com/ios/20160623/16796.html iOS 开发中,我们时不时的需要加载一些 Web 页面,一些需求使用 Web 页面来实现可以更可控, ...
- [ASP.NET MVC] Child actions are not allowed to perform redirect
我在Umbraco平台下,用MVC(SurfaceController)开发时,遇到这个问题 MemberEdit是一个partial View [HttpGet] [ActionName(" ...