Введение в систему приоритетов, используемых в плане набора Asterisk


Приоритеты команд Asterisk используется в плане набора - файл конфигурации extensions.conf.

Приоритет - это пронумерованные шаги выполнения команд связанные с каждым екстеншеном. Для каждого приоритета определяется одна команда. Обычно, номер приоритета начинается с 1 и последовательно увеличивается на единицу в каждой строке с командой для определенного екстеншена в контексте. Номера приоритетов не всегда номеруются в непрерывной последовательности, но этот случай мы рассмотри позже. А в данный момент, надо запомнить, что для каждого екстеншена Asterisk выполняет команды с приоритетами строго в пронумерованном порядке их следования, а не в том порядке, в котором команды заданы в файле конфигурации.

Пример


exten => 555,1,Answer
exten => 555,2,Playback(tt-weasels)
exten => 555,3,Voicemail(44)
exten => 555,4,Hangup

В данном примере, задан один екстеншен с именем "555". Если поступает вызов на этот екстеншен, Asterisk самостоятельно принимает вызов, проигрывает звуковой файл с именем "tt-weasels", дает возможность пользователю оставить голосовое сообщение для абонента с номером 44 и разрывает соединение.

В данном примере, директива "exten =>" определяет, что в плане набора определяется какая-либо команда.

"555" - это номер, на который поступил вызов (номер вызываемого абонента или "имя екстеншена", который надо вызвать при каком-либо поступающем вызове).

"1", "2", "3", и "4" определяют приоритет, с помощью которых определяется порядок выполнения команд для данного екстеншена.

Обратите внимание, что Asterisk не волнует, в каком порядке вы расположили команды в файле конфигурации extensions.conf. Вы можете располагать их в каком угодно порядке, например как показано ниже, и это никак не скажется на порядке выполнения команд, т.к. Asterisk использует значение поля priority для определения порядка выполнения команд:

exten => 555,4,Hangup
exten => 555,1,Answer
exten => 555,3,Voicemail(44)
exten => 555,2,Playback(tt-weasels)


Приоритет ''n' (Поддерживается с версии 1.2.*)


Вместо ручного назначения номера приоритета для каждого экстеншена (и их ручной перенумерации, если что-то надо добавить или убрать), Вы можете в качестве приоритета использовать символ "n", который обозначает "следующий" приоритет. Каждый приоритет, который задан как "n", будет автоматически учитываться, как следующий номер приоритета или как приоритет с номером N+1, если N - это предыдущий приоритет, если просматривать команды последовательно сверху вниз для этого экстеншена. Раньше, если Вам понадобилось бы вставить команду между третьей и четвертой строкой для экстеншена, который содержит 20 команд с, последовательно назначенными приоритетами, то Вам понадобилось бы вручную перенумеровать все приоритеты для всех команд, после вставленной строки.

Пример


exten => 555,1,Answer
exten => 555,n,Playback(tt-weasels)
exten => 555,n,Voicemail(44)
exten => 555,n,Hangup

Используя приоритеты "n", Мы получаем как минимум две возможности, которые сделают логику нашего плана набора более простой и читабельной.

Первое, что можно делать - это присвоить ""метку"" команде с определенным приоритетом :

exten => s,n(Start),Answer

Это делает план набора более читабельным, т.к. эти метки можно использовать в командах перехода:

exten => s,n,Goto(Start)

Вторая вкусность заключается в том, что можно намного проще определить произвольное смещение от какого-либо приоритета, на прибегая при этом к помощи калькулятора:

exten => s,n+2,Dial(...)

Возможно, это применение кажется по началу непонятным, но вкупе с применением меток, это довольно прелестная вкусность. В типичном плане набора, Asterisk очень часто использует приоритет с относительным смещением "+101", для команд, которые будут выполнены в том случае, если выполнение некоторых команд, типа Dial(), закончится неудачей. Без применения приоритета "n", если Вам будет необходимо что-нибудь изменить в списке команд для этого екстеншена, то поменяется номер приоритета не только у команды Dial(), но и номер приоритета той команды, что находиться со смещением +101 от нее.

Используя приоритет "n", можно в плане набора задать следующую конструкцию:

exten => s,n(MainDial),Dial(...) ; Звоним на нужный нам номер в этом контексте
...
...
exten => s,MainDial+101,Voicemail(u100)

Теперь, если до команды Dial(), с меткой приоритета (MainDial) мы добавим дополнительные инструкции, то нам не будет надобности что-либо менять в приоритетах команд.

Обратите внимание, приоритет со смещением "+101" от какой либо метки также может иметь свою метку:

exten => s,MainDial+101(MainDialNotAnswered),Voicemail(u100)


Ссылки по теме: