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;
 }

总结

使用矩阵图类来总结以上的路由类型:

posted on 2020-03-21 23:34  梦中彩虹  阅读(2129)  评论(0编辑  收藏  举报