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获取用户信息)