使用数据库存储Freeswitch账户与密码

873 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。

FreeSWITCH-CN Google Groups 很好很强大,可 FreeSWITCH 遵循RFC并支持很多高级的SIP特性,如 presence、BLF、SLA以及TCP、TLS和sRTP等。它也可以用作一个SBC进行透明的SIP代理(proxy)以支持其它媒体如T.38等。FreeSWITCH 支持宽带及窄带语音编码,电话会议桥可同时支持8、12、16、24、32及48kHZ的语音。而在传统的电话网络中,要做到三方通话或多方通话需要通过专门的芯片来处理,其它像预付费,彩铃等业务在PSTN网络中都需要依靠智能网(IN)才能实现,而且配置起来相当不灵活。 FreeSWITCH 是一个开源的电话交换平台,从一个简单的软电话客户端到运营商级的软交换设备几乎无所不能。能原生地运行于Windows、Max OS X、Linux、BSD 及 solaris 等诸多32/64位平台。可以用作一个简单的交换引擎、一个PBX,一个媒体网关或媒体支持IVR的服务器等。它支持SIP、H323、Skype、Google Talk等协议,并能很容易地与各种开源的PBX系统如sipXecs、Call Weaver、Bayonne、YATE及Asterisk等通信。

Freeswitch默认使用XML文件存放账户与密码信息,若要方便修改(或与其他系统对接),则需要存放到数据库中,本文以存放在PostgreSQL数据库为例:\

  • 安装unixODBC与PostgreSQL,并修改Freeswitch以支持PostgreSQL。
  • 创建用户信息数据库表(使用psql在freeswitch数据库中):   

    Create table userinfo(

     ID int Primary Key Not NULL,

     UserName varchar(32) Not NULL,

     Password varchar(32) Not NULL

    );

  • 修改lua.conf.xml增加用户生成脚本控制(在settings节点中增加):

   

   

  • 生成gen_user.lua(scripts目录下)

    local req_domain = params:getHeader("domain")

    local req_key    = params:getHeader("key")

    local req_user   = params:getHeader("user")

    local req_password

    \

    local dbh = freeswitch.Dbh("odbc://freeswitch::");

    if dbh:connected() == false then 

     freeswitch.consoleLog("WARN","connect DB fail");

     return;

    else

     dbh:query("select password from userinfo where username='"..req_user .. "'",function(row)

     --freeswitch.consoleLog("NOTICE",string.format("%s\n",row.password))

     req_password=string.format("%s",row.password)

     end);

     dbh:release();

    end

    \

    --assert (req_domain and req_key and req_user,

    --"This example script only supports generating directory xml for a single user !\n")

    if req_domain = nil and req_key=nil and req_user~=nil then

        XML_STRING =

        [[

       

         

           

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

    

           

         

        ]]

    

     freeswitch.consoleLog("INFO","Gen XML_STRING for user " .. req_user .. " OK");

    else

        XML_STRING =

        [[

       

         

         

        ]]

    

     freeswitch.consoleLog("ERROR","Can not gen XML_STRING for user " .. req_user);

    end

  • 修改directory/default.xml,移除一下内容(禁止从XML获取用户信息)