В системе Asterisk Dialplan определяется файлом:
/etc/asterisk/extensions.conf.
Пример дилплана можно посмотреть:
/home/asteriskpbx/src/asterisk-complete/asterisk/asterisk-11.19.0/configs/extensions.conf.sample
Dialplan строится на основе 4-х основных концепций:
- contexts
- extensions
- priorities
- applications
Диалплан разбивается на секции называемые Contexts.
Context позволяет изолировать составляющие части диалплана друг от друга.
Аналог Asterisk Context есть CUCM Partition.
Контекст обозначается внутри квадратных скобок например [general].
При именовании можно использовать буквы и цифры, а также "-" и "_".
Существуют системные контексты:
[general], [globals], [default]
Каждый channel всегда задаётся со своим context. Именно в этот Context прибегает набранный номер данного channel.
Context - это также инструмент, позволяющий регулировать доступы: кто куда может звонить и когда. Поэтому жизненно необходимо четко понимать работу Context, в противном случае Боты не дремлют - сразу же начнут звонить за наш счет.
В каждом Context мы можем определить Extensions. Extension может ссылаться например на физический телефон.
Extension задаётся тремя компонентами:
- name (или номер) Extension
- Priority - приоритет
- Application или команда, т.е. то, что запускается при наборе Extension.
exten => name,priority,application()
Каждая extension может иметь несколько шагов, т.е. при её вызове будет выполняться несколько команд. Последовательность выполнения задаётся через Priority.
Например:
exten => 123,1,Answer() exten => 123,2,do something exten => 123,3,do something else exten => 123,4,do one last thing exten => 123,5,Hangup()
Поскольку нумерация "в лоб" неудобна при большом количестве команд, можно использовать "n" priority, что означает "Next".
exten => 123,1,Answer() exten => 123,n,do something exten => 123,n,do something else exten => 123,n,do one last thing exten => 123,n,Hangup()
Чтобы каждый раз не повторять номер Extension, можно применить оператор "same", такая форма лучше воспринимается и наиболее рекомендована:
exten => 123,1,Answer() same => n,do something same => n,do something else same => n,do one last thing same => n,Hangup()
Priority labels позволят нам ссылаться на данный шаг.
exten => 123,n(label),application()
Applications это собственно команды, через которые в диалплане запускаются конкретные действия.
Playback(/var/lib/asterisk/sounds/en/hello-world)
Playback(hello-world)
При задании относительного пути, будет использоваться Asterisk sounds directory.
при изменениии диалплана для Applyнужно дать команды:
*CLI> dialplan reload
либо
$ sudo /usr/sbin/asterisk -rx "dialplan reload"
Приведём несколько примеров:
При наборе 200 проигрывает "hello world"
[LocalSets] exten => 101,1,Dial(SIP/64A769FE76F8) ; Replace 0000FFFF0001 with your device name exten => 102,1,Dial(SIP/6C626D04E1EB) ; Replace 0000FFFF0002 with your device name ; exten => 200,1,Answer() same => n,Playback(hello-world) same => n,Hangup()
В данном примере мы поместили меню в отдельный Context.
При этом extension имеет имя "start" это сделано для удобства: Самому Asterisk всё равно с чем работать в качестве extension, а номер "start" не понадобится набирать вручную.
Также здесь используются служебные extensions i и t, который позволяют обработать Invalid entry и Timeout.
[LocalSets] exten => 101,1,Dial(SIP/64A769FE76F8) ; Replace 0000FFFF0001 with your device name exten => 102,1,Dial(SIP/6C626D04E1EB) ; Replace 0000FFFF0002 with your device name ; exten => 200,1,Goto(TestMenu,start,1) [TestMenu] exten => start,1,Answer() same => n,Background(enter-ext-of-person) same => n,WaitExten(5) ; exten => 1,1,Playback(digits/1) same => n,Goto(TestMenu,start,1) exten => 2,1,Playback(digits/2) same => n,Goto(TestMenu,start,1) ; exten => i,1,Playback(pbx-invalid) same => n,Goto(TestMenu,start,1) ; exten => t,1,Playback(vm-goodbye) same => n,Hangup()
Наиболее важной способностью, которой обладает Asterisk - это подключение различных абонентов, независимо от того как методом этот абонент подключен к телефонной сети. Именно эти задачи и выполняет Dial() application.
Синтаксис Dial() более сложен и включает в себя 4 аргумента:
Destionation - аргумент по сути отражает технологию или транспорт через который выполняет построение звонка.
Наиболее часто встречаются technology types: DAHDI(E1, FXO.FXS), SIP, IAX2
The technology is DAHDI, and the resource (or channel identifier) is 1.
exten => 105,1,Dial(DAHDI/1)
Dial нескольких channels одовременно (разделены (&)). Dial() application начнет набирать все эти channels одновременно и соединит с тем каналом, который ответит первым (остальные тут же звонить перестанут).
exten => 105,1,Dial(DAHDI/1&SIP/0004F2001122&IAX2/Softphone)
Сonnect to a remote VoIP endpoint not previously defined in one of the channel configuration files
Dial(technology/user[:password]@remote_host[:port][/remote_extension]) exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)
Dial(DAHDI/[gGrR]channel_or_group[/remote_extension]) exten => 501,1,Dial(DAHDI/4/18005551212)
Таймаут задаёт время в секундах, сколько ожидать ответа.
exten => 502,1,Dial(DAHDI/1,10) same => n,Playback(vm-nobodyavail) same => n,Hangup()
Может включать один или несколько символов изменяющих поведение Dial() Application.
Наиболее часто используют m option. В этом случае calling party будет слышать музыку(music on hold) вместо гудков.
exten => 502,1,Dial(DAHDI/1,10,m) same => n,Playback(vm-nobodyavail) same => n,Hangup()
Для работы с этим аргументом необходимо чтобы destination channel поддерживал его приём.
Например софтфон умеет отображать сообщение на экране.
Аргумент очень редко используется.
Если нужно указать лишь 1 и 3 аргументы:
exten => 1,1,Dial(DAHDI/1,,m)
[LocalSets] exten => 101,1,Dial(SIP/64A769FE76F8) exten => 102,1,Dial(SIP/6C626D04E1EB) ; exten => 200,1,Goto(TestMenu,start,1) [TestMenu] exten => start,1,Answer() same => n,Background(enter-ext-of-person) same => n,WaitExten(5) ; exten => 1,1,Dial(SIP/64A769FE76F8,10) same => n,Playback(vm-nobodyavail) same => n,Hangup() exten => 2,1,Dial(SIP/6C626D04E1EB,10) same => n,Playback(vm-nobodyavail) same => n,Hangup() ; exten => i,1,Playback(pbx-invalid) same => n,Goto(TestMenu,start,1) ; exten => t,1,Playback(vm-goodbye) same => n,Hangup()
Переменные могут быть использованы для упрощения ведения диалплана, улучшения его читаемости, логичности.
В данном примере в перво строке мы задаём переменную LEIF.
В второй запрашиваем её значение.
exten => 301,1,Set(LEIF=SIP/0000FFFF0001) same => n,Dial(${LEIF})
Существуют три типа переменных: global variables, channel variables, and environment variables.
[globals] LEIF=SIP/0000FFFF0001
exten => 301,1,Set(LEIF=SIP/0000FFFF0001) same => n,Dial(${LEIF})
exten => 202,1,Set(MagicNumber=42) same => n,SayNumber(${MagicNumber})
[globals] oleg=SIP/64A769FE76F8 maria=${maria} [LocalSets] exten => 101,1,Dial(${oleg}) exten => 102,1,Dial(${maria}) ; exten => 200,1,Goto(TestMenu,start,1) [TestMenu] exten => start,1,Answer() same => n,Background(enter-ext-of-person) same => n,WaitExten(5) ; exten => 1,1,Dial(${oleg},10,m) same => n,Playback(vm-nobodyavail) same => n,Hangup() exten => 2,1,Dial(${maria},10) same => n,Playback(vm-nobodyavail) same => n,Hangup() ; exten => i,1,Playback(pbx-invalid) same => n,Goto(TestMenu,start,1) ; exten => t,1,Playback(vm-goodbye) same => n,Hangup()
Pattern matching позволяет создавать шаблоны, т.е. одно extension matches множество различных номеров.
Рассмотрим синтаксис Asterisk Pattern matching:
Pattern matches any three-digit extension from 200 through 999.
Т.е. при наборе любого из итих номеров мы услышим музыку.
exten => _NXX,1,Playback(silence/1&auth-thankyou)
Важное правило:
If Asterisk finds more than one pattern that matches the dialed extension, it will use the most specific one.
Например:
exten => _555XXXX,1,Playback(silence/1&digits/1) exten => _55512XX,1,Playback(silence/1&digits/2)
Здесь при наборе номера 5551223 будет выбран второй шаблон.
Matches any seven-digit number, as long as the first digit is 2 or higher
_NXXXXXX
Pattern matches any number that starts with 011 and has at least one more digit.
_011.
Данная переменная позволяет оперировать с набранным номером.
Всегда, при наборе номера, Asterisk помещает этот номер в ${EXTEN} channel variable.
В данном примере Asterisk будет произносить набранный номер:
exten => _XXX,1,Answer() same => n,SayDigits(${EXTEN})
Часто необходимо манипулировать набранным номером, например откусывать девятку выхода в город.
${EXTEN:x} - x is where you want the returned string to start, from left to right.
Такая форма используется чаще всего.
Например ${EXTEN:1} при наборе 95551212 вернёт 5551212.
${EXTEN:x:y} - x is the starting position and y is the number of digits to return.
Например пусть мы набрали номер 94169671111:
• ${EXTEN:1:3} would contain 416 • ${EXTEN:4:7} would contain 9671111 • ${EXTEN:-4:4} would start four digits from the end and return four digits, giving us 1111 • ${EXTEN:2:-4} would start two digits in and exclude the last four digits, giving us 16967 • ${EXTEN:-6:-4} would start six digits from the end and exclude the last four digits, giving us 67 • ${EXTEN:1} would give us everything after the first digit, or 4169671111 (if the number of digits to return is left blank, it will return the entire remaining string)
Include - это иструмент, позволяющий сделать extensions одного Context стать доступными для другого Context.
При его оприменении Asterisk сначала будет проверять наличие extension в текущем Context, затем в том что Includes.
include => context
Добавить комментарий