opensips的路由可以分為主路由和子路由,主路由是由opensips觸發的,子路由更像是編程語言里的函數調用
主路由可以分為以下幾種:
請求路由
請求路由是opensips中最重要的一種路由類型,也是opensips的路由腳本中必須有的一種路由類型,當opensips接收到從網絡發送過來的SIP請求的時候,觸發請求路由(請求路由只處理opensips接收到的請求,不處理返回)
示例:
route{
if (is_method("INVITE")) xlog("L_INFO", "<sc>: $rm $ru, $fU to $tU");
if (is_method("REGISTER")) xlog("L_INFO", "<sc>: $rm $ru, $fU from $si:$sp, expires $(hdr(Expires))");
if (is_method("OPTIONS")) {
sl_send_reply("200", "OK");
exit;
}
# per request sanity checks
route(CHECK_SANITY);
# nat detection
route(NAT_DETECT);
# handle requests within sip dialogs
if (has_totag()) {
route(WITHINDLG);
}
分支路由
分支路由在SIP請求離開opensips時做處理,不能夠做一些信號操作(結束請求,轉發請求或者是drop請求),但是可以檢查和修改和刪除SIP請求。
分支路由主要的應用場景在fork SIP請求,比如,當你有一個SIP請求,可以在這里把它變成多個SIP請求(比如說一鍵多呼的場景,客戶端發起一個invate,opensips可以把它變成多個invate發送出去)
在請求路由中設置一個 t_on_branch("分支路由名稱"),這相當於設置了一個鈎子,當SIP請求離開opensips的時候相應的分支路由會被觸發。
可以設置多個t_on_branch,但是只有一個會被執行,后邊的鈎子會覆蓋前邊的。
失敗路由
當SIP請求返回的狀態碼大於200時,觸發失敗路由,在失敗路由中,可以選擇把失敗的狀態碼返回給客戶端,或者重新發送請求,也可以修改SIP的狀態碼,然后返回給客戶端。
響應路由
當opensips接收到響應的時候,觸發響應路由,包括1xx - 6xx的所有相應。
本地路由
有一些請求是opensisp自己發出的,並不是opensips從網絡上接收到的請求,比如多方通話的場景下,由opensips發送給多個客戶端的BYE消息,這些場景下觸發本地路由的執行
啟動路由
opensips啟動的時候,做一些操作,並不涉及SIP消息的接收和處理
定時器路由
定時執行一些操作,不涉及SIP消息的接收和處理
事件路由
特定的事件發生的時候觸發的路由,不涉及SIP消息的接收和處理
錯誤路由
用來捕獲運行時錯誤,比如解析SIP時出錯等
error_route {
xlog("$rm from $si:$sp - error level=$(err.level),
info=$(err.info)\n");
sl_send_reply("$err.rcode", "$err.rreason");
exit;
}
總結
使用矩陣圖類來總結以上的路由類型: