Opensips

1、引入
 
随着通信IP化的发展,IP传输的高带宽、低成本等优势使得越来越多的企业、电信运营商加快建设基于IP的各种通信应用。在通信协议IP化发展中,SIP协议毫无争议地成为各大电信运营商构建其未来网络的基础协议,越来越多的SIP软件产品也不断出现在行业应用中。SIP协议的标准化,同时也造就了一大批优秀的开源软件产品,包括Asterisk、 SipXecs、FreeSWITCH、OpenSIPS等SIP服务端软件,也包括X-lite、LinPhone、eyeBeam等SIP客户端软件。本文介绍了国外成熟的SIPServer开源项目OpenSIPS,并结合其它通信方面的开源项目对其应用情况进行了一些介绍。
 
2、OpenSIPS介绍
 
OpenSIPS是一个成熟的开源SIP服务器,除了提供基本的SIP代理及SIP路由功能外,还提供了一些应用级的功能。OpenSIPS的结构非常灵活,其核心路由功能完全通过脚本来实现,可灵活定制各种路由策略,可灵活应用于语音、视频通信、IM以及Presence等多种应用。同时OpenSIPS性能上是目前最快的SIP服务器之一,可用于电信级产品构建。
 
2.1、功能特点
 
凭借其可扩展、模块化的系统架构,OpenSIPS提供了一个高度灵活的、用户可配置的路由引擎,可以为voice、video、IM和presence等服务提供强大高效的路由、鉴权、NAT、网关协议转化等功能。由于其稳定高效等特点,OpenSIPS已经被诸多电信运营商应用在自己的网络体系中。其主要功能如下:
 
SIP注册服务器/代理服务器(lcr、dynamic routing、dialplan)/重定向服务器
SIP presence agent
SIP B2BUA
SIP IM Server
SIP to SMS/XMPP网关
SIP to XMPP网关
SIP 负载均衡
SIP NAT traversal
 
2.2、基本应用配置
 
OpenSIPS 不但提供了丰富的功能,还具有操作简单的特点。所有OpenSIPS的应用功能都可以通过一个配置文件opensips.cfg来实现的。该配置文件主要分为三个部分,第一部分主要是全局变量的设置;第二部分主要是加载模块,并设置模块的相应参数;第三部分主要是路由的策略和功能应用。为了更清晰的呈现 opensips.cfg配置文件带来的强大功能,接下来对这三个部分以简单的示例进一步说明。
 
第一部分全局变量的设置,通过一条语句就能指定用于侦听接收sip消息的端口和传输层协议。
 
第二部分负责模块的加载和参数配置。以之前的OpenSIPS的负载均衡功能配置为例,需要加载load_balancer模块,并进行配置。
 
第三部分是sip消息的路由和功能应用。还是以OpenSIPS的负载均衡功能为例。
 
从以上应用示例可以看到,通过在opensips.cfg中进行简单的配置,就能实现强大的功能。
 
2.3、系统结构
 
OpenSIPS的架构开放灵活,其核心功能控制均可通过脚本控制实现,各个功能也通过模块加载的方式来构建。采用lex和yacc工具构建的配置文件分析器是其架构设计中的重要部分之一。通过这个分析器,opensips设计了自己的语法规则,使得我们可以适合SIP规范的语言来进行配置文件中的脚本编写,从而达到简化程序以及方便代码阅读的目的。同时这样的设计也使opensips.cfg配置文件的执行速度达到了C语言的级别。其体系结构大体如下图:
 
框架的最上层是用于实现sip消息路由逻辑的opensips.cfg脚本配置,在配置文件中,可以使用Core提供的Parameter和 Function,也可以使用众多Modules提供的Function。比如在之前的负载均衡示例中,is_method(“INVITE”)就属于 textops模块提供的功能,src_ip和src_port都属于Core提供的参数。下层,提供了网络传输、sip消息解析等基本功能。在左侧,通过相应的数据库适配器,可是使用多种数据库存取数据。在这样的体系结构下,我们就可以方便地通过增加功能module来添加我们需要的功能,而不会对原有系统造成影响。
 
