Порядок выбора нужного екстеншена при использовании шаблонов.

Каждый контекст, определенный в плане набора указывает Asterisk, как обрабатывать телефонные номера, вызовы на которые попадают в данный контекст.

Поскольку у Вас есть возможность использования шаблонов при определении екстеншенов, то вполне вероятна ситуация, при которой вызываемому телефонному номеру может быть сопоставлен не один, а несколько екстеншенов в контексте. Asterisk не будет искать подходящие совпадения с шаблонными екстеншенами в том порядке, что Вы описали в плане набора, т.к. вначале шаблонные екстеншены проходят сортировку. Следовательно, Asterisk может обработать вызов телефонного номера совсем не так, как Вам бы хотелось.

В данном документе описывается, как Asterisk сортирует шаблонные екстеншены и как управлять этим порядком сортировки, чтобы быть уверенным, что Asterisk выберет именно тот екстеншен, который Вам нужен, когда с вызываемым номером могут совпадать два или более шаблонных екстеншенов. Пример проблемы Рассмотрим контекст «example», например, Вам надо, чтобы вызовы на все номера, которые начинаются с 918, проходили через аналоговую телефонную линию, соединенную с интерфейсом Zap/1, а все остальные вызовы проходили через интерфейс Zap/2. Итак, по идее, Вы напишите что-то подобное:

[example]
exten => _918.,1,Dial(Zap/1/${EXTEN})
exten => _.,1,Dial(Zap/2/${EXTEN})
exten => h,1,Hangup

Но такая конструкция не работает как нам надо! Вы обнаружите, что вне зависимости от набранного номера, все вызовы идут через интерфейс Zap/2. Дело в том, что сначала Asterisk сортирует екстеншены, а уже потом ищет первое совпадение. Для того, чтобы увидеть в каком порядке Asterisk производит поиск совпадающего екстеншена, наберите в консоли Asterisk команду: show dialplan example. Вы увидите, что екстеншены отсортированы в следующем порядке:

 1. _.
 2. _918.
 3. h 

Обратите внимание, что этот порядок совсем не тот, что вы определили в файле extensions.conf. В этом списке запись _. является первой, а она подразумевает совпадение с любым набранным номером, включая и номера, которые начинаются с 918. Стоит отметить, что екстеншен h (hangup) также никогда не будет выбран, т.к. он тоже будет совпадать с шаблоном _.

Управление порядком сортировки

Итак, как заставить Asterisk проверять шаблонные екстеншены на совпадения в нужном нам порядке? Как выход - это использовать директиву include, включая в текущий контекст другой контекст, содержащий шаблонные екстеншены. Например:

[example]
include => example-sub
exten => h,1,Hangup
exten => _918.,1,Dial(Zap/1/${EXTEN})

[example-sub]
exten => _.,1,Dial(Zap/2/${EXTEN})

Теперь Asterisk (для контекста «example») будет проверять номер на совпадение в следующем порядке:

   1. _918.
   2. h
   3. _. 

Что в этом случае делает Asterisk:

 1)  Записи exten внутри контекста "example" будут сохранены первыми и,

соответственно, проверяться также будут первыми.

 2)  Включенные контексты каждой директивой include будут сохраняться в порядке их описания. 

Включенные контексты будут проверяться на совпадение в порядке их описания в файле extensions.conf

asterisk_setup

  • asterisk/cf/sorting.txt
  • Последние изменения: 2014/05/14