当前位置: 首页 > 工具软件 > OpenSIPS > 使用案例 >

OpenSIPS脚本中的变量

相弘方
2023-12-01

        在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是必要字段。这里解释一下各个字段的具体含义:

  • type: 变量的类型,比如ru、var,或avp
  • name: 当前变量实例的名字,比如$avp(tmp) ,$var(n)
  • index: 类似数组的用法,当前变量可以存储一组值。可以通过index来访问特定的元素值。index值可以为负数,这时数组取值倒着取,-1表示最后一个元素,-2表示倒数第二个,以此类推。
  • transformation:一组变换因子,可以对取值进行一系列的加工处理
  • context: 描述变量关联的context。OpenSIPS定义了两种context:reply和request。其中reply可以用在失败路由处理,通过变量处理相关上下文逻辑。request可用于reply路由,处理请求上下文相关逻辑。

下面是几个变量引用实例:

  •  $ru
  • $hdr(Contact) 
  • $(ct[0])
  • $(avp(gw_ip)[2])
  • $(<request>ru)  - 在reply路由中,它将从request消息中取出request URI并返回
  • $(<reply>hdr(Contact)) - 从SIP reply消息中取Contact头

OpenSIPS内核定义的变量类型按功能描述如下:

  • Information reference  variables
  • Attribute  Value Pair  (AVP)
  • Script  variables

此外,外围模块还提供了多种类型,比如说dialog模块的dialog-persistent;cfgutils模块提供的global 变量。

reference 变量

        通过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

        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


script  variables

        脚本变量,顾名思义,这类变量严格绑定在脚本路由逻辑里。它们只对脚本中的路由块可见,此外,它们没有持久性,换句话说,它们的生命周期终止于脚本执行结束,其中包括路由脚本和子路由脚本。

        脚本变量具有读写属性,它们的值可以是 string或 integer。一个脚本变量仅存储一个值,新的赋值操作(或写操作)会覆盖现有值。

注意: 使用脚本变量之前,要保证初始化。如果没初始化,那么它们的值是不确定的。

下面是脚本变量的实例:

$var(uri) =  "sip:"+$rU+"@sip.com";
$var(i)   =   $var(i)    +    1;

transformation    

        OpenSIPS允许对变量值做一系列的转换。这是个很精巧的装饰处理器。具体可以参考我的另一篇博文(翻译自官方文档):opensip脚本的变量转换_至虛極,守靜篤-CSDN博客



 

 类似资料: