大家都知道,FreeSWITCH默认是从磁盘中xml文件,决定系统中有哪些用户的。
以下非常简单的演示了,FreeSWITCH中的用户如何使用数据库注册。
准备工作:
一套LAMP或LNMP环境
编译FreeSWITCH 的mod_xml_curl 模块
Apache + PHP7 + MysqL 5.7 中的PHP脚本
根据实际情况,修改相关参数
zhouss@zhouss/var/www/html$catchunli_test.PHP <?PHP /* *作者:李春利 *功能:演示接收FreeSWITCH注册请求,连接到远程MysqL数据库检索用户密码,返回XML文件 *备注:PHP7.0版本程序,注意MysqL函数发生了变化 *MysqL数据库表快速创建: CREATEDATABASEIFNOTEXISTS`freeswitch`DEFAULTCHARACTERSETutf8; USE`freeswitch`; DROPTABLEIFEXISTS`authentication`; CREATETABLE`authentication`( `user_name`varchar(100)NOTNULL,`user_password`varchar(100)NOTNULL )ENGINE=InnoDBDEFAULTCHARSET=utf8; INSERTINTO`authentication`VALUES('lao_wang','tiger'),('1234','4321'),('chunli','chunli'),('1030','123456'),('1019','1234'),('2222','12345678'); */ $user=$_POST['user']; $domain=$_POST['domain']; $password=""; $db_host="172.16.66.111"; $db_user="root"; $db_pwd="root"; $db_name="freeswitch"; functiongetlink($db_host,$db_user,$sb_pwd,$db_name) { $link=MysqLi_connect($db_host,$sb_pwd); if(!$link) { echo"MysqL数据库连接失败\n"; exit(); } if(!MysqLi_select_db($link,$db_name)) { echo"MysqL数据库选择失败\n"; exit(); } MysqLi_query($link,"setnamesutf8"); return$link; } $link=getlink($db_host,$db_pwd,$db_name); $result=MysqLi_query($link,"selectuser_passwordfromauthenticationwhereuser_name='${user}'"); if(MysqLi_num_rows($result)>0) { while($row=$result->fetch_row()) { foreach($rowas$key=>$val) { $password=$val; } } $result->free(); } else { echo"查无此人{$user}\n"; exit(); } MysqLi_close($link); ?> <documenttype="freeswitch/xml"> <sectionname="directory"> <domainname="<?PHPecho$domain;?>"> <params> <paramname="dial-string"value="{presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(${dialed_user}@${dialed_domain})}"/> </params> <groups> <groupname="default"> <users> <userid="<?PHPecho$user;?>"> <params> <paramname="password"value="<?PHPecho$password;?>"/> </params> <variables> <variablename="user_context"value="default"/> </variables> </user> </users> </group> </groups> </domain> </section> </document> zhouss@zhouss/var/www/html$
编译FreeSWITCH 相关模块
[root@CentOS ~]# iptables -F
[root@CentOS ~]# iptables -X
编译mod_xml_curl,默认不编译
[root@CentOS01_install]#vimfreeswitch-1.6.17/modules.conf 将 #xml_int/mod_xml_curl 改为 xml_int/mod_xml_curl 编译./configure&&make&&makemod_xml_curl-install 具体你的configure怎么设置的,自己加上原先的参数。
使FreeSWITCH自动加载mod_xml_curl
[root@CentOSfreeswitch]#vim./autoload_configs/modules.conf.xml 将 <!--<loadmodule="mod_xml_curl"/>--> 改为 <loadmodule="mod_xml_curl"/>
修改FreeSWITCH用户注册的方式,HTTP优先,如果请求失败了,再到本地磁盘找xml文件
[root@CentOSfreeswitch]#vimautoload_configs/xml_curl.conf.xml <configurationname="xml_curl.conf"description="cURLXMLGateway"> <bindings> <bindingname="directory"> <paramname="gateway-url"value="http://172.16.20.17/chunli_test.PHP"bindings="directory"/> </binding> </bindings> </configuration>
[root@CentOSfreeswitch]#vimdialplan/default.xml <conditionfield="destination_number"expression="^(10[01][0-9]|1234|lao_wang)$">
启动FreeSWITCH
一个SIP 使用 ('lao_wang',注册
一个SIP 使用('1234',注册
互相拨打电话,试试
调错技巧:
按F8,打开 debug级别日志。
拨打电话,打不通,如果出现以下情况,说明HTTP请求是失败的,检查PHP脚本的ip,user,password参数
2017-06-2901:21:40.705900[WARNING]mod_voicemail.c:3487Can'tfinduser[1000@172.16.66.88]
如果出现以下情况,说明HTTP请求被拒绝,tcpdump 查看发来的包结构。
2017-06-2900:22:38.681206[WARNING]mod_xml_curl.c:294CURLreturnederror:[52]Serverreturnednothing(noheaders,nodata)
用户1234 拨打 lao_wang
lao_wang的电话显示1234来电了