除了以上所述的OpenSIPS的优点,OpenSIPS还提供了一系列的管理维护命令的接口。我们可以通过Core和Module提供的MI管理接口,方便的监控系统以及模块的状态。比如,通过Core的fifo ps命令,可以获取当前进程的状态;通过Core的fifo get_statistics命令,可以获得当前共享内存以及各进程私有内存的使用情况等等。通过MI管理接口,我们还可以方便地在运行时修改部分参数,比如,对于load_balancer模块,我们可以通过fifo lb_reload命令,更新目标组的配置信息,可以通过fifo lb_status命令激活或关闭某个目标,这些命令在实际应用中都非常实用。如果希望通过WEB图形界面管理OpenSIPS,OpenSIPS社区还提供了OpenSIPS Control Panel 4.0产品。
 
3、与其它开源项目共同搭建VOIP服务
 
OpenSIPS提供了以上那么多的功能,那OpenSIPS是不是已经实现了PBX的功能了?不是!OpenSIPS并不具备一个媒体服务器(Media Server)的功能。媒体服务器主要提供了类似VoiceMail、呼叫中语音交换、会议服务、视频服务等一系列和语音、视频相关的服务;而OpenSIPS的主要功能主要在于代理、路由和网关。因此,单独的OpenSIPS并不能够提供VOIP服务,只有和Asterisk等具备媒体功能的软件整合,才能构建可靠的语音服务体系。
 
对于媒体服务器,开源世界也提供了很多选择,如老牌的Asterisk,以及功能全面的sipXecs以及专注于IVR功能的FreeSwitch等,他们都是非常优秀的开源项目。其中Asterisk功能全面、灵活,但主要面向企业应用,在性能上稍差。但Asterisk提供了完善的PBX功能,可以连接多种不同的电话终端,支持多种主流的IP电话协议和系统接口。FreeSwtich专注于IVR功能,性能、可靠性非常高。近期FreeSwitch已被sipXecs采用作为其IVR部分功能。 sipXecs则是一个功能比较全面的产品,包括IVR、VoiceMail、人工坐席等等,更难得的是SipXecs提供了良好的配置、管理界面,易于使用。
 
只要将OpenSIPS作为前置接入,将多个Asterisk、FreeSwitch、sipXecs挂接在其后,由OpenSIPS实现SIP消息的转发和负载均衡,就可以轻松地实现各种语音业务以及规模扩展。如下图所示。
 
4、小结
 
从文中介绍可以看出,OpenSIPS是一个成熟的电信级SIP Server平台,可广泛应用于SIP应用的路由分发、负载均衡,可用于搭建SIP代理,提供SIP注册服务等。而且目前OpenSIPS自身也提供SIP Presence以及IM功能。同时,应该注意的是OpenSIPS本身并不提供媒体相关服务,如呼叫中心、VoiceMail等业务,该部分业务可通过FreeSwtich、sipXecs等平台实现。
 
参考文献:
[1].OpenSIPS:  http://www.opensips.org/
 
  
 
配置
 
  
 
  
   opensips安装配置 收藏
 
 
使用de环境:
 
VMware虚拟环境下的Red hat enterprise linux
 
(其他版本也可以,安装时对于新手,建议软件包全部安装,避免后期有好多工具都没有。避免补安装时会出现连锁的问题,这个很麻烦)
 
版本:
 
