что такое диалплан в астериск

База знаний

Совет: с помощью vim syntax highlighting вы можете значительно облегчить работу Dialplan’а и, что более важно, сделать ее менее ошибочно фоновой (to typos).

Новое в Asterisk v1.6:

Новое в Asterisk v1.2: Появился новый параметр с именем » autofallthrough» для файла extensions.conf, который, по умолчанию, установлен в значение yes. В алгоритме работы Asterisk 1.0 (и более ранних) было заложено то, что Asteerisk ожидает набора номера екстеншена после того, как для вызываемого екстеншена нет больше команд, которые можно было бы выполнить. Параметр «autofallthrough» меняет этот режим и, если команды кончились, то вызов будет немедленно завершен с причиной BUSY, CONGESTION, или HANGUP, в зависимости от того, какая причина более подходит, по мнению сервера Asterisk. Если вы описываете екстеншен, для системы голосового меню (IVR), то вы должны использовать команду WaitExten, если у Вас параметр «autofallthrough» установлен в значение yes.

Включение одного контекста в другой

Один контекст может содержать другие контексты. Например, рассмотрим следующие контексты:

Context «default»:
Extension Description
101 Mark Spencer
102 Wil Meadows
0 Operator

Context «local»:
Extension Description
_9NXXXXXX Local calls
include => «default»

Context «longdistance»:
Extension Description
_91NXXNXXXXXX Long distance calls
include => «local»

Когда Asterisk принимает входящий вызов на канале, то он просматривает контекст, который определен для обработки вызовов этого канала, на предмет того, что с этими вызовами нужно сделать. В контексте определены разные, для каждого вызываемого пользователями екстеншена, наборы команд. Например, в контексте может быть определен один набор команд, если пользователь набрал «123», и другой набор команд, если пользователь набирает «9», и совершенно другой, если он набирает любое число, начинающееся с «555».

Для некоторых видов соединений, таких как поступающие звонки с внешней телефонной линии, присутствует только сам факт вызова, а не набор какого-либо номера. В этом случае, Asterisk ведет себя так, как будто пользователь набрал специальный екстеншен с именем «s» (Start). Тогда Asterisk будет искать «номер» екстеншена с именем s в контексте того канала, через который пришел данный вызов.

Например, у нас есть канал «Zap/1», соединененный с телефонным аппаратом в Вашем здании. И предположим, что в файле конфигурации для канала Zap (zapata.conf) Вы определили context=john для канала Zap с номером 1. Итак, когда Вы снимаете телефонную трубку, чтобы набрать номер, тогда Asterisk будет искать контекст с именем «john» в плане набора extensions.conf, чтобы найти набор команд, которые надо выполнить. Вы должны каждое определение контекста в файле extensions.conf начинать с определения его имени, помещенного в квадратные скобки, например, так:

Для каждого контекста, Вам надо определить одни или несколько екстеншенов, которые Asterisk будет сравнивать с набранным номером. В каждом екстеншене Вы указываете серверу Asterisk, что необходимо сделать с этим вызовом, указывая набор команд.

Екстеншены

Екстеншены могут быть двух типов: цифробуквенный или шаблонными.

Цифробуквенный екстеншен может быть числом, таким как 123, а так же может содержать стандартные символы * и #, которые есть у обычных телефонов, так что имя 12#89* является вполне правильным именем екстеншена. Некоторые телефоны имеют на клавиатуре дополнительные DTMF кнопки A, B, C и D, следовательно, имена екстеншенов могут быть определены и с этими символами. Фактически, название екстеншена может содержать любую латинскую букву или число, а так же некоторые знаки препинания. Стоит отметить, что многие VOIP телефоны в состоянии «вызвать номер екстеншена», который может быть обычной текстовой строкой, например, такой как «Office». Следовательно, вполне допустимо задать екстеншен с именем Office в плане набора Asterisk.

Являются ли имена екстеншенов регистрозависимыми? И да, и нет. Являются в том случае, когда Asterisk пытается сопоставить «номеру», набранному пользователем, екстеншен, определенный в контексте, они должны полностью совпадать, включая регистр. Итак, если пользователь в своем VOIP телефоне вызывает екстеншен «OFFICE», тогда Asterisk не будет выполнять команды, которые Вы могли бы определить для екстеншена с именем «Office». С другой стороны, имена екстеншенов регистронезависимые, в том плане, что в одном контексте нельзя определить наборы команд для екстеншенов, которые имеют одинаковые имена и отличаются только регистром. Итак, Вы не сможете в одном контексте определить один набор команд для екстеншена Office и другой для екстеншена OFFICE.

Предопределенные названия екстеншенов (стандартные екстеншены)

Определение екстеншенов

exten = extension, priority, Command(parameters)

можно использовать эквивалентную форму, где после символа «=» идет символ треугольной скобки: «=>». Данная форма определения используется во многих примерах.

Итак, у нас есть контекст с определенным именем, например, «vasja». И в каждом контексте Вы можете определить один или несколько «екстеншенов». Для каждого из этих екстеншенов Вы должны определить набор выполняемых команд. Итак, как же Вам определить эти екстеншены и наборы команд для них? Все просто, Вам нужно отредактировать файл extensions.conf любым текстовым редактором. Однако, существуют некоторые приложения, которые могут помочь Вам в этом занятии: GUI tool.

