pattern matching,dial commands, variables, applications

advertisement
Introduction To Dial Plan
Actual Asterisk Call Switching is performed by Dial Plan
Two Important files make up Dial Plan
extensions.conf
Based on priority model
extensions.ael
Based on asterisk extension language
The dial plan consists of four main parts: contexts, extensions, priorities, and
applications.
extensions.conf layout
Contents of extensions.conf is organized in three sections



general
global
contents
general and global are setting sections
executable dial plan components are defined in contexts
`
[general] Section
Here we define few general options regarding dial plan
static
it indicates if a 'save dial plan' command from console is possiable. It
works with write protect. If set to no or omitted, pbx_config will rewrite
this file and all comments made in the file will be lost.
writeprotect
if static is yes and write protect=no the you can save dial plan by CLI
command 'save dial plan'.
autofallthrough
If autofallthrough is set, then if an extension runs out of things to do, it
will terminate the call with BUSY, CONGESTION or HANGUP
depending on Asterisk's best guess (strongly recommended).
If autofallthrough is not set, then if an extension runs out of
things to do, asterisk will wait for a new extension to be dialed
[general] Section
clearglobalvars
If clearglobalvars is set, global variables will be cleared and reparsed on
an extensions reload, or Asterisk reload. If clearglobalvars is not set,
then global variables will persist through reloads, and even if deleted
from the extensions.conf or one if its included files, will remain set to the
previous value."
global variables will be discussed in details later
Priorityjumping
If priorityjumping is set to 'yes', then applications that support 'jumping' to
a different priority based on the result of their operations will do so
Individual applications can also be requested to do this by passing a 'j'
option in their arguments.
[general] Section
#include "filename.conf"
Include other config files with the include command.
[global] Section
Dial plan global variables and their initial values are defined in this section.
Global variables are normally used as constants.
They are defined here so that they might be changed easily in the future.
Global variables will be discussed in detail later
[contexts] in extensions.conf
The Dial plan consists of a collection of contexts. Each context consists of a
collection of extensions which perform actual call routing.
Contexts will be discussed later.
extensions
An extension consists of the following parts:



Extension (Name or number)
Priority (a kind of program line number)
Application - an instruction which tells Asterisk what it should do with the
call
The syntax is:
exten => extension , priority, Command(parameters)
extensions
Extensions are of three types



Literal
Pattern
Predefined
Literal
Literal extensions can contain numbers (0-9), letters A,B,C,D (some hard
phones have these letters) or all letters (a-z)
An example
exten => arif,1,Dial(SIP/arif)
Pattern
If an extension’s name starts with '_', it is considered as pattern
for pattern some characters have special meaning.
X
any digit from 0-9
Z
any digit from 1-9
N
any digit from 2-9
[12679]
any digit in the bracket for example 1,2,6,7,or 9
. (dot)
wildcard, matches everything remaining.
[1-8]
any digit in the range 1 to 8
Testing a Pattern
Using CLI command 'dialplan show'
we can test pattern.
Example:
extensions.conf
*CLI> dialplan show
[ Context 'default' created by 'pbx_config'[
Context 'my-phones' created by 'pbx_config' ]
'23' =>
1. Answer()
[pbx_config]
2. Playback(hello-world)
[pbx_config]
3. Hangup()
[pbx_config]
[ Context 'parkedcalls' created by 'res_features']
[my-phones]
exten => 23,1,Answer()
exten => 23,2,Playback(hello-world)
exten => 23,3,Hangup()
'700' =>
1. Park()
[res_features]
-= 2 extensions (4 priorities) in 3 contexts. =
*CLI>
Testing a Pattern
dialplan show my-phones
dialplan show 23@my-phone
dialplan show 25@my-phones
Now change pattern to _2X
[my-phones]
exten => _2X,1,Answer()
exten => _2X,2,Playback(hello-world)
exten => _2X,3,Hangup()
Testing a Pattern
Test with the following CLI commands.
dialplan show 23@my-phone
dialplan show 25@my-phone
dialplan show 246@my-phones
now change pattern to _2X.
[my-phones]
exten => _2X.,1,Answer()
exten => _2X.,2,Playback(hello-world)
exten => _2X.,3,Hangup()
Testing a Pattern
Test with following CLI commands.
dialplan show 23@my-phones
dialplan show 25@my-phones
dialplan show 246@my-phones
Pattern matching order
Asterisk prioritizes patterns based on the quality of the match.
If two extensions match a dialed number, Asterisk will always chose the
better match. Before deciding which extension matches best, it processes
the entire context.
Example:
[sales]
exten => _12X.,1,NoOp(12X)
exten => 12345,1,NoOp(12345)
exten => _1234.,1,NoOp(1234.)
Pattern matching
Testing
dial plan show 12345@sales
dial plan show 12346@sales
Pattern “_.” in Asterisk 1.2
Digium has changed the behaviour of “_.” as it was in Asterisk 1.2. it should
have lowest priority but in Asterisk 1.2 its behaviour is opposite to the
expected behaviour
Pattern matching
Example
[sales]
exten => _12X.,1,NoOp(12X)
exten => 12345,1,NoOp(12345)
exten => _1234.,1,NoOp(1234.)
exten => _.,1,NoOp(testing _.)
Testing:
dialplan show 12345@sales
In Asterisk 1.2:
show dialplan 12346@sales
Predefined
There are several predefined extension names:
- i - Invalid
- s - Start
- h - Hangup
- t - Timeout
- T - AbsoluteTimeout
- o – Operator
we ll discuss them later with examples
priorities
Priority is the order in which commands are run. First the one with priority 1,
then with 2, .
Asterisk does not consider the order in which you put the lines in the
extensions.conf file. You can mix the lines into a different order, like the
following example, and it will make no difference because Asterisk uses the
priority of each line to determine the order of execution:

[test]
exten => 555,4,Hangup
exten => 555,1,Answer
exten => 555,3,Voicemail(44)
exten => 555,2,Playback(tt-weasels)
n priority
n priority automatically increases a priority's value
using n priority its easy to insert new command without disturbing the
original priorities
Labels can be set using n priority, so that it can be targeted with goto
exten => s,n(start),Answer
Arbitrary increments can be defined
exten => s,n+2,Dial(SIP/101)
Applications
Answer([delay])
Answer the ringing channel. If delay is specified then asterisk will wait for the
specified number of milliseconds before answering the channel.
Hangup
Hangs up the channel
BackGround()
Plays a file while waiting for the user to begin entering an extension
PlayBack(filename)
Plays a given filename
Applications(cont.)
SayDitits()
Says the specified digits using the current language setting for the channel
Busy()
Request that the channel indicate the busy condition
Set(n=value)
Sets variable n to the specified value
Wait(seconds)
Wait for the specified number of seconds, then return 0.
WaitExten()
Waits for the user to enter a new extension for the specified amount of time
then return 0
Applications(cont.)
Goto([[context,]extension,]priority)
Sends control of the current channel to
; same as above, but using a named
the specified priority, optionally setting
priority
the destination’s extension and context
exten => 124,1,Answer( )
exten => 123,1,Answer( )
exten => 124,2,Set(COUNT=1)
exten => 123,2,Set(COUNT=1)
exten =>
exten => 23,3,SayNumber(${COUNT})
124,3(repeat),SayNumber(${COUNT})
exten =>
exten =>
123,4,Set(COUNT=$[${COUNT} + 1 ])
exten => 123,5,Goto(3)
124,4,Set(COUNT=$[${COUNT} + 1 ])
exten => 124,5,Goto(repeat)
Applications(cont.)
GotoIf(condition?label1:label2)
Sends the call to label1 if the
condition is true, or to label2 if the
; same thing as above, but this time we'll specify an
extension and a priority for each label
exten => 124,1,GotoIf($[ ${TEST} =
101]?123,10:123,20)
condition is false.
Either label1 or label2 may be
omitted but not both.
[globals]
TEST=101
[incoming]
; go to priority 10 if ${TEST} is 101, otherwise go
to priority 20
exten => 123,1,GotoIf($[ ${TEST} = 101 ]?10:20)
exten => 123,10,Playback(the-monkeys-twice)
exten => 123,20,Playback(tt-somethingwrong)
; same thing as above, but these labels have a context,
extension, and priority
exten => 125,1,GotoIf($[ ${TEST} = 101
]?incoming,123,10:incoming,123,20)
Applications(cont.)
GotoIfTime(times,days_of_week,days_of_month,months?label)
jumps to the specified label if current time matched with the specified time
; If we're open, then go to the open context
; We're open from 9am to 6pm Monday through Friday
exten => s,1,GotoIfTime(09:00-17:59,mon-fri,*,*?open,s,1)
; We're also open from 9am to noon on Saturday
exten => s,2,GotoIfTime(09:00-11:59,sat,*,*?open,s,1)
; Otherwise, we're closed
exten => s,3,Goto(closed,s,1)
Context
Context is a collection of extensions
Context can be used to implement some important features
Routing:
Route call based on extension
Autoattendent: Greet callers and ask them to enter extensions
MultilevelMenus: Menus for sales, Support etc
Authentication: Ask for passwords for certain extensions
Day/Night: Vary behavior after hours
Example
[contex]
exten => some_exten,priority,application(arg1,arg2...)
exten => some_exten,priority,application(arg1,arg2...)
Context Example
[local1]
exten => _NX.,1,NoOp(Local call)
[countrywide]
include => local1
exten => _0N.,1,NoOp(Country Wide Call)
[international1]
include => local1
include => countrywide
exten => _00Z.,1,NoOp(International Call)
Variables
Variable is a placeholder for a value
Variables are referenced in dial plan as
${foo} ;foo is a variable name
Variables are of three types

Global variables

Channel variables

Environment variables
Types of Variables
Global variables
Global variables apply to all extensions in all contexts
should be defined in global context
they can also be defined using SetGlobalVar() application
Channel Variables
Channel variables is associated only to a particual call
Channel variables are defined only for the duration of call
Channel variables are set via the set() application
Environment Variable
Environment variables are a way of accessing UNIX environment variables
these are referenced as ${ENV(var)} where var is UNIX environment
Variable Example
[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})
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
Inheritance of Channel
Variables
A variable name preceded by '_' character will cause that variable to be
inherited by channels created by the main channel
A variable preceded by a single '_' character will be inherited only once
A variable preceded by two '_' characters that is '__' will be inherited
indefinitely
Inheritance of Channel
Variables
[variable-inheritance-test]
exten => 104,1,Set(FEE=fee)
exten => 104,2,Set(_FIE=fie)
exten => 104,3,Set(__FUM=fum)
exten => 104,4,Dial(Local/105@test1)
[test1]
exten => 105,1,NoOp(${FEE})
exten => 105,2,NoOp(${FIE})
exten => 105,3,NoOp(${FUM})
exten => 105,4,Dial(Local/106@test2)
[test2]
exten => 106,1,NoOp(${FEE})
exten => 106,2,NoOp(${FIE})
exten => 106,3,NoOp(${FUM})
exten => 106,4,hangup
Some Predefined Channel Variables
${CHANNEL}
current channel name
${EXTEN}
current extension
${PRIORITY}
current priority
${CONTEXT}
current context
${EPOCH}
current UNIX style epoch (no. of seconds since 1 jan
1970)
${DIALSTATUS}
status of call
${DIALTIME}
time since number was dialed
${ANSWEREDTIME}
actual amount of time in seconds
${DATETIME}
current date time(DDMMYY-HH:MM:SS) deprecated
in Asterisk 1.2, instead use STRFTIME
${TIMESTAMP}
current date and time (YYYYMMDD-HHMMSS)
deprecated in Asterisk 1.4, , instead use STRFTIME
${CALLERID(num)}
current caller ID number
Macros
A macro is a kind of subroutine
A macro is used to avoid repitation in dialplan
A macro is an extension context preceded by “macro-” for example [macro-
voicemail]
commands are same as in context but with a few exceptions
Only s extension is allowed in macros
The original ${EXTEN} and ${CONTEXT} cannot be used.
${MACRO_EXTEN} and ${MACRO_CONTEXT} variables are used instead.
A macro is called with macro() application in an extension. Syntax is
Macro(macroname,arg1,arg2...)
[localcalls]
exten => _NX.,1,Macro(test,${EXTEN})
[nationwide]
include => localcalls
exten => _0N.,1,Macro(test,${EXTEN})
[intercalls]
include => localcalls
include => nationwide
exten => _00Z.,1,Macro(test,${EXTEN}
[macro-test]
exten => s,1,GoToIf($["${MACRO_CONTEXT}":"localcalls"] ?local)
exten => s,n,GoToIf($["${MACRO_CONTEXT}":"nationwide]" ?nation)
exten => s,n,NoOp(interntional call)
exten => s,n,hangup()
exten => s,n(local),NoOp(local calls)
exten => s,n,hangup()
exten => s,n(nation),NoOp(nation wide call)
exten => s,n,hangup()
Include
For simplifying and organising larger dial plans.
With include, we use other contexts in current context
The following is syntax of include statement
include => context
;where context is name of contex
first asterisk will look in the current context for match. If finds no match, then
asterisk looks in first included context then second and so on.
Include statement can be made conditional to the time of the day. This make
it easier to implement different day and night behaviors.
Example
[time-based]
include => open|09:00-17:00|mon-fri|*|*
include => open|09:00-14:00|sat|*|*
include => closed
[open]
exten => _X.,1,NoOp(Ofice Open)
[closed]
exten => _X.,1,NoOp(Office Closed)
Dial Command
Dial command sends call on one or more channels
if priorityjumping=yes, the the dial plan jumps to priority+101 on busy,
congested and on channel unavailable.
Syntax is
Dial(type1/identifier [&type2/identifier2 [&type3/identifier3...]],timeout,options,URL
type specifies channel type such as ZAP, SIP, IAX2 and so on
identifier specifies “phone number” to dial on that channel
specify more than one channel for dial command using & sign.
Timeout optional parameter, defines timeout
Dial Command
Options
t: allow called user to transfer call
T: allow the calling user to transfer
r: generate ringing tone
m: provide music on hold to calling party until called channel answers
h: allow the called person to hangup by dialing *
H: allow the caller to hangup by dialing *
o: send the caller's ID
j: Asterisk v.1.2 jump to priority n+101 if all of the requested channels are
busy
M(x): executes the macro(x) once call connects
Dial Command
g: when the called party hangs up, exit to execute more commands in the
current context
G(context^exten^pri) if call is answered, transfer both parties to the
specified context and extension
S(n):
hang up the call after n seconds of answer call
Return Codes of Dial Command
Dial sets DIALSTATUS to indicate its success or failure
DIALSTATUS contains the following text string
ANSWER
a sucessful dial
BUSY
the number is busy
NOANSWER
the number rang but no one answer the call
CANCEL
dial command reached the number but the caller
handup before the called person picked up
CONGESTION
congestion usually means number is not recognized
CHANUNAVAIL
channel unavailable
Example
[dialstatus-test]
exten => 200,1,Dial(SIP/802,5,g)
exten => 200,n,NoOp(Dialstatus:${DIALSTATUS})
exten => 201,1,Dial(SIP/801,5,g)
exten => 201,n,NoOp(Dialstatus:${DIALSTATUS})
Special Extensions
Some additional system defined extensions are:
h: hangup, this extension is called when a caller hangs up the phone.
When this extension is called channel related variables get destroyed
Example:
[exten-h-testing]
include => from-internal1
exten => 200,1,GoTo(from-internal1,s,1)
[from-internal1]
exten => s,1,Set(CONNECTIONS=$[${CONNECTIONS}+1]|g)
exten => s,2,NoOp(${CONNECTIONS})
exten => s,3,wait(210)
exten => h,1,Set(CONNECTIONS=$[${CONNECTIONS}-1])
Special Extensions
i: I extension is executed when a caller enters an invalid extension. I
extension only works with background(). Channel variables get
destroyed when I is called
O and a extension
Call will be directed to operater if caller presses 0 and if operater=yes in
voicemail.conf
•
Will direct call to a extension (abort)
Special Extensions
T and t extension
t
If there is no input in an IVR menu within a certain timeframe, the t
extension is called
T
The T extension is called after the absolute timeout has been exceeded.
You can set this timeout value with
Set(TIMEOUT(absolute)=<seconds>)
Special Extensions
The timer starts whenever the timeout value is set (it does not automatically
start with the connection, it must be started explicitly with the Set()
command).
Example:
exten => 20,1,Answer()
exten => 20,2,Set(TIMEOUT(absolute)=120)
exten => 20,3,Playback(hello-world)
exten => 20,4,Wait(1)
exten => 20,5,Goto(3)
exten => T,1,Wait(1)
exten => T,2,Playback(thank-you-for-calling)
exten => T,3,Wait(1)
exten => T,4,Hangup()
Special Extensions
s extension
For any scenario in which we cannot determine the number dialed, use the
s extension.
exten => s,1,Answer()
exten => s,2,Wait(1)
exten => s,3,Play(tt-monkeys)
exten => s,4,Wait(1)
exten => s,5,Hangup()
Expressions
Expressions are combinations of variables, operators, and values that you
put together to get a result
In Asterisk, expressions always begin with a dollar sign and an opening
square bracket and end with a closing square bracket, as shown below:
$[expression]
When Asterisk encounters an expression in a dial plan, it replaces the entire
expression with the resulting value.
Example
exten => 321,1,Set(COUNT=3)
exten => 321,2,Set(NEWCOUNT=$[${COUNT} + 1])
exten => 321,3,SayNumber(${NEWCOUNT})
Expressions
Operators
types of operators that are available in Asterisk
Boolean operators
These operators evaluate the "truth" of a statement
The Boolean operators are:
expr1 | expr2
expr1 & expr2
expr1 {=, >, >=, <, <=, !=} expr2
Download