Инструменты пользователя

Инструменты сайта


extensions.conf

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

extensions.conf [2018/07/16 03:36] (текущий)
Строка 1: Строка 1:
 +====== extensions.conf ======
 +~~Title: Настройка Asterisk extensions.conf ~~
 +{{htmlmetatags>​
 +metatag-description=(extensions.conf — один из основных конфигурационных файлов Asterisk, настраивающий план набора (dialplan). Настройка Asterisk extensions.conf.)
 +}}
  
 +
 +**extensions.conf - the Asterisk dial plan**. extensions.conf это один из основных конфигурационных файлов Asterisk, настраивающий план набора (dialplan), с помощью которого вы указываете Asterisk, как должны обрабатываться вызовы. ​
 +
 +**extension** (добавочный номер) - обычно обозначает числовой идентификатор,​ который присвоен линии, идущей к конкретному телефону.
 +===== exten =====
 +Синтаксис добавочного номера – это слово exten, за которым следует
 +стрелка,​ образованная знаками равенства и «больше чем»:
 +   exten =>
 +Далее указывается имя (или номер). В традиционных системах телефонной связи под добавочными номерами мы понимаем цифры, которые надо набрать,​ чтобы другой телефон зазвонил. В Asterisk это понятие намного шире; например,​ в качестве имени добавочного номера может использоваться любая комбинация цифр и букв.
 +Полный добавочный номер состоит из трех компонентов:​
 +  - Имени (или номера).
 +  - Приоритета (каждый добавочный номер может включать множество шагов; порядковый номер шага называется его приоритетом).
 +  - Приложения (или команды),​ которое выполняет некоторое действие над вызовом.
 +Эти три компонента разделяются запятыми:​
 +      exten => имя,​приоритет,​приложение()
 +Вот пример того, как может выглядеть настоящий добавочный номер:
 +   exten => 123,​1,​Answer()
 +В этом примере имя добавочного номера – 123, приоритет – 1, а приложение – Answer(). ​
 +  * **Приоритеты**:​ Начиная с версии 1.2 Asterisk, был введен приоритет n, что означает «следующий». Каждый раз, когда Asterisk встречает приоритет n, она берет номер предыдущего приоритета и добавляет 1. Это упрощает внесение изменений в диалплан,​ поскольку теперь не надо изменять номера всех шагов. Например,​ диалплан может быть таким:<​code>​
 +   exten => 123,​1,​Answer()
 +   exten => 123,​n,​выполнить что-то
 +   exten => 123,​n,​выполнить что-то еще
 +   exten => 123,​n,​выполнить последнее
 +   exten => 123,​n,​Hangup()
 +</​code>​Asterisk будет самостоятельно вычислять номер следующего приоритета при каждой встрече с приоритетом n. Однако следует отметить,​ что приоритет под номером 1 должен быть задан обязательно. Если случайно для идущего первым приоритета задать n вместо 1, добавочный номер будет недоступен.
 +Начиная с версии 1.2 в Asterisk стало общепринятой практикой присваивать приоритетам текстовые метки. Это обеспечивает возможность ссылаться на приоритет не по номеру,​ который может быть неизвестен,​ потому что теперь в диалпланах,​ как правило,​ используются ненумерованные приоритеты. Чтобы присвоить приоритету текстовую метку, просто добавляем ее в круглых скобках после приоритета:<​code>​
 +   exten => 123,​n(метка),​приложение()</​code>​
 +===== Приложения =====
 +  * **Приложения**:​ Приложения – это рабочие лошадки диалплана. Каждое приложение выполняет определенное действие над данным каналом,​ например воспроизведение звука, прием тонального ввода, вызов канала,​ разрывсоединения и т. д.
 +Для выполнения некоторых приложений,​ таких как Answer() и Hangup(), не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация. Эти данные,​ называемые аргументами,​ могут передаваться в приложения,​ чтобы оказывать влияние на то, как они выполняют свои действия. Чтобы передать аргументы в приложение,​ разместите их через запятую в круглых скобках,​ следующих за именем приложения.
 +  * **Answer**() (Ответ) используется для ответа каналу,​ по которому выполняется звонок. Оно выполняет исходную настройку для канала,​ получающего входящий вызов. (Некоторые приложения не требуют обязательного ответа каналу,​ но соответствующий ответ на звонок перед тем, как выполнять какие-либо действия над каналом,​ является очень хорошей практикой). Answer() не принимает аргументов.
 +  * **Playback**() (Воспроизведение) воспроизводит в канале предварительно записанный звуковой файл. При использовании приложения Playback() ввод, поступающий от пользователя,​ просто игнорируется. Чтобы использовать Playback(), задайте в качестве аргумента имя файла (**без расширения**). Например,​ Playback(filename) обеспечит воспроизведение звукового файла filename.gsm,​ предполагая,​ что он размещен в стандартной папке для звуковых файлов(стандартная папка /​var/​lib/​asterisk/​sounds/​ или /​usr/​share/​asterisk/​sounds). Обратите внимание,​ что по желанию можно указать полный путь к файлу, как это сделано в данном примере:​
 +<​code> ​  ​Playback(/​home/​john/​sounds/​filename)</​code>​
 +Этот пример обеспечит воспроизведение файла filename.gsm из папки /​home/​john/​sounds/​. Также можно использовать относительные пути из папки для звуковых файлов Asterisk:
 +<​code>​Playback(custom/​filename)</​code>​
 +  * **Background**() (Фон) - как и Playback(), это приложение воспроизводит записанный звуковой файл. Однако,​ в отличие от Playback(), если пользователь нажимает кнопку (или последовательность кнопок) на клавиатуре телефона,​ оно прерывает воспроизведение и переходит к добавочному номеру соответственно нажатым цифрам. Например,​ если абонент нажмет кнопку 5, Asterisk прекратит воспроизводить звуковое сообщение и передаст управление вызовом первому приоритету добавочного номера 5.
 +  * **WaitExten**() (Ожидание добавочного номера). ​   Приложение WaitExten() ожидает от абонента набора телефонного номера и часто вызывается сразу после приложения Background()
 +  * **Hangup**() (Разъединить) выполняет именно то, что подразумевается под его именем:​ оно разъединяет активный канал. Это приложение должно применяться в конце контекста для завершения текущего вызова,​ что защитит от несанкционированного использования диалплана абонентами. Приложение Hangup() не принимает аргументов.
 +  * **Goto**() используется для перенаправления вызова в другую часть диалплана. Синтаксис Goto() требует передачи в него в качестве аргументов целевого контекста,​ добавочного номера и приоритета:<​code>​exten => 123,​n,​Goto(контекст,​добавочныйномер,​приоритет)</​code>​
 +  * **Dial**() (Звонить) Примеры:​ звонок на демонстрационный сервер Digium, который использует протокол IAX2, по следующему добавочному номеру:<​code>​exten => 500,​1,​Dial(IAX2/​guest@misery.digium.com/​s)</​code>​Третий аргумент Dial() – строка опций. Она может содержать один или более символов,​ влияющих на поведение приложения Dial(). Список возможных опций слишком велик, чтобы приводить его здесь; рассмотрим лишь самую популярную из них – опцию m. Если указать m в качестве третьего аргумента,​ вызывающая сторона,​ пока выполняется дозвон до вызываемого абонента,​ будет слышать во время ожидания вместо гудков музыку (конечно,​ если эта музыка сконфигурирована правильно). В случае Ubuntu Server 9.10 нужно установить поддержку mp3 (пакет asterisk-mp3),​ скопировать музыкальный файл формата mp3 в директорию /​var/​lib/​asterisk/​moh и перезапустить Asterisk. Пример,​ пока вызываемый абонент не отвечает -проигрывать музыку и по истечении 50 секунд (без ответа абонента) перейти к следующей команде диалплана:​ <​code>​exten => 123,​1,​Dial(SIP/​zoiper,​50,​m)</​code>​
 +  * **MusicOnHold**() Проигрывает музыку ожидания (Music On Hold), неопределенно долго. [[http://​voip.rus.net/​tiki-index.php?​page=Asterisk+cmd+MusicOnHold|voip.rus.net:​ Команда MusicOnHold]]
 +  * **SetMusicOnHold**
 +  * **GotoIF**() - вычисляет выражение и отправляет абонента в соответствующее место назначения в зависимости от истинности или ложности выражения.
 +  * **Ringing**() - отправка в канал запроса для индикации вызывающему пользователю "​гудков вызова"​ (ringing). Если на канале уже установлено состояние "​ответа на вызов",​ то команда Ringing сразу закончит свое выполнение и будет выполнена следующая команда в плане набора. Если Вам надо, чтоб вызывающий абонент услышал хотя бы парочку секунд сигнал вызова,​ перед тем, как попадет в систему голосового меню IVR, то как решение можно использовать команду wait() в комбинации с командой ringing. Источник:​ [[http://​voip.rus.net/​tiki-index.php?​page=Asterisk+cmd+Ringing&​highlight=Ringing|Команда Ringing()]]<​code>​
 +exten => s,1,ringing
 +exten => s,2,wait(2)
 +exten => s,3,do something else
 +</​code>​
 +
 +===== Добавочные номера s,i,t =====
 +  * **s** - добавочный номер s: (!!!Для проверки нажать #!!!) Когда в контекст поступают вызовы,​ для которых не указан конкретный добавочный номер (например,​ вызов FXO-линии),​ они передаются на добавочный номер s. (s – сокращение от start (начало),​ поскольку именно здесь начнется обработка вызова,​ если с ним не передана информация о добавочном номере.)
 +  * **i** - когда абонент нажимает не ту кнопку (не существующий добавочный номер),​ вызов направляется на добавочный номер i.
 +  * **t** - если абонент слишком долго не нажимает кнопку после запуска приложения WaitExten(),​ вызовы направляются на добавочный номер t (время ожидания по умолчанию – 10 с).
 +<​code>​
 +exten => i,​1,​Playback(pbx-invalid)
 +exten => i,​n,​Goto(incoming,​123,​1)
 +exten => t,​1,​Playback(vm-goodbye)
 +exten => t,​n,​Hangup()
 +</​code>​
 +
 +====== extensions.conf ======
 +
 +<code bash>
 +[globals]
 +[general]
 +;​autofallthrough yes, указывает Asterisk продолжать выполнение,​ если все действия для добавочного номера исчерпаны.
 +;Если задать этому параметру значение no, Asterisk после выполнения всех предусмотренных приоритетов будет ожидать ввода.
 +;​Безопаснее использовать команду autofallthrough=yes,​ поскольку мы не хотим, чтобы Asterisk простаивала без дела
 +;в ожидании ввода номера,​ если это не указано ей явно.
 +;
 +autofallthrough=yes
 +[default]
 +[incoming_calls]
 +[internal]
 +[phones]
 +include => internal
 +</​code>​
 +
 +====== Настройка dialplan для выполнения тестовых вызовов Echo ======
 +Давайте подробнее остановимся на тестовом dialplan – он позволит выполнять обратный вызов программного телефона,​ после того как тот будет настроен,​ и использовать приложение диалплана Echo() для тестирования двусторонней аудиосвязи.
 +
 +После ввода текста в extensions.conf диалплан необходимо перезагрузить,​ выполнив команду dialplan reload из консоли Asterisk:
 +<code bash>
 +   ​[globals]
 +   ​[general]
 +   ​[default]
 +   exten => s,​1,​Verbose(1|Unrouted call handler)
 +   exten => s,​n,​Answer()
 +   exten => s,n,Wait(1)
 +   exten => s,​n,​Playback(tt-weasels)
 +   exten => s,​n,​Hangup()
 +   ​[incoming_calls]
 +   ​[internal]
 +   exten => 500,​1,​Verbose(1|Echo test application)
 +   exten => 500,​n,​Echo()
 +   exten => 500,​n,​Hangup()
 +   ​[phones]
 +   ​include => internal
 +</​code>​
 +====== Определение SIP-устройства в Asterisk ======
 +<​code>​
 +# nano sip.conf
 +[general]
 +;1251 - имя (уникальное) устройства и добавочный номер. Имя устройства может быть произвольным. mysipset, john
 +[1251]
 +;Zoiper, Ekiga
 +type=friend
 +context=phones
 +host=dynamic
 +
 +[1001]
 +;Asotel
 +type=friend
 +context=phones
 +host=dynamic
 +</​code>​
 +Поскольку мы хотим как направлять вызовы в программный телефон,​ так и обеспечить клиенту возможность размещать вызовы,​ параметр
 +type (тип) был определен как friend (друг). Существует еще два параметра:​ user (пользователь) и peer (равноправный участник сети). С точки зрения Asterisk user задается для входящих вызовов,​ а peer – для исходящих звонков (через приложение Dial()). friend – это просто краткая запись,​ определяющая и пользователя,​ и равноправного участника. Если есть сомнения,​ задавайте тип friend.
 +
 +Опция host (хост) используется для определения местонахождения клиента в сети, когда Asterisk необходимо направить ему вызов. Это значение может быть задано статически,​ например host=192.168.1.100,​ или, если клиент имеет динамический IP-адрес,​ задается host=dynamic.Если для опции host задано значение dynamic и клиент сконфигурирован для автоматической регистрации,​ Asterisk получит от конечной точки (то есть от телефонного аппарата или программного телефона) пакет REGISTER, из которого Asterisk сможет узнать,​ какой IP-адрес использует равноправный SIP-участник.
 +<​code>​
 +CLI> sip reload
 +CLI> sip show settings
 +</​code>​
 +Добавим строки в extensions.conf,​ чтобы наши клиенты могли звонить между собой
 +<​code>​
 +# nano extensions.conf
 +...
 +;Asotel
 +exten => 1001,​1,​Verbose(1|Extension 1001)
 +exten => 1001,​n,​Dial(SIP/​1000,​30)
 +exten => 1001,​n,​Hangup()
 +;Ekiga
 +exten => 1251,​1,​Verbose(1|Extension 1251)
 +exten => 1251,​n,​Dial(SIP/​1251,​30)
 +exten => 1251,​n,​Hangup()
 +...
 +</​code>​
 +====== Подключение к терминатору SIP ======
 +<​code>​
 +# nano sip.conf
 +[мой_поставщик_услуг]
 +type=peer
 +host=10.251.55.100
 +fromuser=мой_уникальный_id
 +secret=мой_секретный пароль
 +context=incoming_calls
 +dtmfmode=rfc2833
 +disallow=all
 +allow=gsm
 +allow=ulaw
 +deny=0.0.0.0/​0
 +permit=10.251.55.100/​32
 +insecure=invite
 +</​code>​
 +Задавая тип peer, мы указываем Asterisk, что при получении сообщения INVITE (Приглашение) (когда поставщик присылает вызов) нужно сравнивать не имя [мой поставщик сервисов],​ а IP-адрес,​ указанный в этом сообщении. Параметр host – это IP-адрес,​ на который мы будем направлять наши вызовы,​ и этот IP-адрес будет сопоставляться при получении вызова от поставщика.
 +Если параметр fromuser не указывать в peer будет пробрасываться [[Caller ID]] с VoIP- телефона (softphone).
 +
 +====== Использование шаблонов в конфигурационных файлах ======
 +С конфигурационными файлами Asterisk связан один очень малоизвестный факт, но он настолько замечательный,​ что заслуживает отдельного небольшого раздела.
 +Скажем,​ имеется 20 SIP-телефонов,​ практически идентичных с точки зрения конфигурации. Согласно документации они должны описываться путем задания параметров для каждого телефона в отдельности. Фрагмент подобного файла sip.conf мог бы выглядеть так:
 +   ​[1000]
 +   ​type=friend
 +   ​context=internal
 +   ​host=dynamic
 +   ​disallow=all
 +   ​allow=ulaw
 +   ​dtmfmode=rfc2833
 +   ​maibox=1000
 +   ​secret=AllYourSetsAreBelongToUs
 +   ​[1001]
 +   ​type=friend
 +   ​context=internal
 +   ​host=dynamic
 +   ​disallow=all
 +   ​allow=ulaw
 +   ​dtmfmode=rfc2833
 +   ​maibox=1001
 +   ​secret=AllYourSetsAreBelongToUs
 +   ​[1002]
 +   ​type=friend
 +   ​context=internal
 +   ​host=dynamic
 +   ​disallow=all
 +   ​allow=ulaw
 +   ​dtmfmode=rfc2833
 +   ​maibox=1002
 +   ​secret=AllYourSetsAreBelongToUs
 +Слишком много ввода текста,​ копирования и вставки,​ правда?​ А что если требуется изменить имя контекста для телефонов. Не очень удобно,​ не так ли? Вводим шаблон. Давайте создадим таких же участников сети типа friend, как делали выше, только на этот раз используя шаблон:​
 +         ​[sets](!) ; <== обратите внимание,​ восклицательный знак
 +                    ; взят в круглые скобки. Это признак шаблона.
 +         ​type=friend
 +         ​context=internal
 +         ​host=dynamic
 +         ​disallow=all
 +         ​allow=ulaw
 +         ​dtmfmode=rfc2833
 +         ​secret=AllYourSetsAreBelongToUs
 +         ​[1000](sets) ; <== обратите внимание,​ имя шаблона взято
 +                       ; в круглые скобки. Все настройки этого шаблона
 +                       ; будут унаследованы.
 +         ​maibox=1000
 +         ​[1001](sets)
 +         ​maibox=1001
 +         ​[1002](sets)
 +         ​maibox=1002
 +Это одна из самых малоизвестных возможностей создания конфигурационного файла. Очень немногие пользуются этой возможностью,​ но лишь потому,​ что мало кто знает о ней. Итак, пришло время перемен.
загрузка...
extensions.conf.txt · Последние изменения: 2018/07/16 03:36 (внешнее изменение)