Каждый компонент, выполняемой команды для екстеншена, или строки команды, содержит следующие части:

Пример

exten => 123,1,Answer
exten => 123,2,Playback(tt-weasels)
exten => 123,3,Voicemail(44)
exten => 123,4,Hangup

Это определение единственного екстеншена с именем «123». Когда приходит звонок на екстеншен 123, Asterisk сам ответит на звонок, проиграет звуковой файл с именем «tt-weasels», даст возможность оставить пользователю голосовое сообщение для голосового ящика 44, и затем повесит трубку.

Стоит отметить, что Asterisk не волнует, в каком порядке Вы размещаете команды в файле extensions.conf. Вы можете размещать команды в каком угодно порядке, как в нижеприведенном примере, и это ни как не отразится на порядке выполнения команд, т.к. Asterisk использует приоритет команд для определения порядка выполнения:

exten => 123,4,Hangup
exten => 123,1,Answer
exten => 123,3,Voicemail(44)
exten => 123,2,Playback(tt-weasels)

Другой вариант выбора екстеншена основывается на номере вызывающего абонента, «логика параноика». По этой логике мы определяем набранный екстеншен, в зависимости от того, откуда поступил вызов, основываясь на caller-ID звонящего. Например:

exten => 123/100,1,Answer()
exten => 123/100,2,Playback(tt-weasels)
exten => 123/100,3,Voicemail(123)
exten => 123/100,4,Hangup()

exten => 1234/_256NXXXXXX,1,Answer()
and so on.

Эта запись соответствует екстеншену 1234, если Caller ID у вызывающего абонента будет чем-то начинающимся с 256. Это бывает довольно полезно, если Вы хотите оградить себя от ненужных звонящих персон.

Так же можно сделать и так:

exten => s,1,Answer
exten => s/9184238080,2,SetCIDName(EVIL BASTARD)
exten => s,2,SetCIDName(Good Person)
exten => s,3,Dial(SIP/goodperson)

В контекстах плана набора можно использовать только следующие директивы: exten, include, ignorepat и switch.

Переменные и выражения

Перезагрузка плана набора

Если Вам необходимо перезагрузить план набора для того, чтобы сделанные в нем изменения вступили в силу, не перегружая все остальные конфиги Asterisk, используйте команду CLI Asterisk: extensions reload.

Что использовать один большой файл или несколько маленьких?

Перенаправление вызовов на другой Asterisk

Синтаксис:
[iaxprovider]
switch => IAX2/user:что такое диалплан в астериск@server/context

Получение данных для extensions.conf из внешних источников

[default]
exten => s,1,Answer
exten => s,2,Playback(welcome-message)
; переход на контекст, определенный во включенном файле
exten => s,3,Goto(context-in-include-file,s,1)
:
:

Примеры

Использование макросов для создания extensions
[globals]
PHONE1=Zap/1
PHONE2=SIP/6002

[macro-oneline]
exten => s,1,Dial($,20,t)
exten => s,2,Voicemail(u$)
exten => s,3,Hangup
exten => s,102,Voicemail(b$)
exten => s,103,Hangup

[local]
exten => 6601,1,Macro(oneline,$)
exten => 6602,1,Macro(oneline,$)

Источник

Книга Asterisk (5 редакция 2019)

Глава 6

Всё должно быть изложено так просто, как только возможно, но не более того.

Опытные разработчики программного обеспечения считают код диалплана Asterisk архаичным и часто предпочитают управлять потоком вызовов с помощью API Asterisk, таких как AMI и ARI (которые мы обсудим в последующих главах). Независимо от ваших планов в этом отношении, изучение поведения Asterisk намного проще, если вы сначала поймете диалплан. Возможно, также стоит отметить, что диалплан Asterisk настроен на производительность и поэтому является самым быстрым способом выполнения потока вызовов с точки зрения быстродействия и минимальной нагрузки на систему. Диалплан работает быстро.

Синтаксис диалплана

Диалплан Asterisk задается в конфигурационном файле с именем extensions.conf, расположенном в каталоге /etc/asterisk.

Структура диалплана состоит из четырех иерархических компонентов: контекстов (Context), расширений (Extension), приоритетов (Priority) и приложений (Application) (смотри Рисунок ).

что такое диалплан в астериск. Смотреть фото что такое диалплан в астериск. Смотреть картинку что такое диалплан в астериск. Картинка про что такое диалплан в астериск. Фото что такое диалплан в астериск

Рисунок 6-1. Иерархия диалплана

Давайте нырнем прямо туда.

Примеры файлов конфигурации

А основной файл extensions.conf был создан как часть процесса установки ранее в этой книге. Мы будем опираться на этот файл в этой главе.

