В системе 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 нескол