${EXTEN:1:3} - будет возвращена строка 416. ${EXTEN:4:7} - будет возвращена строка 9671111. ${EXTEN:-4:4} - строка будет начинаться с четвертого символа с конца и включает четыре символа, что даст 1111. ${EXTEN:1} - будет возвращено все после первой цифры, 4169671111 (если количество цифр, которое должно быть возвращено, не задано, будет возвращена вся оставшаяся строка). Это очень мощная структура, но большинство из приведенных ее вариантов используются редко. Чаще всего вы будете применять ${EXTEN:1}, чтобы отбросить внешний код доступа.
Активация исходящих вызовов
Теперь, когда мы ознакомились с шаблонами, можно переходить к тому, как обеспечить абонентам возможность осуществлять исходящие звонки. Первое, что мы сделаем, - добавим переменную в контекст [globals], чтобы определить, какой канал будет использоваться для исходящих вызовов:
[globals] JOHN=Zap/1 JANE=SIP/Jane OUTBOUNDTRUNK=Zap/4
Далее добавим в диалплан контекст для исходящих вызовов. Возможно, сейчас вы задаетесь вопросом: «Зачем нужен отдельный контекст для исходящих звонков?» Это делается для того, чтобы иметь возможность управлять тем, какие абоненты имеют право делать исходящие звонки и какого типа могут быть эти звонки. Сначала создадим контекст для локальных вызовов. Не будем отступать от традиций и первой цифрой в наших шаблонах поставим 9, чтобы пользователи для звонка на внешний номер набирали 9: [outbound-local]
exten => _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten => _9NXXXXXX,n,Congestion() exten => _9NXXXXXX,n,Hangup()
Обратите внимание, что цифра 9 на самом деле не обеспечивает выхода на внешнюю линию, как это происходит во многих традиционных системах офисных АТС. После набора цифры 9 в аналоговой линии сразу же пропадет тональный сигнал готовности линии. Если вам хочется, чтобы зуммер продолжался даже после набора цифры 9, добавьте следующую строку (сразу после описания контекста): ignorepat => 9
Согласно данной директиве Asterisk будет продолжать давать тональный сигнал в аналоговую линию даже после набора указанного шаблона. Это не будет работать с телефонами VoIP, поскольку обычно они не передают отдельные цифры номера в систему во время их ввода; они отправляют Asterisk весь номер сразу. К счастью, большинство популярных VoIP-телефо- нов можно настроить на имитацию такой функциональности.
Повторим, что было сделано. Мы добавили глобальную переменную OUTBOUNDTRUNK, которая просто определяет канал, используемый для исходящих вызовов 1. Также был введен контекст для локальных исходя-Это обеспечивает то преимущество, что, если однажды будет принято решение передавать вызовы по какому-то другому каналу, надо будет отредактировать имя канала, заданное как значение переменной OUTBOUNDTRUNK только в контексте [globals], а не менять вручную все ссылки на этот канал по всему диалплану.
щих вызовов. В приоритете 1 с помощью синтаксиса ${EXTEN:1} от набранного добавочного номера отбрасывается цифра 9 и делается попытка дозвониться на этот номер по каналу, указанному переменной OUTBOUNDTRUNK. Если удается дозвониться, абонент соединяется с исходящим каналом. Если вызов заканчивается неудачей (например, канал занят или невозможно набрать номер по какой-то другой причине), вызывается приложение Congestion() (перегрузка), которое воспроизводит «короткие гудки» (тональный сигнал перегрузки линии), сообщая абоненту, что дозвониться не удалось.
Прежде чем двигаться дальше, убедимся, что наш диалплан позволяет выполнять исходящие звонки на номера экстренного вызова:
[outbound-local]
exten => _9NXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten => _9NXXXXXX,n,Congestion() exten => _9NXXXXXX,n,Hangup()
exten => 911,1,Dial(${OUTBOUNDTRUNK}/911)
exten => 9911, 1, Dial (${OUTBOUNDTRUNK}/911) ; Чтобы тот, кто набрал первую "9",
; тоже мог дозвониться
Опять же, в данном примере предполагается, что мы находимся в США или Канаде. Если вы проживаете в другой стране, замените, пожалуйста, 911 номером экстренных служб, используемым в вашем регионе. Это то, о чем ни в коем случае нельзя забывать при создании своего ди- алплана!
Далее добавим контекст для междугородних звонков:
[outbound-long-distance]
exten => _91NXXNXXXXXX,1,Dial(${OUTBOUNDTRUNK}/${EXTEN:1}) exten => _91NXXNXXXXXX,n,Playtones(congestion) exten => _91NXXNXXXXXX,n,Hangup()
Теперь, когда у нас есть два новых контекста, как предоставить возможность внутренним абонентам их использовать? Необходим какой-то способ использовать функциональность одного контекста из другого.
Выражения include
Читать дальше