Asterisk также поставляется с подробным файлом extensions.conf, который может быть установлен с образцами файлов конфигурации (команда установки make samples сделает это), и если вы запустили эту команду (которую мы не рекомендуем во время установки, но предлагается установщиком), у вас, скорее всего, будет файл /etc/asterisk/extensions.conf, который переполнен информацией. Вместо того, чтобы начинать с примера файла, мы предлагаем вам построить свой extensions.conf с нуля с пустым файлом (вы можете переименовать или переместить его куда-нибудь, если хотите сохранить в качестве ссылки).

/src/asterisk-15. /configs/samples (наряду со многими другими образцами файлов конфигурации).

Контексты

Диалплан делится на разделы, называемые контекстами, которые служат для разделения различных частей диалплана. Расширение, определенное в одном контексте, полностью изолировано от расширений в любом другом контексте, если взаимодействие специально не разрешено.

В качестве простого примера представим, что у нас есть две компании, совместно использующие сервер Asterisk. Если мы поместим каждого автосекретаря компании (IVR) в свой собственный контекст, две компании будут полностью отделены друг от друга. Это позволяет нам самостоятельно определить, что происходит, когда, скажем, набирается номер 0:

Абоненты, набирающие 0 из голосового меню компании A, должны быть переданы администратору компании A.

Абоненты, набравшие 0 в голосовом меню компании B, будут отправлены в отдел обслуживания клиентов компании B.

Оба абонента находятся в одной и той же системе, взаимодействуя с одной и той же абонентской группой, но поскольку они прибыли в разные контексты, то испытывают совершенно разные потоки вызовов. То, что происходит с каждым входящим вызовом, определяется кодом диалплана в каждом контексте.

Примечание

Это очень важное соображение. С традиционными УАТС, как правило, существует набор значений по умолчанию для таких вещей, как прием, что означает, что если вы забудете их определить, они, вероятно, будут работать в любом случае. В Asterisk все наоборот. Если вы не скажете Asterisk, как обрабатывать каждую ситуацию, и он столкнется с чем-то, что не может обработать, вызов, как правило, будет отклонен.

Примечание

Имена контекстов имеют максимальную длину 79 символов (80 символов минус 1 завершающий null).

Что тогда, конечно, может потребовать что-то вроде:

Все инструкции, помещенные после определения контекста, являются частью этого контекста, пока не будет определен следующий контекст.

Контексты в типичном файле extensions.conf могут быть структурированы примерно так:

что такое диалплан в астериск. Смотреть фото что такое диалплан в астериск. Смотреть картинку что такое диалплан в астериск. Картинка про что такое диалплан в астериск. Фото что такое диалплан в астериск

Рисунок 6-2. Связь между конфигурацией канала (слева) и контекстами в диалплане (справа)

Примечание

Это одна из наиболее важных концепций для понимания при работе с каналами и абонентскими группами. Устранение неполадок потока вызовов намного проще, если вы понимаете связь между контекстом канала (который сообщает каналу, где подключаться к диалплану) и контекстом диалплана (где мы создаем поток вызовов, который происходит при поступлении вызова).

Важным (возможно, самым важным) использованием контекстов является обеспечение конфиденциальности и безопасности. При правильном использовании контекстов можно предоставить некоторым каналам доступ к функциям (например, междугородним вызовам), которые недоступны другим. Если вы не проработаете свою абонентскую группу тщательно, то можете непреднамеренно позволить другим использовать вашу систему в корыстных целях. Пожалуйста, имейте это в виду, когда строите свою систему Asterisk; в интернете есть много ботов, которые были специально написаны для идентификации и использования плохо защищенных систем Asterisk.

Предупреждение

описывает несколько шагов, которые вы должны предпринять, чтобы сохранить вашу систему Asterisk в безопасности. Жизненно важно чтобы вы прочитали и поняли эту страницу. Если вы игнорируете меры безопасности, изложенные там, то можете в конечном итоге позволить всем и каждому совершать междугородние или платные звонки за ваш счет!

Если вы не относитесь к безопасности вашей системы Asterisk серьезно, то можете в конечном итоге поплатиться буквально. Пожалуйста, потратьте время и усилия, чтобы защитить вашу систему от мошенничества.

Extensions (расширения)

В телекоммуникационной отрасли слово extension (расширение) обычно относится к числовому идентификатору, который при наборе будет звонить на телефон (или вызывать системный ресурс, такой как голосовая почта или очередь). В Asterisk расширение представляет нечто гораздо более мощное, поскольку оно определяет уникальную серию шагов (каждый шаг, содержащий приложение), через которые Asterisk будет принимать этот вызов.

В каждом контексте мы можем определить столько (или несколько) расширений, сколько потребуется. Когда определенное расширение запускается (входящим каналом), Asterisk будет следовать шагам, определенным для этого расширения. Поэтому именно расширения определяют, что происходит с вызовами, когда они проходят через диалплан. Хотя расширения могут использоваться для указания телефонных добавочных номеров в традиционном смысле (т.е. расширение 153 вызовет звонок SIP-телефона на столе Джона), в диалплане Asterisk они могут использоваться для гораздо большего.

После этого следует имя (или номер) расширения.

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

Совет

Назначение имен для расширений может показаться необычной концепцией, но когда вы понимаете, что SIP поддерживает набор всех видов комбинаций символов (все, что является допустимым URI, строго говоря), это имеет смысл. Это одна из особенностей, которая делает Asterisk настолько гибким и мощным.

