大家都知道,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]
@H_502_231@如果出现以下情况,说明HTTP请求被拒绝,tcpdump 查看发来的包结构。
- 2017-06-2900:22:38.681206[WARNING]mod_xml_curl.c:294CURLreturnederror:[52]Serverreturnednothing(noheaders,nodata)
用户1234 拨打 lao_wang
lao_wang的电话显示1234来电了