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)
");
sl_send_reply("$err.rcode", "$err.rreason");
exit;
}
总结
使用矩阵图类来总结以上的路由类型: