2015-09-15 115 views
0

我有許多簡單的SIP端點可以在後端SIP註冊服務器上註冊。它們可以配置爲僅在一個呼叫處理引擎上註冊。 我想使用Kamailio將REGISTER(以及後來的INVITE)請求轉發給後端。如何將Kamailio設置爲簡單中繼

到目前爲止,我有以下配置

route[REGISTRAR] { 
     if (is_method("REGISTER")){ 
       rewritehost("1.2.3.4"); 
       xlog("Registering $(fu{uri.user}) with 1.2.3.4\n"); 
       $var(frst) = "sip:" + $(fu{uri.user}) +"@1.2.3.4"; 
       $var(scnd) = "sip:" + $(fu{uri.user}) +"@2.3.4.5"; 
       uac_replace_from("$var(frst)"); 
       uac_replace_to("$var(frst)"); 
       if(!t_relay_to_tcp("1.2.3.4","5060")) { 
         rewritehost("2.3.4.5"); 
         uac_replace_from("$var(scnd)"); 
         uac_replace_to("$var(scnd)"); 
         xlog("Registering $(fu{uri.user}) with 2.3.4.5\n"); 
         if(!t_relay_to_tcp("2.3.4.5","5060")) { 
           sl_reply_error(); 
         } 
       } 
       exit; 
     } 
    else return; 
} 

這條路線[書記官長]從主SIP請求路由調用。如果1.2.3.4爲UP,則我的測試端點註冊並可用於來自其他端點的呼叫(儘管我必須使用來自測試端點的INVITE)。但是當1.2.3.4關機時,我在/ var/log/syslog中得到了

ERROR: <core> [tcp_main.c:4249]: tcpconn_main_timeout(): connect 1.2.3.4:5060 failed (timeout) 

。我認爲這是t_relay_to_tcp失敗,我可以重複從From和To的頭部並將所有內容都傳遞給2.3.4.5,但這不會發生。

這可能是由於傳輸的異步性質 - kamailio腳本更進一步,而中繼的tcp會話掛在一些backgroud線程中。

如何在tcp超時的情況下編輯路由[REGISTRAR]來中繼到2.3.4.5?

也許這種傳遞信息的想法是錯誤的?

一些論壇顯示了kamailio本身的註冊端點示例,但它不適合我。我相信kamailio足夠強大來解決我的問題。

回答

0

看起來像Kamailio不這樣工作。所以我改變了我的配置這樣的:

route[REGISTRAR] { 
     if (is_method("REGISTER")){ 
       rewritehost("1.2.3.4"); 
       xlog("Registering $(fu{uri.user}) with 1.2.3.4\n"); 
       $var(frst) = "sip:" + $(fu{uri.user}) +"@1.2.3.4"; 
       uac_replace_from("$var(frst)"); 
       uac_replace_to("$var(frst)"); 
       t_on_failure("REGISTERBACKUP");   
       t_relay_to_tcp("1.2.3.4","5060"); 
     } 
     else return; 

failure_route[REGISTERBACKUP] { 
    rewritehost("2.3.4.5"); 
    xlog("Registering $(fu{uri.user}) with 2.3.4.5\n"); 
    #Edited to relay to 2.3.4.5 
    t_relay_to_tcp("2.3.4.5","5060"); 
} 

當1.2.3.4是倒在2.3.4.5我的端點寄存器。當1.2.3.4結束時,當然是在其上登記。