在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脚本中的变量相关推荐

  1. shell脚本中的变量

    shell脚本中的变量 1 变量的定义 2 shell脚本中变量的定义方法 2.1 环境级别 2.2 用户级别 2.3 系统级别 3 变量名称 4 变量的转译 4.1 转译 4.2 声明 4.3 变量 ...

  2. 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言  aming_linux  blog.lishiming.net ...

  3. Linux:shell脚本中实现变量自增的几种方式

    #!/bin/sh #本脚本测试shell脚本中整型变量自增 加1的几种方法   #定义整型变量 a=1 echo $a   #第一种整型变量自增方式 a=$(($a+1)) echo $a   #第 ...

  4. linux 引用其它脚本中的变量

    前言 CentOS Linux release 7.9.2009 (Core) 引用其它脚本中的变量 a.sh var_a=zhangsan echo $var_a b.sh source a.sh ...

  5. 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量...

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 shell脚本介绍 shell 是一种脚本语言:和传统的开发语言比较,会比较简单 shell有自己的语法:可以使用逻 ...

  6. pwd赋值给变量 shell_Shell脚本中的变量详解

    一.Shell变量 变量:是shell传递数据的一种方式,用来代表每个取值的符号名. 当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中. 二.变量设置规则: 变量名 ...

  7. unity如何调用另一个脚本中的变量

    调用其他实例的脚本是一种很常用的需求,在Unity3D中实现起来也有多种方法,假设在ScriptB有一个DoSomething函数,如下所示: using UnityEngine; public cl ...

  8. sed在shell脚本中引用变量

    需求 在测试过程中,有很多配置项是写在文件中的,这时想通过脚本来改文件内容,这是个很常见的需求 问题 sed 是linux里很强大好用的文本修改工具,但是在使用过程中,需要在shell里的sed语句中 ...

  9. 详解shell脚本中的变量

    目录 一.变量的定义及存在的意义 二.shell脚本中变量的定义方法 1.环境级别 2.用户级别 3.系统级别 三.变量名称 四.变量的转译 1.转译 2.声明 3.变量的数组 五. Linux中命令 ...

  10. shell(4)shell脚本中的变量

    文章目录 1.变量的定义 2.shell脚本中变量的定义方法 3.变量的转译 4.Linux中命令的别名设定 5.用户环境变量的更改 6.利用命令的执行结果设定变量 $()和``的区别: 非交互模式传 ...

最新文章

  1. 公开课 | 微信高级研究员解析深度学习在NLP中的发展和应用
  2. 云脑人力资源管理软件EHR选型手记(即时连载)
  3. 《Arduino开发实战指南:LabVIEW卷》——3.5 LabVIEW的程序结构
  4. 自制vue组件通信插件:教你如何用mixin写插件
  5. matlab距离保护程序,基于MATLAB的距离保护仿真.doc
  6. 真正能成功的人,不见得是最聪明的,也小见得是学历最高的,而是最能面对问题、锲而不舍的人。...
  7. C++语言基础 —— 函数
  8. 信息学奥赛C++语言: 商品排序
  9. List中对象model的排序问题
  10. Oracle导入元数据,eova oracle 导入元数据报错
  11. QQ空间相册如何批量导出
  12. 通过IMAP方式迁移U-Mail邮件到Exchange 2013之2008R2 AD搭建!
  13. 一天一个 Linux 命令(27):mkfs 命令
  14. 上海居住证续签流程须知
  15. 专访最强夫妻店:“神庙逃亡2”开发背后的故事
  16. C#连接嵌入式小型数据库firebird,操作数据
  17. 9.28上海交大PMP每日一题
  18. (转)Burp Suite 的一些插件
  19. 抗生素耐药性革兰氏阴性菌感染的治疗,2020最新IDSA指南
  20. Golang GMP调度模型

热门文章

  1. WPS Mac旧版该怎么彻底卸载干净
  2. 生物信息预测毒力因子
  3. [开源之美] nanomsg -- 进程间通讯
  4. SVN图标不显示解决方案
  5. 火星坐标系和百度坐标系的经纬度相互转换
  6. python实现爬取12306所有站点及其编码信息(附源代码)!
  7. 概率论基础知识整理(一)
  8. 建行u盾弹不出来_建行网银不自动跳出网页 建行u盾不能弹出快捷登录
  9. android手机通过蓝牙连接佳博打印机
  10. 第一章 计算机网络概述(计算机网络韩立刚)