Каждый шаг расширения состоит из трех компонентов:

Имя (или номер) расширения

Приоритет (каждое расширение может включать в себя несколько шагов; номер шага называется “приоритет”)

Приложение (или команда), которое будет выполняться на этом шаге

Эти три компонента разделены запятыми, как это:

Вот простой пример:

Приоритеты

Каждое расширение может иметь несколько шагов, называемых приоритетами. Приоритеты нумеруются последовательно, начиная с 1 и каждый выполняет одно конкретное приложение. Например, следующий добавочный номер ответит на звонок с приоритетом номер 1, а затем повесит трубку с приоритетом номер 2. Шаги в расширении происходят один за другим.

Совершенно очевидно, что этот код на самом деле не делает ничего полезного. Ключевым моментом здесь является то, что для конкретного расширения Asterisk следует за приоритетами по порядку.

Этот стиль синтаксиса диалплана все еще встречается время от времени, хотя (как вы вскоре увидите) он обычно больше не используется для нового кода. Более новый синтаксис похож, но упрощен.

Ненумерованные приоритеты

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

Имейте в виду, что вы всегда должны указывать приоритет № 1. Если вы случайно поставили n вместо 1 для первого приоритета (распространенная ошибка даже среди опытных кодеров диалплана), вы обнаружите после перезагрузки диалплана, что расширение не будет существовать.

Оператор same =>

Для дальнейшего упрощения написания диалплана был создан новый синтаксис. Пока расширение остается неизменным, вы можете просто ввести same => с последующим приоритетом и приложением, а не вводить полное расширение в каждой строке:

Не ошибитесь, диалплан Asterisk весьма своеобразен. Многие люди избегают его вообще, и использовать AGI и ARI, чтобы написать свой диалплан.

Хотя, конечно, есть что сказать для написания диалплана на внешнем языке (и мы рассмотрим его в последующих главах), диалплан Asterisk является родным для него, и вы не получите лучшей производительности чем c ним. Код диалплана выполняется быстро.

Кроме того, если вы хотите понять, как Asterisk думает, вам нужно понять его диалплан.

Метки приоритетов

Метки приоритетов позволяют назначить имя приоритету в пределах расширения. Это должно гарантировать что вы можете ссылаться на приоритет иначе чем его номер (который, вероятно, неизвестен, учитывая, что диалпланы теперь, как правило, используют ненумерованные приоритеты). Позже вы узнаете, что часто необходимо отправлять вызовы из других частей диалплана на определенный приоритет в определенном расширении. Чтобы назначить текстовую метку приоритету, просто добавьте метку в скобках после приоритета, например:

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

Предупреждение

