写在前面
最近一直在做人工智能呼叫的业务,也使用过VOS3000,主要好处是功能稳定。坏处就是不好和自己的系统集成,再者是收费,并发大了收费也不低。
需要解决的问题
- 网关可以通过创建
- 主叫号码路由到网关的端口,默认一对一路由
- 物理网关的路由配置一键下发(和网关开发企业匹配)
- 网关的端口的实时监控(卡有没有插,是否异常,是否欠费)
解决方法(先解决网关注册到opensips平台,后续继续添加)
每一个主叫号码都有应该有路由方式和路由地址,路由地址可以是网关,或者一个IP地址,所以在subscriber表格增加两个列,如下图
这样的情况下,只要修改数据库,就可以实时对主叫和网关进行路由,我们外呼主要是动态分配主叫号码。对应着OpenSIPS,我们开发了一个配置服务器,所有的路由关系,通过前端可以查看。
这部分的opensips.cfg的配置:
加载subscriber表中的对应配置
#### auth_db
loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "load_credentials", "$avp(route_type)=route_type; $avp(route_dest)=route_dest")
###呼叫的主要脚本,其他的就不贴了
# account only INVITEs
if (is_method("INVITE")) {
if (!www_authorize("", "subscriber"))
{
www_challenge("", "0");
exit;
}
do_accounting("db|log", "cdr|missed");
xlog("L_INFO", "get avp type: $avp(route_type) , avp route dest: $avp(route_dest)");
#route the register
if ($avp(route_type) == 1){
$avp(old_rU) = $rU;
$rU = $avp(route_dest);
xlog("L_ERR", "invite get route_type==1, rU: $rU , old_rU:$avp(old_rU), avp dest: $avp(route_dest)");
lookup("location");
switch ($retcode) {
case -1:
case -3:
sl_send_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Not Found");
exit;
};
$rU = $avp(old_rU);
}
}
通过阅读源码发现:www_authorize方法调用时,会把route_type和route_dest放在avp键值对里面。 收到一路呼叫,根据路由类型route_type,如果是类型1的话,路由到另一个注册网关上,通过location获取对应的公网IP+port,修改了ruri,实现了重定向到网关的地址。
网关方面:
收到了一个 18958022872 @ voip.dasxxx.com的sip信令,To的头域名:也包含18958022872的被叫。网关收到之后,根据网关的配置和主叫路由,通过指定的端口呼叫出去,这样就完成了一次路由。