extensions.conf

extensions.conf - the Asterisk dial plan. extensions.conf это один из основных конфигурационных файлов Asterisk, настраивающий план набора (dialplan), с помощью которого вы указываете Asterisk, как должны обрабатываться вызовы.

extension (добавочный номер) - обычно обозначает числовой идентификатор, который присвоен линии, идущей к конкретному телефону.

Синтаксис добавочного номера – это слово exten, за которым следует стрелка, образованная знаками равенства и «больше чем»:

 exten =>

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

  1. Имени (или номера).
  2. Приоритета (каждый добавочный номер может включать множество шагов; порядковый номер шага называется его приоритетом).
  3. Приложения (или команды), которое выполняет некоторое действие над вызовом.

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

    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 - добавочный номер 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. 📌

💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!