zoukankan      html  css  js  c++  java
  • 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/
    [2] FreeSwitch wiki: http://wiki.freeswitch.org/wiki/Main_Page
    [3] sipXecs: http://www.sipfoundry.org/

    配置

      opensips安装配置 收藏

    转自:http://blog.csdn.net/gouooo/archive/2009/01/03/3687757.aspx

    使用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

    3.

  • 相关阅读:
    Building Java Projects with Gradle
    Vert.x简介
    Spring及Spring Boot 国内快速开发框架
    dip vs di vs ioc
    Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS
    SSO的定义、原理、组件及应用
    ModSecurity is an open source, cross-platform web application firewall (WAF) module.
    TDD中测试替身学习总结
    Spring事务银行转账示例
    台式机(华硕主板)前面板音频接口(耳机和麦克风)均无声的解决办法
  • 原文地址:https://www.cnblogs.com/xianqingzh/p/1984338.html
Copyright © 2011-2022 走看看