sip网络电话
来源:互联网 发布:儿童教学软件 编辑:程序博客网 时间:2024/05/17 06:39
http://blog.sina.com.cn/s/blog_59d649610100cqme.html
sip网络电话
首先要配置环境,需要这么几个库,libosip,libeXosip2,ortp,mediastreamer2.
libosip,libeXosip2这两个库是负责信令部分的,ortp,medastreamer2是负责媒体流传输的。如果想了解更多的关于这些库方面的信息,可以去网上搜索,会有很多相关的信息,总之学习不要怕麻烦。是师傅令进门,修行在个人。学习sip要看rfc3261 3265 3550 4353 ,还有eXosip,osip,ortp,mediastreamer2的帮助手册等。资料多了才好学习嘛。
sipAPI:http://www.gnu.org/software/osip/doc/html/group__oSIP__MESSAGE.html
eXosipAPI:http://www.antisip.com/doc/exosip2/group__eXosip2__sdp.html#gdab1e84d04b387ada72e0d548444f3c0
ortpAPI:http://download.savannah.gnu.org/releases-noredirect/linphone/ortp/docs/ortp_8h.html
mediastreamerAPI:http://www.antisip.com/doc/mediastreamer2/mscommon_8h.html
以上紧紧作为参考,并不是很全,如果想细细的研究分析,建议自己去看源码。哈,虽然会很累,但是效果很好。
下面这段是注册代码:
#include <eXosip2/eXosip.h>
#include <osip2/osip_mt.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
// ip_url 为服务器ip,
int myregister(char *ip_url,char *port,char *username,char * password)
{
int i;
char identity[50];
char registerer[50];
char localip[128];
static int flag = 0;
int id;
eXosip_guess_localip (AF_INET, localip, 128);
sprintf(identity,"sip:%s@%s",username,localip);
sprintf(registerer,"sip:%s:%s",ip_url,port);
//初始化
if( flag == 0)
{
i = eXosip_init();
if (i != 0)
{
return -1;
}
printf("eXosip_init success\n");
flag ++;
i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0);
if (i != 0)
{
eXosip_quit();
fprintf(stderr, "could not initialize transport layer\n");
return -1;
}
printf("eXosip_listen_addr success\n");
}
osip_message_t *reg = NULL;
eXosip_lock();
id = eXosip_register_build_initial_register (identity,registerer, NULL, 1800, ®);
printf("id = %d", id);
if (id < 0)
{
eXosip_unlock();
fprintf (stderr, "eXosip_register_build_initial_register failed:(bad arguments?)\n");
return 0;
}
eXosip_lock();
i = eXosip_register_send_register(id, reg);
if (i != 0)
{
fprintf (stderr, "eXosip_register_send_register failed: (bad arguments?)\n");
return 0;
}
eXosip_unlock ();
printf("eXosip_register_send_register OK\n");
eXosip_event_t *je;
for (;;)
{
je = eXosip_event_wait (0, 50);
eXosip_lock();
eXosip_automatic_action ();
eXosip_unlock();
if (je == NULL)
{
continue;
}
if (je->type == EXOSIP_REGISTRATION_SUCCESS)
{
printf("textinfo is %s\n", je->textinfo);
return 1;
break;
}
if(je->type == EXOSIP_REGISTRATION_FAILURE)
{
//注册失败之后,再次提交授权信息, 也可放在上面
eXosip_add_authentication_info(username, username,password, NULL, NULL);
}
if(je->type == EXOSIP_REGISTRATION_REFRESHED)
{
printf("refreshed");
return 0;
}
}
eXosip_quit();
}
ps:注册其实挺简单的,代码是用eXosip实现的,帮助手册上面都有,只要细细分析就能看明白,网上有pdf版本的,csdn上也有,英文的。
继续,下面这段是拨号的代码:
#include <eXosip2/eXosip.h>
#include <osip2/osip_mt.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
int call(char *telNum)
{