OpenSIPS脚本中的变量
在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博客
OpenSIPS脚本中的变量相关推荐
- shell脚本中的变量
shell脚本中的变量 1 变量的定义 2 shell脚本中变量的定义方法 2.1 环境级别 2.2 用户级别 2.3 系统级别 3 变量名称 4 变量的转译 4.1 转译 4.2 声明 4.3 变量 ...
- 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量
2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言 aming_linux blog.lishiming.net ...
- Linux:shell脚本中实现变量自增的几种方式
#!/bin/sh #本脚本测试shell脚本中整型变量自增 加1的几种方法 #定义整型变量 a=1 echo $a #第一种整型变量自增方式 a=$(($a+1)) echo $a #第 ...
- linux 引用其它脚本中的变量
前言 CentOS Linux release 7.9.2009 (Core) 引用其它脚本中的变量 a.sh var_a=zhangsan echo $var_a b.sh source a.sh ...
- 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量...
2019独角兽企业重金招聘Python工程师标准>>> 20.1 shell脚本介绍 shell 是一种脚本语言:和传统的开发语言比较,会比较简单 shell有自己的语法:可以使用逻 ...
- pwd赋值给变量 shell_Shell脚本中的变量详解
一.Shell变量 变量:是shell传递数据的一种方式,用来代表每个取值的符号名. 当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中. 二.变量设置规则: 变量名 ...
- unity如何调用另一个脚本中的变量
调用其他实例的脚本是一种很常用的需求,在Unity3D中实现起来也有多种方法,假设在ScriptB有一个DoSomething函数,如下所示: using UnityEngine; public cl ...
- sed在shell脚本中引用变量
需求 在测试过程中,有很多配置项是写在文件中的,这时想通过脚本来改文件内容,这是个很常见的需求 问题 sed 是linux里很强大好用的文本修改工具,但是在使用过程中,需要在shell里的sed语句中 ...
- 详解shell脚本中的变量
目录 一.变量的定义及存在的意义 二.shell脚本中变量的定义方法 1.环境级别 2.用户级别 3.系统级别 三.变量名称 四.变量的转译 1.转译 2.声明 3.变量的数组 五. Linux中命令 ...
- shell(4)shell脚本中的变量
文章目录 1.变量的定义 2.shell脚本中变量的定义方法 3.变量的转译 4.Linux中命令的别名设定 5.用户环境变量的更改 6.利用命令的执行结果设定变量 $()和``的区别: 非交互模式传 ...
最新文章
- 公开课 | 微信高级研究员解析深度学习在NLP中的发展和应用
- 云脑人力资源管理软件EHR选型手记(即时连载)
- 《Arduino开发实战指南:LabVIEW卷》——3.5 LabVIEW的程序结构
- 自制vue组件通信插件:教你如何用mixin写插件
- matlab距离保护程序,基于MATLAB的距离保护仿真.doc
- 真正能成功的人,不见得是最聪明的,也小见得是学历最高的,而是最能面对问题、锲而不舍的人。...
- C++语言基础 —— 函数
- 信息学奥赛C++语言: 商品排序
- List中对象model的排序问题
- Oracle导入元数据,eova oracle 导入元数据报错
- QQ空间相册如何批量导出
- 通过IMAP方式迁移U-Mail邮件到Exchange 2013之2008R2 AD搭建!
- 一天一个 Linux 命令(27):mkfs 命令
- 上海居住证续签流程须知
- 专访最强夫妻店:“神庙逃亡2”开发背后的故事
- C#连接嵌入式小型数据库firebird,操作数据
- 9.28上海交大PMP每日一题
- (转)Burp Suite 的一些插件
- 抗生素耐药性革兰氏阴性菌感染的治疗,2020最新IDSA指南
- Golang GMP调度模型