变量的使用方式
$(<context>type(name)[index]{transformation})
- 变量都以$符号开头
 - type表示变量的类型:核心变量,自定义变量,键值对变量
 - name表示变量名:如$var(name), $avp(age)
 - index表示需要,有些变量类似于数组,可以使用需要来指定。需要可以用正数和负数,如-1表示最后一个元素
 - transformations表示类型转换,如获取一个字符串值的长度,大小写转换等操作
 - context表示变量存在的作用域,opensips有请求的作用域和响应的作用域
 
# by type
$ru
# type type and name
$hdr(Contact)
# bye type and index
$(ct[0])
# by type name and index
$(avp(gw_ip)[2])
# by context
$(<request>ru)
$(<reply>hdr(Contact))
引用变量
所有的引用变量都是可读的,但是只有部分变量可以修改。引用变量一般都是英文含义的首字母缩写,刚开始接触opensips的同学可能很不习惯。实际上通过首字母大概是可以猜出变量的含义的。
必须记住变量的用黄色标记。
| 变量名 | 英文含义 | 中文解释 | 是否可修改 | 
|---|---|---|---|
| $ru | request url | 请求url | 是 | 
| $rU | Username in SIP Request’s URI | 是 | |
| $ci | call id | callId | |
| $hdr(from) | request headers from | 请求头中的from字段 | 是 | 
| $Ts | current time unix Timestamp | 当前时间的unix时间戳 | |
| $branch | Branch | ||
| $cl | Content-Length | ||
| $cs | CSeq number | ||
| $cT | Content-Type | ||
| $dd | Domain of destination URI | 目标地址的域名 | 是 | 
| $di | Diversion header URI | ||
| $dp | Port of destination URI | 目标地址的端口 | 是 | 
| $dP | Transport protocol of destination URI | 传输协议 | |
| $du | Destination URI | 目标地址 | 是 | 
| $fd | From URI domain | ||
| $fn | From display name | ||
| $ft | From tag | ||
| $fu | From URI | ||
| $fU | From URI username | ||
| $mb | SIP message buffer | ||
| $mf | Message Flags | ||
| $mi | SIP message ID | ||
| $ml | SIP message length | ||
| $od | Domain in SIP Request’s original URI | ||
| $op | Port of SIP request’s original URI | ||
| $oP | Transport protocol of SIP request original URI | ||
| $ou | SIP Request’s original URI | ||
| $oU | Username in SIP Request’s original URI | ||
| $param(idx) | Route parameter | ||
| $pp | Process id | ||
| $rd | Domain in SIP Request’s URI | ||
| $rb | Body of request/reply | 是 | |
| $rc | Returned code | ||
| $re | Remote-Party-ID header URI | ||
| $rm | SIP request’s method | ||
| $rp | SIP request’s port | 是 | |
| $rP | Transport protocol of SIP request URI | ||
| $rr | SIP reply’s reason | ||
| $rs | SIP reply’s status | ||
| $rt | reference to URI of refer-to header | ||
| $Ri | Received IP address | ||
| $Rp | Received port | ||
| $sf | Script flags | ||
| $si | IP source address | ||
| $sp | Source port | ||
| $td | To URI Domain | ||
| $tn | To display name | ||
| $tt | To tag | ||
| $tu | To URI | ||
| $tU | To URI Username | ||
| $TF | String formatted time | ||
| $TS | Startup unix time stamp | ||
| $ua | User agent header | 
更多变量可以参考:https://www.opensips.org/Documentation/Script-CoreVar-2-4
键值对变量
- 键值对变量是按需创建的
 - 键值对只能用于有状态的路由处理中
 - 键值对会绑定到指定的消息或者事务上
 - 键值对初始化时是空值
 - 键值对可以在所有的路由中读写
 - 在响应路由中使用键值对,需要加载tm模块,并且设置onreply_avp_ mode参数
 - 键值对可以读写,也可以删除
 - 可以把键值对理解为key为hash, 值为堆栈的数据结构
 
$avp(my_name) = "wang"
$avp(my_name) = "duan"
xlog("$avp(my_name)") # duan
xlog("$avp(my_name)[0]") # wang
xlog("$avp(my_name)[*]") # wang duanduan
脚本变量
- 脚本变量只存在于当前主路由及其子路由中。路由结束,脚本变量将回收。
 - 脚本变量需要指定初始化值,否则变量的值将不确定。
 - 脚本变量只能有一个值
 - 脚本变量读取要比键值对变量快,脚本变量直接引用内存的位置
 - 如果需要变量,可以优先考虑使用脚本变量
 
$var(my_name) = "wangduanduan"
$var(log_msg) = $var(my_name) + $ci + $fu
xlog("$var(log_msg)")
脚本翻译
脚本翻译可以理解为一种工具函数,可以用来获取字符串长度,获取字符串的子字符等等操作。
| 获取字符串长度 | $(fu{s.len}) | |
|---|---|---|
| 字符串截取子串 | $(var(x){s.substr,5,2}) | |
| 获取字符串的某部分 | $(avp(my_uri){uri.user}) | |
| 将字符串值转为整数 | $(var(x){s.int}) | |
| 翻译也可以链式调用 | $(hdr(Test){s.escape.common}{s.len}) |