关于asterisk拨号规则中使用的变量
来源:互联网 发布:pdf朗读软件 编辑:程序博客网 时间:2024/05/16 05:58
原文在次
http://www.voip-info.org/wiki/view/Asterisk+variables
Using Variables in Asterisk Dialplans
Asterisk can make use of global, shared and channel-specific variables for arguments to commands. Variables are referenced in the dialplan (extensions.conf) using the syntax
${foo:offset:length}
where foo is the name of the variable, offset is an optional field indicating which characters should be excluded, and length is an optional field indicating the number of characters from the offset to be returned (see "Substrings" below for details and examples). A variable name may be any alphanumeric string beginning with a letter. User-defined variable names are not case sensitive — ${FOO} and ${Foo} refer to the same variable — but Asterisk-defined variables are case-sensitive — ${EXTEN} works, but ${exten} doesn't.
There are four types of variables: global variables, shared variables, channel variables, and environment variables.
If you define a channel variable with the same name as a global variable (and remember: user-defined variable names are not case sensitive), references to that variable name will return the value of the channel variable. For example, let us say that you define a context "FooTest" with a single extension, 100, with the following definition:(:smile:)
[FooTest]
exten => 100,1,SetGlobalVar(FOO=5)
exten => 100,2,NoOp(${FOO})
exten => 100,3,NoOp(${foo})
exten => 100,4,SetVar(foo=8)
exten => 100,5,NoOp(${FOO})
exten => 100,6,NoOp(${foo})
(Note the use of the NoOp command to assist in debugging.) If you dial extension 100 in context FooTest, and you have Asterisk running with a verbose console, you will see output similar to the following:
— Executing SetGlobalVar("Zap/1-1", "FOO=5") in new stack
— Setting global variable 'FOO' to '5'
— Executing NoOp("Zap/1-1", "5") in new stack
— Executing NoOp("Zap/1-1", "5") in new stack
— Executing SetVar("Zap/1-1", "foo=8") in new stack
— Executing NoOp("Zap/1-1", "8") in new stack
— Executing NoOp("Zap/1-1", "8") in new stack
We discover that after the call to SetGlobalVar, ${FOO} and ${foo} returned the value of the global variable, giving the value 5. After the call to SetVar, the global variable "foo" was obscured by the channel variable "foo"; ${FOO} and ${foo} both gave the value 8. The value of the global variable remains unchanged at 5, however, and any other channels that refer to the global variable ${foo} would still get the value 5. Inheritance of Channel Variables
Prepending a single _ character to a variables name in SetVar will cause that variable to be inherited by channels created by the main channel. eg. when using Dial(Local/...); once inherited these variables will not be further inherited. Prepending two _ characters will cause them to be inherited indefinitely.
Note that for retrieval purposes these variable names do not include the underscores.
[TestInherit]
exten => 100,1,SetVar(__FOO=5)
exten => 100,2,Dial(Local/test@TestInherit)
exten => test,1,NoOp(${FOO})
will result in FOO being inherited. Without the underscores, the new local channel would start with a clean slate. Example
exten => 104,1,SetVar(FEE=fee)
exten => 104,2,SetVar(_FIE=fie)
exten => 104,3,SetVar(__FUM=fum)
exten => 104,4,Dial(Local/105)
exten => 105,1,NoOp(${FEE})
exten => 105,2,NoOp(${FIE})
exten => 105,3,NoOp(${FUM})
exten => 105,4,Dial(Local/106)
exten => 106,1,NoOp(${FEE})
exten => 106,2,NoOp(${FIE})
exten => 106,3,NoOp(${FUM})
results in
— Executing SetVar("SIP/oberon-365e", "FEE=fee") in new stack
— Executing SetVar("SIP/oberon-365e", "_FIE=fie") in new stack
— Executing SetVar("SIP/oberon-365e", "__FUM=fum") in new stack
— Executing Dial("SIP/oberon-365e", "Local/105") in new stack
— Called 105
— Executing NoOp("Local/105@default-7263,2", "") in new stack
— Executing NoOp("Local/105@default-7263,2", "fie") in new stack
— Executing NoOp("Local/105@default-7263,2", "fum") in new stack
— Executing Dial("Local/105@default-7263,2", "Local/106") in new stack
— Called 106
— Executing NoOp("Local/106@default-49be,2", "") in new stack
— Executing NoOp("Local/106@default-49be,2", "") in new stack
— Executing NoOp("Local/106@default-49be,2", "fum") in new stack
(This did not work correctly prior to the 1.2 release.) Using $
If you want to set a global variable containing the another variable name in the [globals] category of extensions.conf you have to do something like this:
[globals]
SS=$
MY_VAR=${SS}{EPOCH}-${SS}{EXTEN}.gsm
This way the MY_VAR value is ${EPOCH}-${EXTEN}.gsm
Using it with the EVAL() function is very useful. I.e. if you want to record you can do this:
exten => 104,1,SetVar(file=${EVAL(${MY_VAR})})
exten => 104,2,MixMonitor($The attachment id given is not valid.) Predefined Channel Variables
There are some channel variables set by Asterisk that you can refer to in your dialplan definitions. Asterisk-defined variables, in contrast to user-defined variables, are case sensitive.Note: Several of these builtin variables have been converted to functions in 1.2, to allow setting their values.
(Note: this is not necessarily numeric as the name would indicate and can legitimately contain the space character. Commands acting on this variable (such as 'GotoIf', for example) should be aware of this). Application-specific variables
Some applications take extra input or provide output using channel variables. Macro-specific variables
When in a macro context, extra channel variables are available. Call files extension specific variables
Environment Variables
You may access unix environment variables using the syntax:
${ENV(foo)} String Handling Functions
String Length
${LEN(foo)}
returns the length of the string foo. For example,
exten => 100,1,SetVar(Fruit=pear)
exten => 100,2,NoOp(${LEN(Fruit)})
exten => 100,3,NoOp(${LEN(${Fruit})})
The first NoOp would show a value of 5 (the length of the string "fruit"). The second NoOp would show a value of 4 (the length of the string "pear").
This is an excellent way to check for a NULL or empty string. Substrings
${foo:offset:length}
returns a substring of the string foo, beginning at offset offset and returning the next length characters. The first character is at offset 0.
Examples:
${123456789:1} - returns the string 23456789
${123456789:-4} - returns the string 6789
${123456789:0:3} - returns the string 123
${123456789:2:3} - returns the string 345
${123456789:-4:3} - returns the string 678
Examples of use:
exten => _NXX.,1,SetVar(areacode=${EXTEN:0:3}) - get the first 3 digits of ${EXTEN}
exten => _516XXXXXXX,1,Dial(${EXTEN:3}) - get all but the first 3 digits of ${EXTEN}
exten => 100,1,SetVar(whichVowel=4)
exten => 100,2,SetVar(foo=AEIOU:${whichVowel}:1) - sets ${foo} to the single letter 'U' String Concatenation
To concatenate two strings, simply write them together:
${foo}${bar}
555${theNumber}
${longDistancePrefix}555${theNumber} Variable math
To perform math on variables e.g. increment, multiplication, addition simply write:
exten => s,1,SetVar(SOMEVAR=$[${SOMEVAR} + 1]) ; increment
exten => s,2,SetVar(SOMEVAR=$[2 * ${SOMEVAR}]) ; multiplication etc...
In times past, a single space was required between items in the $[...] expressions. This is no longer the case!
In late model Asterisks (1.2?), the MATH function is also available...
exten => s,1,Set(SOMEVAR=${MATH(${SOMEVAR}+1)}) ; increment
exten => s,2,Set(SOMEVAR=${MATH(2*${SOMEVAR})}) ; multiplication etc... Version notes
See also
- 关于asterisk拨号规则中使用的变量
- Asterisk拨号方案中变量的应用
- Asterisk拨号方案中变量的应用
- Asterisk拨号方案中变量的应用
- Asterisk拨号方案中变量的应用
- asterisk 系统变量,研究拨号规则的需要用到
- ASTERISK拨号规则
- asterisk拨号规则
- asterisk拨号规则
- asterisk拨号规则
- asterisk拨号规则
- asterisk拨号规则
- Asterisk 中 拨号规则 之 Read()和SayDigits()命令详解
- asterisk拨号方案的配置
- asterisk拨号方案的配置
- asterisk拨号方案的配置
- java中变量的使用规则
- Java中变量的使用规则
- 重回CSDN--开始写博客,序言
- 关于项目成本管理的思考
- get和post的区别
- SQL Server 2005 常用数据类型详解
- MFC edit control 用法(总结)
- 关于asterisk拨号规则中使用的变量
- 研究课题 之 开题报告的参考格式
- 等待我的未来 认真对待我的现在
- 奇偶校验码
- linux和solaris下配置NFS
- MSN登陆不上解决方式
- oracle to_date函数
- spring中的单例模式
- nginx配置文件笔记