zoukankan      html  css  js  c++  java
  • freeswitch用户整合(使用mysql数据库的用户表)

    freeswitch是一款强大的voip服务器,可以语音和视频。但是它默认是采用/directory文件夹下的xml来配置用户的,对于整合到现有系统或者使用数据库保存用户信息的系统都是非常不方便的,所以,本文主要描述一种方法,解决freeswitch用户整合的问题。

    完成这一任务需要三步,配置unixodbc,将用户验证转接到lua脚本,修改拨号计划使得拨通所有号码


    开发环境:centos 6.2 64位,  freeswitch,  linphone,mysql

    1  首先安装unixodbc

        unixODBC是一个可以让你在Unix/Linux系统下使用ODBC来连接数据库的组件,就像java中的mysql-connector-java-5.1.6-bin.jar一样,负责连接数据库的。

    yum install unixODBC-devel.x86_64

    yum install mysql-connector-odbc.x86_64

    安装后修改两个文件:/etc/odbc.ini,/etc/odbcinst.ini

    /etc/odbc.ini  配置要连接的数据库信息

    [freeswitch]

    Driver          = /usr/lib64/libmyodbc5.so

    SERVER       = ip

    PORT           = 3306

    DATABASE    = database

    USER            = user

    PASSWORD   = password

    /etc/odbcinst.ini 修改mysq的部分,将驱动包指向正确,这要根据你本身的包安装路径配置

    # Example driver definitions

    # Driver from the postgresql-odbc package

    # Setup from the unixODBC package

    [PostgreSQL]

    Description     = ODBC for PostgreSQL

    Driver          = /usr/lib/psqlodbc.so

    Setup           = /usr/lib/libodbcpsqlS.so

    Driver64        = /usr/lib64/psqlodbc.so

    Setup64         = /usr/lib64/libodbcpsqlS.so

    FileUsage       = 1

    # Driver from the mysql-connector-odbc package

    # Setup from the unixODBC package

    [MySQL]

    Description     = ODBC for MySQL

    Driver          = /usr/lib64/libmyodbc5.so

    Setup           = /usr/lib64/libodbcmyS.so

    Driver64        = /usr/lib64/libmyodbc5.so

    Setup64         = /usr/lib64/libodbcmyS.so

    FileUsage       = 1

     
     
    修改之后,执行  isql -v freeswitch
    如果出现
    [root@test etc]# isql -v freeswitch
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL> 
    则代表你的unixodbc配置成功了
     

    2  修改用户注册部分,转接到lua脚本进行注册验证

    修改freeswitch/conf/autoload_configs/lua.conf.xml

    <configuration name="lua.conf" description="LUA Configuration">

      <settings>

        <!--

        Specify local directories that will be searched for LUA modules

        These entries will be pre-pended to the LUA_CPATH environment variable

        -->

        <!-- <param name="module-directory" value="/usr/lib/lua/5.1/?.so"/> -->

        <!-- <param name="module-directory" value="/usr/local/lib/lua/5.1/?.so"/> -->

        <!--

        Specify local directories that will be searched for LUA scripts

        These entries will be pre-pended to the LUA_PATH environment variable

        -->

        <!-- <param name="script-directory" value="/usr/local/lua/?.lua"/> -->

        <!-- <param name="script-directory" value="$${base_dir}/scripts/?.lua"/> -->

        <!--<param name="xml-handler-script" value="/dp.lua"/>-->

        <!--<param name="xml-handler-bindings" value="dialplan"/>-->

        <param name="xml-handler-script" value="gen_dir_user_xml.lua" />

        <param name="xml-handler-bindings" value="directory" />

        <!--

            The following options identifies a lua script that is launched

            at startup and may live forever in the background.

            You can define multiple lines, one for each script you

            need to run.

        -->

        <!--<param name="startup-script" value="startup_script_1.lua"/>-->

        <!--<param name="startup-script" value="startup_script_2.lua"/>-->

      </settings>

    </configuration>

    让lua脚本接管用户注册验证,这里默认调用的脚本是freeswitch/script/gen_dir_user_xml.lua
    脚本内容如下:
    freeswitch.consoleLog("NOTICE","lua take the users... ");
    -- gen_dir_user_xml.lua
    -- example script for generating user directory XML
     
    -- comment the following line for production:
    --freeswitch.consoleLog("notice", "Debug from gen_dir_user_xml.lua, provided params: " .. params:serialize() .. " ")
     
    local req_domain = params:getHeader("domain")
    local req_key    = params:getHeader("key")
    local req_user   = params:getHeader("user")
    local req_password   = params:getHeader("pass")
     
    local dbh = freeswitch.Dbh("freeswitch","user","password");
    freeswitch.consoleLog("NOTICE","start connect DB... ");
    assert(dbh:connected());
    dbh:query("select password from Users where id="..req_user,function(row)
            freeswitch.consoleLog("NOTICE",string.format("%s ",row.password))
            req_password=string.format("%s",row.password)
    end);
    dbh:release();
     
    freeswitch.consoleLog("NOTICE","info:"..req_domain.."--"..req_key.."--"..req_user.."--"..req_password.." ");
     
     
     
    --assert (req_domain and req_key and req_user,
    --"This example script only supports generating directory xml for a single user ! ")
    if req_domain ~= nil and req_key~=nil and req_user~=nil then
        XML_STRING =
        [[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <document type="freeswitch/xml">
          <section name="directory">
            <domain name="]]..req_domain..[[">
              <params>
            <param name="dial-string"
            value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/>
              </params>
              <groups>
            <group name="default">
              <users>
                <user id="]] ..req_user..[[">
                  <params>
                <param name="password" value="]]..req_password..[["/>
                <param name="vm-password" value="]]..req_password..[["/>
                  </params>
                  <variables>
                <variable name="toll_allow" value="domestic,international,local"/>
                <variable name="accountcode" value="]] ..req_user..[["/>
                <variable name="user_context" value="default"/>
                <variable name="directory-visible" value="true"/>
                <variable name="directory-exten-visible" value="true"/>
                <variable name="limit_max" value="15"/>
                <variable name="effective_caller_id_name" value="Extension ]] ..req_user..[["/>
                <variable name="effective_caller_id_number" value="]] ..req_user..[["/>
                <variable name="outbound_caller_id_name" value="${outbound_caller_name}"/>
                <variable name="outbound_caller_id_number" value="${outbound_caller_id}"/>
                <variable name="callgroup" value="techsupport"/>
                  </variables>
                </user>
              </users>
            </group>
              </groups>
            </domain>
          </section>
        </document>]]
    else
        XML_STRING =
        [[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
        <document type="freeswitch/xml">
          <section name="directory">
          </section>
        </document>]]
    end
     
    -- comment the following line for production:
    freeswitch.consoleLog("notice", "Debug from gen_dir_user_xml.lua, generated XML: " .. XML_STRING .. " ");
     
     
    修改freeswitch/conf/directory中的一部分内容,使得通过xml验证用户的功能失效,这样lua才能真正接管用户注册
    删除的内容如下:
    <group name="default">
            <users>
              <X-PRE-PROCESS cmd="include" data="default/*.xml"/>
            </users>
     </group>
     
     
    3  修改拨号计划
    修改freeswitch/conf/dialplan/default.xml
    修改如下内容,好让所有的拨号通过以下的条件
     <extension name="Local_Extension">
           <!--<condition field="destination_number" expression="^(10[01][0-9])$">-->
           <condition field="destination_number" expression="^(.*)$">
     
    完成以上步骤,就基本完成了用户整合的全部内容,但是要注意一点,第一步配置unixodbc之后,要重新编译下freeswitch的源码,即在/usr/local/src/freeswitch下执行 configure&&make install,然后重启freeswitch。
    还有就是每次修改xml后都需要重新在freeswitch控制台或者fs_cli下执行reloadxml,使得修改生效,修改lua脚本,则不需要如上操作。
     
    来源:http://linyu19872008.iteye.com/blog/1736641
  • 相关阅读:
    POJ1475 Pushing Boxes 华丽丽的双重BFS
    POJ3322 Bloxorz I 无脑广搜(我死了。。。)
    CH2401 送礼物 双向搜索
    POJ2248 Addition Chains 迭代加深
    POJ3074 Sudoku 剪枝深(神?)搜
    Luogu P1120 小木棍 [数据加强版] 来来来我们一起来剪枝,剪枝,剪枝、、、
    Luogu P4095 [HEOI2013]Eden 的新背包问题 思维/动规
    Luogu P5201 [USACO19JAN]Shortcut 最短路树???
    Luogu P5122 [USACO18DEC]Fine Dining 最短路
    Luogu P1608 路径统计 最短路计数
  • 原文地址:https://www.cnblogs.com/logo-fox/p/4517262.html
Copyright © 2011-2022 走看看