共计 3583 个字符,预计需要花费 9 分钟才能阅读完成。
大家都知道,FreeSWITCH 默认是从磁盘中 xml 文件,决定系统中有哪些用户的。对于一个常规的信息系统,用户信息都是存储在数据库中。
以下非常简单的演示了,FreeSWITCH 中的用户如何使用数据库注册。
准备工作:
一套 LAMP 或 LNMP 环境
编译 FreeSWITCH 的 mod_xml_curl 模块
Apache + php7 + MySQL 5.7 中的 php 脚本
根据实际情况,修改相关参数
linuxidc@linuxidc/var/www/html$ cat linuxidc_test.php
<?php
/*
* 作者:李春利
* 功能:演示接收 FreeSWITCH 注册请求,连接到远程 MySQL 数据库检索用户密码,返回 XML 文件
* 备注:PHP 7.0 版本程序,注意 MySQL 函数发生了变化
* MySQL 数据库表快速创建:
CREATE DATABASE IF NOT EXISTS `freeswitch` DEFAULT CHARACTER SET utf8;
USE `freeswitch`;
DROP TABLE IF EXISTS `authentication`;
CREATE TABLE `authentication` (
`user_name` varchar(100) NOT NULL,
`user_password` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `authentication` VALUES (‘lao_wang’,’tiger’),(‘1234′,’4321’),(‘linuxidc’,’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”;
function getlink($db_host,$db_user,$sb_pwd,$db_name)
{
$link=mysqli_connect($db_host,$db_user,$sb_pwd);
if(!$link)
{
echo”MySQL 数据库连接失败 \n”;
exit();
}
if(!mysqli_select_db($link,$db_name))
{
echo”MySQL 数据库选择失败 \n”;
exit();
}
mysqli_query($link, “setnames utf8”);
return $link;
}
$link=getlink($db_host,$db_user,$db_pwd,$db_name);
$result=mysqli_query($link, “select user_password from authentication where user_name = ‘${user}'”);
if(mysqli_num_rows($result) > 0)
{
while($row=$result->fetch_row())
{
foreach($row as $key=>$val)
{
$password = $val;
}
}
$result->free();
}
else
{
echo” 查无此人{$user}\n”;
exit();
}
mysqli_close($link);
?>
<document type=”freeswitch/xml”>
<section name=”directory”>
<domain name=”<?php echo $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=”<?php echo $user; ?>”>
<params>
<param name=”password” value=”<?php echo $password; ?>”/>
</params>
<variables>
<variable name=”user_context” value=”default”/>
</variables>
</user>
</users>
</group>
</groups>
</domain>
</section>
</document>
linuxidc@linuxidc/var/www/html$
编译 FreeSWITCH 相关模块
[root@CentOS ~]# iptables -F
[root@CentOS ~]# iptables -X
编译 mod_xml_curl,默认不编译
[root@CentOS 01_install]# vim freeswitch-1.6.17/modules.conf
将
#xml_int/mod_xml_curl
改为
xml_int/mod_xml_curl
编译 ./configure && make && make mod_xml_curl-install
具体你的 configure 怎么设置的,自己加上原先的参数。
使 FreeSWITCH 自动加载 mod_xml_curl
[root@CentOS freeswitch]# vim ./autoload_configs/modules.conf.xml
将
<!– <load module=”mod_xml_curl”/> –>
改为
<load module=”mod_xml_curl”/>
修改 FreeSWITCH 用户注册的方式,HTTP 优先,如果请求失败了,再到本地磁盘找 xml 文件
[root@CentOS freeswitch]# vim autoload_configs/xml_curl.conf.xml
<configuration name=”xml_curl.conf” description=”cURL XML Gateway”>
<bindings>
<binding name=”directory”>
<param name=”gateway-url” value=”http://172.16.20.17/linuxidc_test.php” bindings=”directory”/>
</binding>
</bindings>
</configuration>
修改拨号计划,添加通话路由
[root@CentOS freeswitch]# vim dialplan/default.xml
<condition field=”destination_number” expression=”^(10[01][0-9]|1234|lao_wang)$”>
启动 FreeSWITCH
一个 SIP 使用 (‘lao_wang’,’tiger’), 注册
一个 SIP 使用(‘1234′,’4321’), 注册
互相拨打电话,试试
调错技巧:
按 F8,打开 debug 级别日志。
拨打电话,打不通,如果出现以下情况,说明 HTTP 请求是失败的,检查 php 脚本的 ip,user,password 参数
2017-06-29 01:21:40.705900 [WARNING] mod_voicemail.c:3487 Can’t find user [1000@172.16.66.88]
如果出现以下情况,说明 HTTP 请求被拒绝,tcpdump 查看发来的包结构。
2017-06-29 00:22:38.681206 [WARNING] mod_xml_curl.c:294 CURL returned error:[52] Server returned nothing (no headers, no data)
用户 1234 拨打 lao_wang
lao_wang 的电话显示 1234 来电了
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-07/145379.htm