Определение экстеншенов и их приоритетов
Мы уже разобрались, что такое контексты и как они помогают Asterisk организовывать логику обработки вызовов. Теперь давайте углубимся в то, как внутри этих контекстов определяются конкретные действия – экстеншены – и как Asterisk решает, какой из них выполнить, используя приоритеты.
Что такое экстеншен?
Экстеншен (от англ. extension – расширение, добавочный номер) в Asterisk – это набор инструкций, которые выполняются при поступлении вызова, соответствующего определённому шаблону. Проще говоря, это номер или шаблон, на который можно позвонить, и набор команд, которые Asterisk выполнит при звонке на этот номер.
Экстеншен состоит из трёх частей:
- Имя экстеншена (extension): Номер (
100,200), буквенно-цифровой идентификатор (s,i,t) или шаблон (_X.,_NXX). - Приоритет (priority): Целое число, указывающее порядок выполнения команд внутри одного экстеншена. Команды с меньшим приоритетом выполняются первыми.
- Приложение (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()
Здесь:
- Вызов на номер
8800сначала будетAnswer()(принят). - Затем Asterisk
Wait(1)(подождёт 1 секунду). - Проиграет файл
vm-intro(приветствие). - Попытается дозвониться до
operatorиmanagerв течение 20 секунд. - Если никто не ответил, вызов перейдёт на голосовую почту
u8800. - В конце вызов будет
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) ; Это будет приоритет 3t(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 могут быть перезаписаны.