如何使kamailio串行分叉?

问题描述


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

我是kamailio服务器开发的初学者,我想进行串行分叉,但这不起作用。

我的kamailio服务器回复跳数过多(代码:483),并结束通话。 有人可以帮我吗?


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

我使用以下代码:

request_route {
    
    # per request initial checks
    route(REQINIT);

    
    # CANCEL processing
    if (is_method("CANCEL")) {
        if (t_check_trans()) {
            t_relay();
        }
        exit;
    }

    # handle retransmissions
    if (!is_method("ACK")) {
        if(t_precheck_trans()) {
            t_check_trans();
            exit;
        }
        t_check_trans();
    }

    if (is_method("INVITE|SUBSCRIBE")) {
        record_route();
    }

    if(is_method("REGISTER"))
        save("location");

    # test serial forking

    if (method=="INVITE") {
        
        if(!t_is_set("branch_route")) route(SERIAL);
    };

    if(lookup("location")){
        if (!t_relay()) {
            sl_reply_error();
        }                 
        exit;
    }
}



route[SERIAL]{
    $ru = "sip:1001@192.168.50.131:5060";
    xlog("ALERT : new request uri $ru \n");
    t_on_failure("1");
    t_relay();
}

failure_route[1] {
    if(t_is_canceled()) {
        exit;
    }
    
    xlog(" an other alternative \n");

    if(t_check_status("486|408")){
        $ru = "sip:1002@192.168.50.131:5060";
        xlog(" an other uri $ru \n");
        t_on_failure("2");
        t_relay();
        exit;
    }
}

failure_route[2] {
    if(t_is_canceled()) {
        exit;
    }

    xlog( "nobody available \n");
    t_reply("500","Server error"); 
}


# Per SIP request initial checks

route[REQINIT] {
    # no connect for sending replies
    set_reply_no_connect();

#!ifdef WITH_ANTIFLOOD
    # flood detection from same IP and traffic ban for a while
    # be sure you exclude checking trusted peers,such as pstn gateways
    # - local host excluded (e.g.,loop to self)
    if(src_ip!=myself) {
        if($sht(ipban=>$si)!=$null) {
            # ip is already blocked
            xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
            exit;
        }
        if (!pike_check_req()) {
            xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
            $sht(ipban=>$si) = 1;
            exit;
        }
    }
#!endif
    if($ua =~ "friendly-scanner|sipcli|sipvicious|VaxSIPUserAgent") {
        # silent drop for scanners - uncomment next line if want to reply
        # sl_send_reply("200","OK");
        exit;
    }

    if (!mf_process_maxfwd_header("10")) {
        sl_send_reply("483","Too Many Hops");
        exit;
    }

    if(is_method("OPTIONS") && uri==myself && $rU==$null) {
        sl_send_reply("200","Keepalive");
        exit;
    }

    if(!sanity_check("17895","7")) {
        xlog("Malformed SIP request from $si:$sp\n");
        exit;
    }
}

解决方法

问题是在配置中,您的串行分支路由在运行Kamailio位置数据库之前就已运行。因此,在第一次分支到1001@192.168.50.131之后,您需要以某种方式将调用路由到Kamailio将其定位到位置DB的部分,默认配置是route(LOCATION)。像这样:

route[SERIAL]{
    $ru = "sip:1001@192.168.50.131:5060";
    xlog("ALERT : new request uri $ru \n");
    t_on_failure("1");
    route(location);
}

不要忘记将route(location)添加到您的配置中。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...