Очень распространенной ошибкой при написании меток является вставка запятой между then и (, например:

Эта ошибка нарушит часть вашего диалплана и вы получите сообщение об ошибке, указывающее, что приложение не может быть найдено.

Приложения

Некоторые приложения, включая Answer() и Hangup() не требуют дополнительных инструкций для выполнения своей задачи. Но большинству приложений требуется дополнительная информация. Эти дополнительные элементы или аргументы передаются в приложения чтобы повлиять на выполнение действий. Чтобы передать аргументы приложению, поместите их между круглыми скобками, которые следуют за именем приложения, разделяя запятыми.

Приложения Answer(), Playback() и Hangup()

Приложение Answer() используется для ответа на канал, который звонит. Это кажется простой вещью, но много вещей происходит на канале с этой одной командой. Answer() сообщает каналу отправить обратно на дальний конец сообщение, что вызов был отвечен, а также включить медиа-пути (сетевые потоки, которые будут нести звук между вызывающим абонентом и системой). Как мы уже упоминали ранее, Answer() не принимает аргументов. Answer() не всегда требуется (на самом деле, в некоторых случаях он может быть вообще нежелательным), но это эффективный способ обеспечить подключение канала перед выполнением дальнейших действий.

Приложение Progress()

Иногда полезно иметь возможность передавать информацию обратно в сеть перед ответом на вызов. Приложение Progress() пытается предоставить информацию о ходе выполнения вызова исходному каналу. Некоторые операторы связи ожидают этого, и таким образом вы можете решить странные проблемы с сигнализацией, вставив Progress() в диалплан, куда поступают ваши входящие вызовы. С точки зрения биллинга, использование Progress() позволяет поставщику услуг знать, что вы обрабатываете вызов, не запуская счетчик биллинга.

Приложение Playback() используется для воспроизведения ранее записанного звукового файла по каналу. Ввод от пользователя игнорируется, что означает невозможность использования Playback() в автосекретаре, например если не хотите принимать ввод в этот момент. 5

Подсказка

В предыдущем примере будет воспроизводиться filename.wav из каталога /home/john/sounds. Это может быть проблематично из-за потенциальных проблем с правами доступа к файлам. Если вы планируете иметь много пользовательских звуков в своей системе, то вам, вероятно, понадобится выделенный каталог для них, и нужно будет проверить, чтобы Asterisk мог найти и воспроизвести файлы.

Вы также можете использовать относительные пути из каталога звуков Asterisk, как показано ниже:

В этом примере будет воспроизводиться filename.wav из подкаталога custom каталога звуков по умолчанию (возможно /var/lib/asterisk/sounds/en/custom/filename.wav). Если указанный каталог содержит более одного файла с этим именем, но с разными расширениями, Asterisk автоматически воспроизведёт лучший. 6

Приложение Hangup() делает именно то, что следует из его названия: оно завершает активный канал. Вы должны использовать это приложение в конце контекста, когда хотите завершить текущий вызов, чтобы убедиться, что абоненты не продолжают выполнение диалплана таким образом, который вы, возможно, не ожидали. Приложение Hangup() не требует никаких аргументов, но вы можете передать код причины ISDN если захотите, например Hangup(16) и он будет переведен в сопоставимое сообщение SIP и отправлено на дальний конец.

По мере работы над книгой мы будем знакомить вас со многими другими приложениями Asterisk, но пока достаточно теории; давайте напишем диалплан!

Базовый прототип диалплана

Таким образом, повторю, что форма всех диалпланов строится на основе этих четырех понятий: контекст, расширение, приоритет и приложение (Рисунок6-3).

что такое диалплан в астериск. Смотреть фото что такое диалплан в астериск. Смотреть картинку что такое диалплан в астериск. Картинка про что такое диалплан в астериск. Фото что такое диалплан в астериск

Рисунок 6-3. Прототип диалплана

Простой диалплан

Ладно, хватит теории. Откройте файл /etc/asterisk/extensions.conf в вашем любимом редакторе, и давайте посмотрим на ваш первый диалплан (который был создан в ). Мы собираемся добавить к нему.

Hello World

Как это обычно бывает во многих технологических книгах (особенно в книгах по компьютерному программированию), наш первый пример называется “Hello World.”

В первом приоритете нашего расширения мы отвечаем на вызов. Во втором мы проигрываем звуковой файл с именем hello-world, а в третьем вешаем трубку. Код, который нас интересует для этого примера выглядит так:

Подсказка

Если у вас нет настроенных каналов, сейчас самое время создать их. Существует реальное удовлетворение, которое приходит от передачи вашего первого вызова в диалплан Asterisk в системе, которую вы построили с нуля. Люди получают эту ухмылку на лицах когда понимают, что они только что создали телефонную систему. Это удовольствие может быть и вашим, поэтому, пожалуйста, не идите дальше, пока не сделаете эту маленькую работу диалплана. Если у вас есть какие-либо проблемы, вернитесь к и проработайте примеры оттуда.

Если у вас еще нет этого кода диалплана, то нужно будет добавить его и перезагрузить диалплан с помощью этой команды CLI:

или вы можете выполнить команду непосредственно из оболочки с помощью:

Вызов расширения 200 с любого из ваших настроенных телефонов 7 должен вознаградить вас дружелюбным голосом Эллисон Смит, говорящим: “Hello, World.”

Предупреждение

Мы не рекомендуем Вам продвигаться вперед в этой книге, пока вы не проверите следующее:

Вызовы между добавочными номерами 100 и 101 работают.

Вызов расширения 200 воспроизводит “Hello World.”

Хотя этот пример очень короткий и простой, он подчеркивает основные концепции диалплана: контексты, расширения, приоритеты и приложения. Теперь у вас есть фундаментальные знания, на которых строятся все диалпланы.

Когда вы создаете диалплан, будет полезно открыть CLI Asterisk в новом окне. Вы будете часто перезагружать диалплан, и во время тестирования потока вызовов захотите увидеть что происходит и происходит. CLI Asterisk полезен для обеих этих вещей.

Поэтому лучше всего было бы редактировать в одном окне, а перезагружать и отлаживать в другом.

Создание интерактивного диалплана

Диалплан, который мы только что построили, был статическим; он всегда будет выполнять одни и те же действия при каждом вызове. Многие диалпланы также нуждаются в логике для выполнения различных действий на основе ввода пользователя, поэтому давайте посмотрим на это сейчас.

Приложения Goto(), Background() и WaitExten()

Как следует из названия, приложение Goto() используется для отправки вызова в другую часть диалплана. Goto() требует, чтобы мы передали контекст назначения, расширение и приоритет в качестве аргументов, например:

Теперь, когда устройство входит в контекст [sets] и набирает 201, вызов будет передан в расширение start в контексте TestMenu (который в настоящее время не будет делать ничего интересного, потому что у нас есть ещё код для записи).

Примечание

Наиболее распространенным использованием приложения Background() является создание основных голосовых меню (часто называемых автосекретарями, IVR, 9 или телефонными деревьями). Многие компании используют голосовые меню для направления абонентов на соответствующие добавочные номера, тем самым освобождая своих администраторов от необходимости отвечать на каждый вызов.

Background() имеет тот же синтаксис как и Playback():

После внесения этих изменений сохраните и перезагрузите диалплан:

Если вы звоните в расширение 201, то должны услышать звуковое приглашение, которое говорит: “Enter the extension of the person you are trying to reach”. Система будет ждать 5 секунд, пока вы введете цифру. Если вы нажмете 1 или 2, Asterisk будет действовать соответственно расширению и считывать эту цифру обратно к вам. Поскольку мы не предоставили никаких дальнейших инструкций, ваш звонок будет закончен. Вы также обнаружите, что если введете другую цифру (например, 3), диалплан не сможет продолжиться.

Эти новые строки отправят управление вызовом обратно в расширение start после воспроизведения набранного номера.

Подсказка

В этом примере мы передали все три аргумента для ясности, но передача только расширения и приоритета имела бы тот же эффект, поскольку контекст назначения совпадает с исходным контекстом.

Обработка неверных значений и тайм-аутов

Использование приложения Dial()

Синтаксис приложения Dial() является более сложным, чем у других приложений, которые мы использовали до этого, но оно является тем, где происходит большая часть магии Asterisk. Dial() принимает до четырех аргументов, которые мы рассмотрим далее.

Синтаксис Dial() выглядит следующим образом:

Аргумент 1: назначение

Первый аргумент-это назначение, которое вы пытаетесь вызвать, которое (в самой простой форме) состоит из технологии (или транспорта), через которую выполняется вызов, косой черты и адреса удаленной конечной точки или ресурса.

Примечание

В эти дни вы, скорее всего, будете использовать PJSIP в качестве типа канала, но в не слишком далеком прошлом общие типы технологий также включали DAHDI (для аналоговых и T1/E1/J1 каналов), старый канал SIP (до PJSIP) и IAX2. 13 Если вы посмотрите на более старый диалплан, то можете увидеть некоторые из этих представленных протоколов. В дальнейшем рекомендуется и поддерживается только PJSIP и DAHDI.

Мы также можем одновременно набирать несколько каналов, объединяя назначения амперсандом ( & ), например:

Приложение Dial() вызовет все указанные назначения одновременно и соединит входящий вызов с тем каналом назначения, который ответит первым (другие каналы немедленно прекратят звонить). Если приложение Dial() не может связаться ни с одним из назначений, Asterisk установит переменную с именем DIALSTATUS соответственно причине, по которой не может набрать назначение, и продолжит со следующим приоритетом в расширении. 14

Приложение Dial() также позволяет подключаться к удаленной конечной точке VoIP, ранее не определенной в одном из файлов конфигурации канала. Полный синтаксис:

Полный синтаксис приложения Dial() немного отличается для каналов DAHDI:

Например, вот как бы вы набрали 1-800-555-1212 на канале DAHDI номер 4: 15

Аргумент 2: таймаут

Вторым аргументом приложения Dial() является тайм-аут, заданный в секундах. Если задан тайм-аут, Dial() попытается вызвать указанное назначение(я) в течение этого количества секунд, прежде чем сдаться и перейти к следующему приоритету в расширении. Если тайм-аут не указан, Dial() будет продолжать набирать вызываемый канал(ы) пока кто-то не ответит или вызывающий абонент не повесит трубку. Давайте добавим тайм-аут в 10 секунд к нашему расширению:

Давайте поместим то, что мы узнали ранее, в другой пример:

Как вы можете видеть, этот пример будет играть звуковой файл vm-nobodyavail.gsm, если вызов остается без ответа (а затем повесит трубку). Обратите внимание, что это на самом деле не обеспечивает голосовую почту; мы просто играем подсказку, которая могла бы быть любой действительной подсказкой. Мы рассмотрим отправку звонков на голосовую почту позже.

Аргумент 3: опции

Аргумент 4: URI

Четвертым и последним аргументом приложения Dial() является URI. Если канал назначения поддерживает получение URI во время вызова, указанный URI будет отправлен (например, если у вас есть IP-телефон, который поддерживает получение URI, он появится на дисплее телефона; аналогично, если вы используете софтфон, URI может появиться на экране вашего компьютера). Этот аргумент используется очень редко.

Обновление диалплана

Пустые аргументы

Обратите внимание, что второй, третий и четвертый аргументы могут быть оставлены пустыми; требуется только первый аргумент. Например, если вы хотите указать параметр, но не тайм-аут, просто оставьте аргумент timeout пустым, например:

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

Если у вас есть опыт программирования, вы уже понимаете что такое переменная. Если нет, то мы кратко объясним, что такое переменные и как они используются. Любая работа диалплана за пределами очень простых примеров, только что приведенных, значительно выиграет от использования переменных. Они являются одной из полезных функций настраиваемого диалплана, который вы не найдете в типичной проприетарной АТС.

Подсказка

Существует три типа переменных, которые мы можем использовать в нашем диалплане: глобальные переменные, переменные канала и переменные среды. Давайте воспользуемся моментом, чтобы посмотреть на каждый тип.

Глобальные переменные

С другой стороны, если бы вы определили глобальную переменную, содержащую значение PJSIP/0000f30A0A01 в начале вашего диалплана, а затем ссылались на нее, то пришлось бы изменить только одну строку кода, чтобы повлиять на все места в диалплане, где использовался этот канал.

Глобальные переменные должны быть объявлены в контексте [globals] в начале extensions.conf. В качестве примера мы создадим несколько глобальных переменных, которые хранят идентификаторы каналов наших устройств. Эти переменные задаются во время анализа диалплана Asterisk:

Мы вернемся к ним позже.

Канальные переменные

Вы увидите гораздо больше переменных канала. Читайте дальше.

Переменные среды

Добавление переменных в ваш диалплан

Теперь, когда мы узнали о переменных, давайте включим их в наш диалплан. Мы добавим три глобальные переменные, которые свяжут имя переменной с именем канала:

Редко имеет смысл жестко кодировать данные в диалплане. Почти всегда лучше использовать переменную.

Убедитесь, что вы протестировали это чтобы убедиться, что у вас нет никаких опечаток, а также посмотреть, как это выглядит в Asterisk CLI при выполнении:

Объединение переменных

Чтобы объединить переменные, просто поместите их вместе, например:

Наследование переменных канала

Переменные канала всегда связаны с исходным каналом, который их задает, и больше не доступны после передачи канала.

Чтобы разрешить переменным канала следовать за каналом при его передаче по системе, необходимо использовать наследование переменных канала. Существует два модификатора, которые позволяют переменной канала следовать за каналом: одиночное подчеркивание и двойное подчеркивание.

Одиночное подчеркивание (_) приводит к тому, что переменная канала наследуется каналом для одной передачи, после чего она больше недоступна для дополнительных передач. Если вы используете двойное подчеркивание (__), переменная канала будет наследоваться на протяжении всего срока жизни этого канала.

Установка переменных канала для наследования просто требует префикса имени канала с одним или двойным подчеркиванием. Затем на переменные канала ссылаются точно так же, как и обычно.

Вот пример установки переменной канала для наследования одной передачи:

Вот пример установки переменной канала для бесконечного наследования передачи:

Если вы хотите прочитать значение переменной канала, вы не используете подчеркивание(я):

Совпадения по шаблонам

Если мы хотим чтобы люди могли набирать номер через Asterisk и подключаться к внешним ресурсам, нам нужен способ сопоставить любой возможный номер телефона, который может набрать вызывающий абонент. Для таких ситуаций Asterisk предлагает сопоставление шаблонов. Сопоставление шаблонов позволяет создать в диалплане одно расширение, которое соответствует множеству различных номеров. Это чрезвычайно полезно.

Синтаксис сравнения по шаблонам

Когда мы используем совпадение шаблонов, определенные буквы и символы представляют то, что мы пытаемся сопоставить. Шаблоны всегда начинаются с подчеркивания (_). Это говорит Asterisk, что мы ищем совпадение по шаблону, а не по явному имени расширения.

Если вы забудете подчеркивание в начале вашего шаблона, Asterisk подумает, что это просто именованное расширение и не будет выполнять сопоставление шаблонов. Это одна из самых распространенных ошибок, которые люди делают, когда начинают изучать Asterisk.

После подчеркивания можно использовать один или несколько следующих символов:

Соответствует любой одиночной цифре от 0 до 9.

Соответствует любой одиночной цифре от 1 до 9.

Соответствует любой отдельной цифре от 2 до 9.

Примечание

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

Предупреждение

Если вы не будете осторожны, подстановочные совпадения могут заставить ваши диалпланы делать то, что вы не ожидаете (например, сопоставление встроенных расширений, таких как i или h ). Вы должны использовать подстановочное соответствие в шаблоне только после того, как вы сопоставили как можно больше других цифр. Например, следующий шаблон никогда не должен использоваться:

Или этот, чтобы соответствовать любой буквенно-цифровой строке:

Подстановочные знаки совпадают; соответствует нулю или более символов, независимо от того, что они из себя представляют.

Чтобы использовать сопоставление шаблонов в вашем диалплане, просто поместите шаблон вместо имени расширения (или номера):

В этом примере шаблон соответствует любому трехзначному расширению от 400 до 499. 18

Еще одна важная вещь, которую нужно знать о сопоставлении шаблонов, заключается в том, что если Asterisk найдет более одного шаблона, который соответствует набранному расширению, он будет использовать наиболее конкретный (слева направо). Предположим, вы определили следующие два шаблона, и вызывающий абонент набрал 555-1212:

В этом случае будет выбрано второе расширение, поскольку оно более конкретно. Загрузите это и сделайте звонки на 5550000, 5550123, 5551212, 5551200, 5551300, 5551299 и так далее чтобы почувствовать, как это работает. Поиграйте с различными совпадениями шаблонов. Например, что будет соответствовать шаблону _555NNNN? Что будет соответствовать шаблону _9?

Этот шаблон соответствует любому семизначному числу, если первая цифра равна 2 или более:

Предыдущий шаблон будет совместим с любым североамериканским планом нумерации местного семизначного номера.

В областях с 10-значным набором этот шаблон будет выглядеть следующим образом:

Обратите внимание, что ни один из этих двух шаблонов не будет обрабатывать междугородние звонки. Мы рассмотрим их в ближайшее время.

NANP и мошенничество

Возможно, будет разумно блокировать звонки на коды регионов в страны NANP за пределами США и Канады, пока у вас не будет возможности пересмотреть свои тарифы на вызовы в эти страны. Википедия имеет на основы того, что вам нужно знать о NANP, в том числе какие NPA (коды регионов) принадлежат к какой стране.

Давайте попробуем другой:

Этот номер будет соответствовать номеру с 1, за которым следует код города между 200 и 999, а затем любое семизначное число, которое не начинается с 0 или 1. В области вызова NANP этот шаблон будет использоваться для сопоставления любого междугороднего номера. 19

Обратите внимание на период в конце. Этот шаблон соответствует любому числу, которое начинается с 011 и имеет по крайней мере еще одну цифру. В NANP это указывает на международный номер телефона. (Мы будем использовать такие шаблоны в следующем разделе, чтобы добавить возможности исходящего набора в нашем диалплане.)

Общие глобальные совпадения шаблонов

За пределами Северной Америки существует большое различие в том, как обрабатывается нумерация; однако некоторые шаблоны являются общими. Вот несколько простых примеров:

Вам нужно будет понять план набора номера вашего региона, чтобы произвести полезное совпадение шаблона.

В этих примерах, приложение SayDigits() читает номер расширения, которое вы набрали.

В этом примере приложение SayDigits() будет начинать со второй цифры и, таким образом, считывать только последние две цифры набранного добавочного номера.

Продвинутые возможности манипуляций с цифрами

$ будет содержать 416

$ будет содержать 9671111

$ начнетсяс 4 цифры с конца и вернет 4 цифры, давая нам 1111

$ начнет со второй цифры и исключит последние четыре цифры, давая нам 16967

$ начнет с шестой цифры с конца и исключит последние четыре цифры, давая 67

$ даст нам все цифры после первой или 4169671111 (если количество цифр для возврата оставлено пустым, то вернет всю оставшуюся строку)

Включения (Includes)

Включение одного контекста в другой позволяет набирать расширения в пределах включенного контекста.

Когда мы включаем другие контексты в наш текущий контекст, мы должны помнить о порядке, в котором мы их включаем. Asterisk сначала попытается сопоставить набранное расширение в текущем контексте. В случае неудачи он затем попытается использовать первый включенный контекст (включая любые контексты, включенные в этот контекст), а затем продолжит работу с другими включенными контекстами в том порядке, в котором они были включены.

Вывод

Если части этого диалплана не имеют смысла, вы можете вернуться и перечитать один или два раздела, прежде чем перейти к следующей главе. Крайне важно, чтобы вы поняли эти принципы и как их применять, поскольку следующие главы основаны на этой информации.

1Обратите внимание, что пробел явно отсутствует в списке разрешенных символов. Не используйте пробелы в именах контекстов — вам не понравится результат!

4Хорошо, кормление кошки не является обычным использованием для телефонной системы, но через Asterisk такие вещи не невозможны. Доку Брауну бы это понравилось.

6Asterisk выбирает лучший файл на основе затрат на транскодинг — то есть он выбирает файл, который является наименее трудоемким для преобразования в свой собственный аудиоформат. Когда вы запускаете Asterisk, он вычисляет затраты на перевод между различными аудиоформатами (они часто варьируются от системы к системе). Вы можете увидеть эти затраты на перевод, набрав core show translation в Asterisk CLI. Приведенные цифры показывают, сколько микросекунд требуется Asterisk для перекодирования одной секунды звука.

7Если вы еще не настроили два телефона, пожалуйста, вернитесь к и установите несколько телефонов, чтобы вы могли играть с ними. Вы можете уйти только с одним телефоном для тестирования, но на самом деле два идеально подходит. Есть много бесплатных софтфонов, и некоторые из них довольно хороши.

8Следует отметить, что некоторые люди ожидают, что Background() из-за его названия, будет продолжаться дальше через следующие шаги в диалплане во время воспроизведения звука. На самом деле, его название относится к тому, что он воспроизводит звук в фоновом режиме, ожидая DTMF на переднем плане.

10Смотри функцию диалплана TIMEOUT() для получения информации о том, как изменить тайм-ауты по умолчанию. См. для получения информации о том, что такое функции диалплана.

12Или каналов, если вы хотите звонить более чем по одному за раз.

13IAX2 (произносится как “EEKS”), является протоколом обмена между Asterisk (v2). В первые дни Asterisk он был популярен для транкинга, поскольку значительно уменьш а л накладные расходы сигнализации на занятых линиях. Пропускная способность стала намного меньше, а протокол SIP стал почти повсеместным. Протокол IAX2 больше не поддерживается активно, но он по-прежнему сохраняет некоторую популярность за свою способность пересекать брандмауэры, и поддержку нескольких медиапотоков. Тем не менее, его использование является устаревшим, и на самом деле не рекомендуется.

16В частности, то, что мы устанавливаем здесь, является переменной канала.

17Позже мы перейдем к функциям диалплана. Не беспокойтесь слишком о переменных окружения прямо сейчас. Они не важны для понимания диалплана.

18Мы использовали переменную канала EXTEN, без введения в неё. Читайте дальше, как это будет рассмотрено ниже в этой главе.

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *