在OpenSIPS脚本中,变量是一种非常有用的工具。通过变量,可以访问OpenSIPS 或 SIP消息中的信息,还可以在脚本层面保持自定义信息。
基于历史原因,OpenSIPS保留了一些老式的变量,事实上,它们都是一些访问SIP消息的关键字。可以通过普通字符串、整数或预定义的值来检验这些变量:
if (proto==UDP && af==INET) {……}
if (src_port==5060) {……}
if (method=="INVITE") {……}
注意:这些关键字已经被废弃,在脚本中应当使用变量代替它们。
OpenSIPS为我们提供了几种不同的变量,它们都可用于路由脚本。变量类型的区别主要体现在以下几点:
所有OpenSIPS变量都以美元符$打头。其完整语法定义如下:
$(<context>type(name)[index]{transformation})
其中,只有name是必要字段。这里解释一下各个字段的具体含义:
下面是几个变量引用实例:
OpenSIPS内核定义的变量类型按功能描述如下:
此外,外围模块还提供了多种类型,比如说dialog模块的dialog-persistent;cfgutils模块提供的global 变量。
通过reference变量,我们可以访问SIP消息中的指定信息(SIP头、RURI、传输层信息等等);或者访问OpenSIPS内部的信息(时间值、进程ID、函数返回值,等等)。
取决于信息的提供方式,这些变量可能与消息绑定,或者是全局可见。通过变量的context属性,可以选择提取内容的消息母体(从request中取还是从reply中取)。
大部分reference变量都是只读的,但也有一些支持写操作。一次变量访问可能返回一个或多个值,这取决于引用内容的特性。具体的变量列表可以参考相关文档。
下面是几个reference变量的示例:
$ru # A reference to the SIP request URI
$hdr(from) # A reference to the From Header
$ci # A reference to the SIP Call-ID
$Ts # The current time as a Unix timestamp
注意: 变量可以作为参数传递给不同的脚本函数,这个参数传递是值传递。
VAP是Attribute Value Pairs的缩写,它们是可以在后台动态创建的变量。在有状态处理过程中,AVP关联到一条message或transaction上。接收message或创建transaction时,会初始化一个空的AVP表。在路由脚本中,你可以创建新的AVP,它们会自动存储在AVP表中。
VAP对消息关联的所有路由块可见,比如说branch、failure、onreply。对于onreply,需要启用TM参数,即onreply_avp_mode。
AVP是可读写的,甚至是可以删除的。AVP可以存储多个值。新的赋值或写操作会把新的值添加到AVP变量上;其值存储在一个后进先出(LIFO)的栈里。
AVP的实例:
$avp(my_ip) # The last added value of the AVP my_ip
$(avp(my_ip)[-1]) # The first added value of the AVP my_ip
$(avp(ips)[*]) # All the values of the AVP my_ip
脚本变量,顾名思义,这类变量严格绑定在脚本路由逻辑里。它们只对脚本中的路由块可见,此外,它们没有持久性,换句话说,它们的生命周期终止于脚本执行结束,其中包括路由脚本和子路由脚本。
脚本变量具有读写属性,它们的值可以是 string或 integer。一个脚本变量仅存储一个值,新的赋值操作(或写操作)会覆盖现有值。
注意: 使用脚本变量之前,要保证初始化。如果没初始化,那么它们的值是不确定的。
下面是脚本变量的实例:
$var(uri) = "sip:"+$rU+"@sip.com";
$var(i) = $var(i) + 1;
OpenSIPS允许对变量值做一系列的转换。这是个很精巧的装饰处理器。具体可以参考我的另一篇博文(翻译自官方文档):opensip脚本的变量转换_至虛極,守靜篤-CSDN博客