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. Это упрощает внесение изменений в диалплан, поскольку теперь не надо изменять номера всех шагов. Например, диалплан может быть таким:
exten => 123,1,Answer() exten => 123,n,выполнить что-то exten => 123,n,выполнить что-то еще exten => 123,n,выполнить последнее exten => 123,n,Hangup()
Asterisk будет самостоятельно вычислять номер следующего приоритета при каждой встрече с приоритетом n. Однако следует отметить, что приоритет под номером 1 должен быть задан обязательно. Если случайно для идущего первым приоритета задать n вместо 1, добавочный номер будет недоступен. Начиная с версии 1.2 в Asterisk стало общепринятой практикой присваивать приоритетам текстовые метки. Это обеспечивает возможность ссылаться на приоритет не по номеру, который может быть неизвестен, потому что теперь в диалпланах, как правило, используются ненумерованные приоритеты. Чтобы присвоить приоритету текстовую метку, просто добавляем ее в круглых скобках после приоритета:
exten => 123,n(метка),приложение()
[office] exten => _1XX,1,Dial(SIP/${EXTEN})
Разберем эту строку.
- [office] — имя контекста, в котором обрабатываются звонки от пира.
- exten ⇒ — указатель начала шага.
- _1XX — маска. На маске остановимся чуть подробнее. С помощью нее сортируются все звонки, попадающие в контекст диалплана.
Маска использует набор паттернов для сортировки звонков по caller-id:
X – любая цифра от 0-9 N – любая цифра от 2-9 [234-6] – цифры 2, 3, 4 и 6 . – любые возможные символы
Маска начинается с символа "_", который означает что это шаблон. В случае, если вы забудете указать его, Астериск примет 1XX за вызываемый номер и передаст Dial-у паттерны вместо номера телефона, и звонок не состоится. 1 — номер действия.
Dial — это приложение. В диалплане можно использовать более 200 различных приложений, которые используются для манипуляций со звонками. Сейчас, в самом начале, мы будем использовать только одно приложение — Dial. Из названия понятно, что оно используется для совершения звонков.
Приложения
- Приложения: Приложения – это рабочие лошадки диалплана. Каждое приложение выполняет определенное действие над данным каналом, например воспроизведение звука, прием тонального ввода, вызов канала, разрывсоединения и т. д.
Для выполнения некоторых приложений, таких как Answer() и Hangup(), не требуется никаких дополнительных инструкций. Некоторым приложениям необходима дополнительная информация. Эти данные, называемые аргументами, могут передаваться в приложения, чтобы оказывать влияние на то, как они выполняют свои действия. Чтобы передать аргументы в приложение, разместите их через запятую в круглых скобках, следующих за именем приложения.
- Answer() (Ответ) используется для ответа каналу, по которому выполняется звонок. Оно выполняет исходную настройку для канала, получающего входящий вызов. (Некоторые приложения не требуют обязательного ответа каналу, но соответствующий ответ на звонок перед тем, как выполнять какие-либо действия над каналом, является очень хорошей практикой). Answer() не принимает аргументов.
- Playback() (Воспроизведение) воспроизводит в канале предварительно записанный звуковой файл. При использовании приложения Playback() ввод, поступающий от пользователя, просто игнорируется. Чтобы использовать Playback(), задайте в качестве аргумента имя файла (без расширения). Например, Playback(filename) обеспечит воспроизведение звукового файла filename.gsm, предполагая, что он размещен в стандартной папке для звуковых файлов(стандартная папка /var/lib/asterisk/sounds/ или /usr/share/asterisk/sounds). Обратите внимание, что по желанию можно указать полный путь к файлу, как это сделано в данном примере:
Playback(/home/john/sounds/filename)
Этот пример обеспечит воспроизведение файла filename.gsm из папки /home/john/sounds/. Также можно использовать относительные пути из папки для звуковых файлов Asterisk:
Playback(custom/filename)
- Background() (Фон) - как и Playback(), это приложение воспроизводит записанный звуковой файл. Однако, в отличие от Playback(), если пользователь нажимает кнопку (или последовательность кнопок) на клавиатуре телефона, оно прерывает воспроизведение и переходит к добавочному номеру соответственно нажатым цифрам. Например, если абонент нажмет кнопку 5, Asterisk прекратит воспроизводить звуковое сообщение и передаст управление вызовом первому приоритету добавочного номера 5.
- WaitExten() (Ожидание добавочного номера). Приложение WaitExten() ожидает от абонента набора телефонного номера и часто вызывается сразу после приложения Background()
- Hangup() (Разъединить) выполняет именно то, что подразумевается под его именем: оно разъединяет активный канал. Это приложение должно применяться в конце контекста для завершения текущего вызова, что защитит от несанкционированного использования диалплана абонентами. Приложение Hangup() не принимает аргументов.
- Goto() используется для перенаправления вызова в другую часть диалплана. Синтаксис Goto() требует передачи в него в качестве аргументов целевого контекста, добавочного номера и приоритета:
exten => 123,n,Goto(контекст,добавочныйномер,приоритет)
- Dial() (Звонить) Примеры: звонок на демонстрационный сервер Digium, который использует протокол IAX2, по следующему добавочному номеру:
exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)
Третий аргумент Dial() – строка опций. Она может содержать один или более символов, влияющих на поведение приложения Dial(). Список возможных опций слишком велик, чтобы приводить его здесь; рассмотрим лишь самую популярную из них – опцию m. Если указать m в качестве третьего аргумента, вызывающая сторона, пока выполняется дозвон до вызываемого абонента, будет слышать во время ожидания вместо гудков музыку (конечно, если эта музыка сконфигурирована правильно). В случае Ubuntu Server 9.10 нужно установить поддержку mp3 (пакет asterisk-mp3), скопировать музыкальный файл формата mp3 в директорию /var/lib/asterisk/moh и перезапустить Asterisk. Пример, пока вызываемый абонент не отвечает -проигрывать музыку и по истечении 50 секунд (без ответа абонента) перейти к следующей команде диалплана:
exten => 123,1,Dial(SIP/zoiper,50,m)
- MusicOnHold() Проигрывает музыку ожидания (Music On Hold), неопределенно долго. voip.rus.net: Команда MusicOnHold
- SetMusicOnHold
- GotoIF() - вычисляет выражение и отправляет абонента в соответствующее место назначения в зависимости от истинности или ложности выражения.
- Ringing() - отправка в канал запроса для индикации вызывающему пользователю "гудков вызова" (ringing). Если на канале уже установлено состояние "ответа на вызов", то команда Ringing сразу закончит свое выполнение и будет выполнена следующая команда в плане набора. Если Вам надо, чтоб вызывающий абонент услышал хотя бы парочку секунд сигнал вызова, перед тем, как попадет в систему голосового меню IVR, то как решение можно использовать команду wait() в комбинации с командой ringing. Источник: Команда Ringing()
exten => s,1,ringing exten => s,2,wait(2) exten => s,3,do something else
- NoOp - это приложение ничего не делает, однако полезно в целях отладки. Его можно использовать в качестве заполнителя или для вывода какого-либо текста в консоли. NoOp() отличается от команды Команда Asterisk Verbose() тем что для него нельзя задать уровень детальности. Например
exten => _56780[05]XXX,1,NoOp(MTS Дніпро, номер - ${EXTEN})
Добавочные номера s,i,t
- s - добавочный номер s: (!!!Для проверки нажать #!!!) Когда в контекст поступают вызовы, для которых не указан конкретный добавочный номер (например, вызов FXO-линии), они передаются на добавочный номер s. (s – сокращение от start (начало), поскольку именно здесь начнется обработка вызова, если с ним не передана информация о добавочном номере.)
- i - когда абонент нажимает не ту кнопку (не существующий добавочный номер), вызов направляется на добавочный номер i.
- t - если абонент слишком долго не нажимает кнопку после запуска приложения WaitExten(), вызовы направляются на добавочный номер t (время ожидания по умолчанию – 10 с).
exten => i,1,Playback(pbx-invalid) exten => i,n,Goto(incoming,123,1) exten => t,1,Playback(vm-goodbye) exten => t,n,Hangup()
extensions.conf
[globals] [general] ;autofallthrough yes, указывает Asterisk продолжать выполнение, если все действия для добавочного номера исчерпаны. ;Если задать этому параметру значение no, Asterisk после выполнения всех предусмотренных приоритетов будет ожидать ввода. ;Безопаснее использовать команду autofallthrough=yes, поскольку мы не хотим, чтобы Asterisk простаивала без дела ;в ожидании ввода номера, если это не указано ей явно. ; autofallthrough=yes [default] [incoming_calls] [internal] [phones] include => internal
Настройка dialplan для выполнения тестовых вызовов Echo
Давайте подробнее остановимся на тестовом dialplan – он позволит выполнять обратный вызов программного телефона, после того как тот будет настроен, и использовать приложение диалплана Echo() для тестирования двусторонней аудиосвязи.
После ввода текста в extensions.conf диалплан необходимо перезагрузить, выполнив команду dialplan reload из консоли Asterisk:
[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
Определение SIP-устройства в Asterisk
# nano sip.conf [general] ;1251 - имя (уникальное) устройства и добавочный номер. Имя устройства может быть произвольным. mysipset, john [1251] ;Zoiper, Ekiga type=friend context=phones host=dynamic [1001] ;Asotel type=friend context=phones host=dynamic
Поскольку мы хотим как направлять вызовы в программный телефон, так и обеспечить клиенту возможность размещать вызовы, параметр 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-участник.
CLI> sip reload CLI> sip show settings
Добавим строки в extensions.conf, чтобы наши клиенты могли звонить между собой
# 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() ...
Подключение к терминатору SIP
# 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
Задавая тип peer, мы указываем Asterisk, что при получении сообщения INVITE (Приглашение) (когда поставщик присылает вызов) нужно сравнивать не имя [мой поставщик сервисов], а IP-адрес, указанный в этом сообщении. Параметр host – это IP-адрес, на который мы будем направлять наши вызовы, и этот IP-адрес будет сопоставляться при получении вызова от поставщика. Если параметр fromuser не указывать в peer будет пробрасываться Caller ID (CID) - определение телефонного номера вызывающего оборудования (телефона) с 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
Это одна из самых малоизвестных возможностей создания конфигурационного файла. Очень немногие пользуются этой возможностью, но лишь потому, что мало кто знает о ней. Итак, пришло время перемен.
Дополнительные ссылки
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах