Авг 08 2009

Asterisk, маршрутизация звонков.

Как я уже писал в статье Asterisk добавляем SIP клиентов., основной файл настроек, отвечающий за маршрутизацию звонков называется extentions.conf. Разделение маршрутов для разных источников и клиентов можно разграничивать с помощью контекстов, так называются секции диалплана.

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

[dialout]
exten => _.,1,Dial(SIP/provider)

В этом примере exten — с него обязательно начинается описание маршрута.
_. — это регулярное выражение описывает все маршруты.
1 — описываем порядок прохождения по маршруту.
Dial — команда на осуществление исходящего звонка в скобках описывается соответственно тип канала и на какой канал маршрутизировать звонок.

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

[dialout]
exten => _.,1,NoOp("Out Dial")
exten => _.,2,Dial(SIP/provider)
exten => _.,3,Hangup()

Здесь при поступлении звонка попавшего под наш маршрут первым делом выполнится команда NoOp, в соответствии с заданной ей цифре 1, затем выполнится перемаршрутизация звонка с помощью Dial и 3-м вызовет Hangup.

Так же есть возможность задать несколько маршрутов в одном контексте. К примеру для выхода через одного провайдера использовать 8 в начале и через 9-ку для звонков через альтернативного провайдера телефонии. Выглядит это так:

exten => _8.,1,NoOp("Dial out provider 1")
exten => _8.,2,Dial(SIP/provider1)
exten => _8.,3,Hangup)
exten => _9.,1,NoOp("Dial out provider 2")
exten => _9.,2,Dial(SIP/provider2)
exten => _9.,3,Hangup()

Когда создаете контекст следует помнить, что поиск маршрута астериск осуществляет до первого совпадения, то есть если вы сделаете такой контекст:

[dialout]
exten => _.,1,Dial(SIP/provider)
exten => 333,1,Dial(SIP/user1)
exten => 444,1,Dial(SIP/user2)

То при попытке совершить звонок локальному пользователю по 333 или 444, звонок уйдет по первому маршруту, попав под _. и уйдет на провайдера.
Правильно описывать контекст так:

exten => 333,1,Dial(SIP/user1)
exten => 444,1,Dial(SIP/user2)
exten => _.,1,Dial(SIP/provider)

Вообще правило _. нужно использовать очень аккуратно. И желательно использовать более строгие правила.
В правилах можно использовать X — цифры от 0 до 9, Z — цифры от 1 до 9, N — цифры от 2 до 9 или последовательности цифр в квадратных скобках. К примеру для маршрутизации на номер начинающийся на 80 и состоящий из 11 цифр подойдет такое правило:

exten => _80XXXXXXXXX,1,Dial(SIP/provider1)

Подчеркивание в начале правила означает, что правило представляет изх себя регулярное выражение.
Или правило которое говорит маршрутизировать звонки из 7 цифр:

exten => XXXXXXX,1,Dial(SIP/provider1)

В общем тут может быть множество разных вариантов. В зависимости от необходимости.

Добавить в закладки:

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru
  • By Dimitricus, 25.11.2009 @ 16:00

    Доступно обьяснил. Спасибо!а как насчет входящих звонков?

  • By hilik, 25.11.2009 @ 16:21

    А что с входящими? Приходит звонок по любому каналу и обрабатывается в соответствии с extentions.conf, точнее с описанным в нем диалпланом.

Other Links to this Post


Украинская Баннерная Сеть