Определение экстеншенов и их приоритетов - Asterisk и FreePBX: От GUI к Глубокому Администрированию и Оптимизации - Qpel.AI

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

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

Что такое экстеншен?

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

Экстеншен состоит из трёх частей:

  1. Имя экстеншена (extension): Номер (100, 200), буквенно-цифровой идентификатор (s, i, t) или шаблон (_X., _NXX).
  2. Приоритет (priority): Целое число, указывающее порядок выполнения команд внутри одного экстеншена. Команды с меньшим приоритетом выполняются первыми.
  3. Приложение (application): Команда Asterisk, которая выполняет определённое действие (например, Dial, Answer, Playback).

Вот как это выглядит в файле extensions.conf:

[my-context]
exten => 100,1,Answer()
exten => 100,2,Playback(hello-world)
exten => 100,3,Dial(SIP/phone100)
exten => 100,4,Hangup()

В этом примере:

  • 100 – имя экстеншена.
  • 1, 2, 3, 4 – приоритеты.
  • Answer(), Playback(), Dial(), Hangup() – приложения Asterisk.

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

Приоритеты: порядок выполнения команд

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

Рассмотрим пример:

[incoming-calls]
exten => 8800,1,Answer()
exten => 8800,2,Wait(1)
exten => 8800,3,Playback(vm-intro) ; Проигрываем приветствие
exten => 8800,4,Dial(SIP/operator&SIP/manager,20) ; Звоним оператору и менеджеру 20 секунд
exten => 8800,5,Voicemail(u8800) ; Если никто не ответил, переводим на голосовую почту
exten => 8800,6,Hangup()

Здесь:

  1. Вызов на номер 8800 сначала будет Answer() (принят).
  2. Затем Asterisk Wait(1) (подождёт 1 секунду).
  3. Проиграет файл vm-intro (приветствие).
  4. Попытается дозвониться до operator и manager в течение 20 секунд.
  5. Если никто не ответил, вызов перейдёт на голосовую почту u8800.
  6. В конце вызов будет Hangup() (завершён).

Специальные приоритеты: s, n, t, i

В дополнение к числовым приоритетам, Asterisk использует несколько специальных буквенных приоритетов, которые упрощают написание диалплана:

  • s (start): Используется как первый приоритет в экстеншене, если вы не хотите указывать 1. Удобно, когда экстеншен состоит из одной команды или когда вы хотите явно указать точку входа.
    exten => 100,s,Answer()
    exten => 100,n,Playback(hello-world)
    
  • n (next): Автоматически присваивает следующий доступный числовой приоритет. Это значительно упрощает написание длинных экстеншенов, так как вам не нужно вручную нумеровать каждый шаг.
    exten => 100,1,Answer()
    exten => 100,n,Playback(hello-world) ; Это будет приоритет 2
    exten => 100,n,Dial(SIP/phone100)    ; Это будет приоритет 3
    
  • t (timeout): Специальный экстеншен, который выполняется, если пользователь не ввёл никаких данных (например, в IVR-меню) в течение определённого времени.
  • i (invalid): Выполняется, если пользователь ввёл неверные данные (например, несуществующий номер в IVR).

Совет: Использование s и n делает диалплан более читаемым и менее подверженным ошибкам при добавлении или удалении шагов.

Шаблоны экстеншенов

Экстеншены могут быть не только конкретными номерами, но и шаблонами, что позволяет обрабатывать целые диапазоны номеров или определённые форматы. Шаблоны начинаются с символа подчёркивания _.

Основные символы шаблонов:

  • X: Любая цифра от 0 до 9.
  • Z: Любая цифра от 1 до 9.
  • N: Любая цифра от 2 до 9.
  • .: Любое количество любых символов (цифр, букв).
  • [123]: Любая из указанных цифр (1, 2 или 3).

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

  • _XXX: Три любые цифры (например, 123, 456).
  • _NXX: Три цифры, где первая не 0 или 1 (например, 200, 999). Часто используется для внутренних номеров.
  • _1NXXNXXXXXX: Российский формат мобильного номера +7 (9XX) XXX-XX-XX (после 1 идёт 9 и 10 цифр).
  • _X.: Любая цифра, за которой следует любое количество любых символов. Это очень широкий шаблон, будьте осторожны!

Пример использования шаблона:

[internal-phones]
exten => _1XX,1,Dial(PJSIP/${EXTEN}) ; Звонок на внутренние номера 100-199
exten => _1XX,2,Hangup()

Здесь _1XX будет соответствовать номерам от 100 до 199. Переменная ${EXTEN} будет содержать полный набранный номер (например, 101, 155).

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

Экстеншены в FreePBX

В FreePBX вы, как правило, не работаете с extensions.conf напрямую. FreePBX генерирует эти файлы на основе настроек, которые вы вводите через веб-интерфейс.

Например, когда вы создаёте внутренний номер (Extension) в FreePBX, он создаёт соответствующие записи в файлах, таких как extensions_additional.conf (который мы рассмотрим подробнее на следующей странице). FreePBX автоматически определяет контексты, экстеншены и приоритеты для вашей конфигурации.

Чтобы увидеть, как FreePBX формирует диалплан, вы можете использовать команду dialplan show в CLI Asterisk.

asterisk -rx "dialplan show from-internal"

Эта команда покажет вам все экстеншены и их приоритеты в контексте from-internal, который FreePBX использует для внутренних вызовов.

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

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