Opensips-1.4.3(官方网站 http://www.opensips.org/
 
前期准备:
 
LINUX基本指令的熟悉
 
Mysql:我们选用的数据库,使用系统自带的mysql就可以,注意安装系统时选上mysql安装包。
 
mysql一些指令:
 
show databases;
 
use opensips;
 
show tables;
 
select * from subscribers;
 
drop;
 
create;
 
and so on;
 
Opensips的安装:
 
1、 官方网站http://www.opensips.org/的download中下载opensips软件包
 
2、 编译:
 
tar zxvf opensips-1.4.3-tls_src.tar.gz
 
cd opensips-1.4.3-tls
 
3、安装之前更改makefile:
 
删除Makefile中的exclude_modules 的db-mysql ,为了使opensips支持mysql。
 
4、 安装
 
make all
 
make install
 
默认安装路径/usr/local下
 
5、 创建opensips的数据库
 
vi /usr/local/opensips/etc/opensips/opensipsctlrc 把mysql的相关的注释去掉
 
## database type: MYSQL, PGSQL, ORACLE, DB_BERKELEY, or DBTEXT, by default none is loaded
 
# If you want to setup a database with opensipsdbctl, you must at least specify
 
# this parameter.
 
DBENGINE=MYSQL
 
## database host
 
DBHOST=localhost
 
## database name (for ORACLE this is TNS name)
 
DBNAME=opensips
 
# database path used by dbtext or db_berkeley
 
DB_PATH="/usr/local/etc/opensips/dbtext"
 
## database read/write user
 
DBRWUSER=opensips
 
## password for database read/write user
 
DBRWPW="opensipsrw"
 
## database read only user
 
DBROUSER=opensipsro
 
## password for database read only user
 
DBROPW=opensipsro
 
## database super user (for ORACLE this is 'scheme-creator' user)
 
DBROOTUSER="root"
 
# user name column
 
USERCOL="username"
 
执行opensips/sbin/下的opensipsdbctl
 
./opensipsdbctl create (生成opensips数据库)
 
5.opensips的运行
 
opensips/sbin/下的opensipsctl start来启动opensips
 
ps -efw opensips 检查应该已经运行了。
 
opensips/sbin/下的opensipsctl stop来停止opensips
 
到此完成了opensips的安装。
 
Opensips.cfg文档的配置
 
1、 实现注册,认证功能
 
debug=4
 
fork=yes
 
log_stderror=yes # (cmd line: -E)
 
port=5060
 
children=4
 
dns=no
 
rev_dns=no
 
# ------------------ module loading ----------------------------------
 
#set module path
 
mpath="/usr/local/lib/opensips/modules/"
 
loadmodule "db_mysql.so"
 
loadmodule "sl.so"
 
loadmodule "tm.so"
 
loadmodule "rr.so"
 
loadmodule "maxfwd.so"
 
loadmodule "usrloc.so"
 
loadmodule "registrar.so"
 
loadmodule "textops.so"
 
loadmodule "mi_fifo.so"
 
loadmodule "uri_db.so"
 
loadmodule "auth.so"
 
loadmodule "auth_db.so"
 
# ----------------- setting module-specific parameters ---------------
 
# -- mi_fifo params --
 
modparam("mi_fifo","fifo_name","/tmp/opensips_fifo")
 
# -- usrloc params --
 
# modparam("usrloc", "db_mode", 0)
 
# Uncomment this if you want to use SQL database
 
# for persistent storage and comment the previous line
 
modparam("usrloc", "db_mode", 2)
 
modparam("auth_db", "calculate_ha1", yes)
 
modparam("auth_db", "password_column", "password")
 
modparam("rr", "enable_full_lr", 1)
 
# ------------------------- request routing logic -------------------
 
# main routing logic
 
route{
 
# initial sanity checks -- messages with
 
# max_forwards==0, or excessively long requests
 
if (!mf_process_maxfwd_header("10"))
 
{
 
sl_send_reply("483","Too Many Hops");
 
exit;
 
};
 
if (msg:len > max_len )
 
{
 
sl_send_reply("513", "Message too big");
 
exit;
 
};
 
if (method!="REGISTER")
 
{
 
record_route();
 
}
 
if (loose_route())
 
{
 
append_hf("P-hint: rr-enforced\r\n");
 
route(1);
 
exit;
 
};
 
if (uri!=myself)
 
{
 
# mark routing logic in request
 
append_hf("P-hint: outbound\r\n");
 
# if you have some interdomain connections via TLS
 
# if(uri=~"@tls_domain1.net") {
 
# t_relay("tls:domain1.net");
 
# exit;
 
#} else if(uri=~"@tls_domain2.net") {
 
# t_relay("tls:domain2.net");
 
# exit;
 
#}
 
route(1);
 
exit;
 
};
 
# if the request is for other domain use UsrLoc
 
# (in case, it does not work, use the following command
 
# with proper names and addresses in it)
 
if (uri==myself)
 
{
 
if (method=="REGISTER")
 
{
 
# Uncomment this if you want to use digest authentication
 
# if (!www_authorize("","subscriber")) {
 
# www_challenge("", "0");
 
# exit;
 
#};
 
save("location");
 
#route(2);
 
exit;
 
};
 
#---------added from book
 
if (!proxy_authorize("","subscriber"))
 
{
 
proxy_challenge("","0");
 
exit;
 
};
 
consume_credentials();
 
#---------add end
 
lookup("aliases");
 
if (uri!=myself)
 
{
 
append_hf("P-hint: outbound alias\r\n");
 
route(1);
 
exit;
 
};
 
# native SIP destinations are handled using our USRLOC DB
 
if (!lookup("location"))
 
{
 
sl_send_reply("404", "User Not Found");
 
exit;
 
};
 
append_hf("P-hint: usrloc applied\r\n");
 
};
 
route(1);
 
}
 
route[1] {
 
# send it out now; use stateful forwarding as it works
 
# reliably even for UDP2TCP
 
if (!t_relay()) {
 
sl_reply_error();
 
};
 
#exit;
 
}
 
#route[2] {
 
# ------------------------------------------------------------------------
 
# REGISTER Message Handler
 
# ------------------------------------------------------------------------
 
#if (!save("location")) {
 
#sl_reply_error();
 
#};
 
#}
 
为实现注册和认证功能,除了配置好opensips.cfg,还需改动opensipsctl中的一些地方,记录如下:
 
默认文档中为:
 
## path to FIFO file
 
OSIPS_FIFO="FIFO" (路径不对)
 
改为:
 
OSIPS_FIFO="/tmp/opensips_fifo"
 
运行:
 
1、运行mysql:
 
Service mysqld start
 
2、开启opensips:
 
opensipsctl restart
 
3、configure two users accounts.(格式:opensipsctl add user password)
 
opensipsctl add 1001 1001
 
opensipsctl add 1002 1002
 
注:opensipsctl rm -------remove users
 
opensipsctl passwd-----change a password
 
4、 用已有用户和密码注册两个sip softphone(我用的X-lite和eyebeam)
 
5、 检查是否注册成功
 
opensipsctl ul show
 
6、 检查是否在线
 
opensipsctl online
 
注:两个sip softphone注册必须使用数据库中已有的用户名和密码,否则将不能通过认证。
 
7、make a call from one phone to the other。
 
Powered by Zoundry Raven
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然!我可以给你提供一些关于OpenSIPS(Open SIP Server)的教程。 1. 开始使用OpenSIPS - 首先,你需要安装OpenSIPS。你可以从官方网站上下载最新的稳定版本,并按照它们的安装指南进行安装。 - 一旦安装完成,你可以通过在命令行中输入“opensipsctl start”来启动OpenSIPS。 - 接下来,你可以配置OpenSIPS以满足你的需求。配置文件位于/etc/opensips/目录下。你可以编辑这些文件来定义路由规则、处理脚本和其他功能。 - 完成配置后,你可以使用“opensipsctl start”命令重新启动OpenSIPS以加载新的配置。 2. OpenSIPS 路由 - OpenSIPS的主要功能之一是路由。通过配置路由规则,你可以决定如何处理传入和传出的SIP请求。 - 在配置文件中,你可以使用“route”关键字定义路由规则。例如,你可以定义一个基本的路由规则来处理所有传入的INVITE请求: ``` route{ if (is_method("INVITE")) { # 在这里处理INVITE请求 } } ``` - 你可以在路由规则中使用OpenSIPS的函数和变量来处理请求并制定下一步的行为。 3. OpenSIPS 脚本语言 - OpenSIPS使用自己的脚本语言来处理SIP请求和响应。这个脚本语言是基于类C语法的。 - 你可以在路由规则中使用脚本语言来执行各种操作,例如:修改请求、添加头部、发送请求等。 - 你可以参考OpenSIPS官方文档中的脚本语言指南,以了解更多关于它的详细信息。 4. OpenSIPS 模块 - OpenSIPS通过模块来扩展其功能。模块提供了各种功能,例如:认证、媒体处理、数据库集成等。 - 你可以使用OpenSIPS的模块管理工具来查看已安装的模块和加载/卸载模块。例如,你可以使用以下命令查看已加载的模块: ``` opensipsctl module ``` 这只是OpenSIPS的一些基础知识和指导,希望对你有所帮助!如果你对特定主题有更多问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值