Asterisk™: будущее телефонии Второе издание
Шрифт:
В США и Канаде нормы и правила электросвязи довольно похожи (и удобны), поэтому на большинство междугородних номеров можно звонить, используя код страны 1, по разумной цене.
Однако многие даже не догадываются, что NANP используют 19 стран, подчас с очень разными правилами электросвязи. (Более подробную информацию об этом можно найти по адресу http://www.nanpa.com.)
Очень популярно мошенничество с использованием NANP, когда наивных американцев обманным путем заставляют звонить в страны Карибского бассейна по номерам, звонок по которым оплачивается поминутно, как междугородний; абоненты верят, что, если набрать 1-NPA-NXX-XXXX, звонок будет оплачиваться по стандартным национальным
Единственный способ предотвратить такого рода деятельность - блокировать определенные междугородние коды (например, 809) и снимать ограничения только в случае необходимости.
Обратите внимание, что ни один из данных шаблонов не станет обрабатывать междугородние звонки. Скоро мы рассмотрим этот вопрос. Попробуем другой шаблон:
_1NXXNXXXXXX
Данный шаблон немного сложнее. Он соответствует 1, за которой следует код города от 200 до 999, а затем - любой семизначный номер. В зоне действия NANP этот шаблон будет использоваться для сопоставления с любым междугородним номером [75] . Теперь еще более хитрый пример: _011.
75
Те, кто вырос в Северной Америке, возможно, думают, что 1, которую они набирают при звонках по межгороду, - это «международный код». Это неправильно. 1 - это международный код страны для всех стран, использующих NANP. Помните это, если вам когда-нибудь придется давать свой номер телефона кому-то из другой страны. Они могут не знать кода вашей страны и, таким образом, не смогут дозвониться вам, имея только код города и номер телефона. Полный номер телефона с кодом страны записывается так: +1 NPA NXX XXXX (где NPA - код города) - например +1 416 555 1212.
Если, увидев этот шаблон, вы лишь почесали затылок, посмотрите на него еще раз. Заметили точку в конце? Этот шаблон соответствует любому номеру, начинающемуся с 011 и имеющему по крайней мере еще одну цифру. В NANP это соответствует международному телефонному номеру. (Мы будем использовать эти шаблоны в следующем разделе для добавления в наш диалплан возможностей выполнения исходящих звонков.)
Использование переменной канала ${EXTEN}
Мы знаем, о чем вы думаете... Вы сидите и задаете себе вопрос: «Так что же делать, если я хочу использовать сопоставление с шаблонами, но мне надо знать, какие цифры набираются?» К счастью, у Asterisk есть ответ. При каждом звонке на добавочный номер Asterisk сохраняет набранный номер в переменной канала ${EXTEN}. Чтобы протестировать ее, можно использовать приложение SayDigits:
exten => _XXX,1,SayDigits(${EXTEN})
В этом примере приложение SayDigits будет воспроизводить для вас набранный вами трехзначный добавочный номер.
Часто переменную ${EXTEN} удобно использовать для удаления определенного количества цифр в начале добавочного номера. Это осуществляется с помощью синтаксиса ${EXTEN:x}, где x - разряд, с которого должна начинаться возвращаемая строка, считая слева направо. Например, если значение EXTEN - 95551212, ${EXTEN:1} равно 5551212. Рассмотрим другой пример:
exten => _XXX,1,SayDigits(${EXTEN:1})
В этом примере приложение SayDigits начнет воспроизведение со второй цифры, таким образом, будут воспроизведены только две последние цифры набранного добавочного номера.
Более сложные операции с номерами
Полный синтаксис переменной ${EXTEN} - ${EXTEN: x: у}, где x - начальное положение, а у - количество цифр, которое должно быть возвращено. Пусть задана
94169671111
Используя конструкцию ${EXTEN:x:y}, можно извлечь следующие цифровые строки:
${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 (перегрузка), которое воспроизводит «короткие гудки» (тональный сигнал перегрузки линии), сообщая абоненту, что дозвониться не удалось.