Вы здесь

Asterisk 05 Dialplan

В системе 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

Context

Диалплан разбивается на секции называемые Contexts.
Context позволяет изолировать составляющие части диалплана друг от друга.
Аналог Asterisk Context есть CUCM Partition.

Контекст обозначается внутри квадратных скобок например [general].
При именовании можно использовать буквы и цифры, а также "-" и "_".

Существуют системные контексты:
[general], [globals], [default]

Каждый channel всегда задаётся со своим context. Именно в этот Context прибегает набранный номер данного channel.
asterisk_04_user_device_configuration_01_ciscomaster.ru.jpg

Context - это также инструмент, позволяющий регулировать доступы: кто куда может звонить и когда. Поэтому жизненно необходимо четко понимать работу Context, в противном случае Боты не дремлют - сразу же начнут звонить за наш счет.

Extensions

В каждом Context мы можем определить Extensions. Extension может ссылаться например на физический телефон.

Extension задаётся тремя компонентами:
- name (или номер) Extension
- Priority - приоритет
- Application или команда, т.е. то, что запускается при наборе Extension.

exten => name,priority,application()

Priorities

Каждая 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()

Unnumbered priorities

Поскольку нумерация "в лоб" неудобна при большом количестве команд, можно использовать "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()

The same => operator

Чтобы каждый раз не повторять номер 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

Priority labels позволят нам ссылаться на данный шаг.

exten => 123,n(label),application()

Applications

Applications это собственно команды, через которые в диалплане запускаются конкретные действия.

  • Answer() - приложение используется для ответа на звонок. Оно выполняет Initial setup и принимает входящий звонок. Не требует никаких аргументов и является эффективной мерой для того чтобы удостовериться, что channel подключён, прежде чем выполнять дальнейшие действия.
  • Progress() - используется для Debug(???)
  • Playback() - используется для проигрывания звукового файла. Никак не реагируется на ввод юзера.
    Playback(/var/lib/asterisk/sounds/en/hello-world)
    Playback(hello-world)

    При задании относительного пути, будет использоваться Asterisk sounds directory.

  • Hangup() - приложение закрывает active channel.
  • Background() - проигрывает звуковой файл, одновременно ожидая набора пользователем номера
  • Goto(context,extension,priority) - оператор перехода.

Simple Dialplan

при изменениии диалплана для 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()

Interactive Dialplan

В данном примере мы поместили меню в отдельный 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()

Dial() application

Наиболее важной способностью, которой обладает Asterisk - это подключение различных абонентов, независимо от того как методом этот абонент подключен к телефонной сети. Именно эти задачи и выполняет Dial() application.

Синтаксис Dial() более сложен и включает в себя 4 аргумента:

Argument 1 Destionation

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 нескол