OpenSIPS替代VOS3000的方案

原创
2018/12/17 11:50
阅读数 984

写在前面

    最近一直在做人工智能呼叫的业务,也使用过VOS3000,主要好处是功能稳定。坏处就是不好和自己的系统集成,再者是收费,并发大了收费也不低。

需要解决的问题

  1. 网关可以通过创建
  2. 主叫号码路由到网关的端口,默认一对一路由
  3. 物理网关的路由配置一键下发(和网关开发企业匹配)
  4. 网关的端口的实时监控(卡有没有插,是否异常,是否欠费)

解决方法(先解决网关注册到opensips平台,后续继续添加)

每一个主叫号码都有应该有路由方式和路由地址,路由地址可以是网关,或者一个IP地址,所以在subscriber表格增加两个列,如下图

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的被叫。网关收到之后,根据网关的配置和主叫路由,通过指定的端口呼叫出去,这样就完成了一次路由。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部