Вы здесь

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 нескольких 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)

Argument 2 Timeout

Таймаут задаёт время в секундах, сколько ожидать ответа.

exten => 502,1,Dial(DAHDI/1,10) same => n,Playback(vm-nobodyavail) same => n,Hangup()

Argument 3 option

Может включать один или несколько символов изменяющих поведение 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()

Argument 4 URI

Для работы с этим аргументом необходимо чтобы destination channel поддерживал его приём.
Например софтфон умеет отображать сообщение на экране.
Аргумент очень редко используется.

Blank arguments

Если нужно указать лишь 1 и 3 аргументы:

exten => 1,1,Dial(DAHDI/1,,m)

Диалплан с использованием Dial()

[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.

  • global variables - всегда видны для всех channels и могут использоваться везде в пределах Dialplan.
    Global variables должны быть объявлены в [globals] context в начале файла extensions.conf.
    [globals] LEIF=SIP/0000FFFF0001
  • Channel variables - это переменные, ассоциированные только с определённым звонком. Переменная доступна только в пределах данного звонка и только для channels, участвующих в нём.
    exten => 301,1,Set(LEIF=SIP/0000FFFF0001) same => n,Dial(${LEIF})
    exten => 202,1,Set(MagicNumber=42) same => n,SayNumber(${MagicNumber})
  • Environment variables - это есть способ доступа из Asterisk к Unix environment variables. Используются редко.

Диалплан и использованием переменных

[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

Pattern matching позволяет создавать шаблоны, т.е. одно extension matches множество различных номеров.

Рассмотрим синтаксис Asterisk Pattern matching:

  • _ все Pattern-ы должны начинаться с нижнего подчёркивания.
  • X any single digit from 0 to 9
  • Z any single digit from 1 to 9
  • N any single digit from 2 to 9
  • [15-7] Matches a single character from the range of digits specified.
  • . one or more characters, no matter what they are.
  • ! - zero or more characters, no matter what they are.

Примеры применения шаблонов

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.

Использование ${EXTEN} channel variable

Данная переменная позволяет оперировать с набранным номером.
Всегда, при наборе номера, 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

Include - это иструмент, позволяющий сделать extensions одного Context стать доступными для другого Context.
При его оприменении Asterisk сначала будет проверять наличие extension в текущем Context, затем в том что Includes.

include => context

Добавить комментарий

Filtered HTML

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Допустимые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и абзацы переносятся автоматически.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image