这里,为了实现拨号规则模块化管理,我们需要引用两个概念来支持拨号规则的管理。一个概念是使用AUTH_DB的参数dpid(Dialplan Identification),我们可以设置不同的用户走不同的路由。另外一个概念是通过DIALPLAN模块来管理路由,通过一个脚本管理不同用户位置,不同路由和不同媒体服务器转发设置。
1、我们需要通过几个步骤来实现以上管理功能。首先,我们需要在subscriber表中添加dpid,通过以下命令执行:
mysql –u root –p // 登录mysql 服务器
>use opensips
>alter table subscriber add column dpid int default 0; // 添加dpid
然后在cfg文件中,添加以下两个模块:
loadmodule "avpops.so"
loadmodule "dialplan.so"
设置模块加载参数:
modparam("avpops", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("avpops", "avp_table", "usr_preferences")
#------ load the dpid field to a pseudo-variable $avp(dpid) ------
modparam("auth_db", "load_credentials", "$avp(rpid)=rpid ;$avp(dpid)= dpid")
modparam("dialplan", "db_url","mysql://opensips:opensipsrw@localhost/opensips")
添加拨号规则处理流程:
if( !is_avp_set("$avp(dpid)") ) {
$avp(dpid)=0;
}
if(!dp_translate("$avp(dpid)",("$ruri.user/$ruri.user"),"$avp(dest)") {
sl_send_reply("420", "Invalid Extension");
exit;
}
xlog("Dialplan: Subscriber’s dpid: $(avp(dpid))");
xlog("Dialplan: Destination: $avp(dest)");
if ($avp(dest)=="3") {
#Route to usrloc
route(3);
}
if ($avp(dest)=="4") {
#route to drouting
route(4);
}
if ($avp(dest)=="5") {
#route to media server
route(5);
}
sl_send_reply("420", "Invalid Extension");
exit;
添加最终路由管理策略:
route[3]{
if (!lookup("location")) {
switch ($retcode) {
case -1:
case -3:
t_newtran();
t_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Method Not Allowed");
exit;
}
}
# when routing via usrloc, log the missed calls also
setflag(2);
route(1);
}
route[5] {
rewritehostport("媒体服务器IP:5061");
route(1);
}
2、设置cfg脚本以后,用户需要通过源代码添加几个路由设置:使用文本编辑器,vi,执行 vi /var/www/opensips-cp/config/tools/system/dialplan/local.inc.php,修改后保存。
$config->attrs_cb=array(
// name , description
array("3","usrloc"),
array("4","routing"),
array("5","service"),
#array("d","Descr d"),
#array("e","Descr e"),
#array("f","Descr f"),
通过界面设置拨号规则的路由表,在设置界面时,需要注意以下几个拨号匹配方式的不同, 另外,这里的属性就是在上面代码中所添加到用户location, routing和媒体服务器路由设置。

这里的路由规则通过号码匹配和属性实现了统一管理:
- 如果用户拨打了国际长途(011),国内长途(01),本地号码(7位匹配),则通过路由属性4出局。
- 如果拨打的1XXXX则通过属性3呼叫,查询user location。
- 如果用户拨打以×为前缀的号码,或者热键拨号功能,则通过属性5媒体服务器出局。
3、保存以上设置以后,如果配置成功的话,用户可以分别测试呼叫流程:
- 从PSTN呼叫,拨打以011为前缀的号码,呼叫到PSTN网关出局。
- 任何内部号码,呼叫以1XXX测试。
- 任何以功能热键×开始的拨号,都发送到媒体服务器。
4、在本章节的分享中,我们讨论了如何使用数据库存储来实现呼叫路由的管理。大家知道,通过数据库管理会比强行在代码中写死路由规则更加方便管理和维护。但是,在创建数据库管理时,用户需要添加几个相应的数据库表单,软交换通过表单查询获得用户的location信息,并且需要修改php代码来支持3种路由属性。完成这些工作后,用户需要通过界面来设置不同的路由属性对拨号规则进行一定的规范。通过以上步骤,用户基本上完成了通过数据库配置路由管理的方式,用户可以通过拨号规则来做进一步的测试验证。

关注微信公众号:asterisk-cn,获得有价值的行业分享
freepbx 技术论坛:www.ippbx.org.cn
Asterisk, freepbx技术文档: www.freepbx.org.cn
欧米(Omni)智能客服解决方案
融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com