Шрифт:
Как следует из его имени, приложение Goto используется для перенаправления вызова в другую часть диалплана. Синтаксис Goto требует передачи в него в качестве аргументов целевого контекста, добавочного номера и приоритета:
exten => 123)n)Goto(к.онтек.ст,добавочныйномер,приоритет)
Теперь давайте применим приложение Goto в нашем диалплане:
[incoming]
exten => 123,1,Answer
exten => 123,n,Background(main-menu)
exten => 1,1,Playback(digits/1) exten => 1,n,Goto(incoming,123,1)
exten => 2,1,Playback(digits/2) exten => 2,n,Goto(incoming,123,1)
Две новые строки (выделенные курсивом) обеспечат возвращение управления над вызовом добавочному номеру 123 после воспроизведения выбранного номера.
Если вы внимательно посмотрите на приложение Goto, то поймете, что в него на самом деле можно передавать один, два или три аргумента. Если передается только один аргумент, Asterisk предположит, что это основной приоритет текущего добавочного номера. Если передано два аргумента, Asterisk будет трактовать их как добавочный номер и приоритет, к которым надо перейти в текущем контексте. В данном примере были переданы все три аргумента для наглядности, но, если бы мы задали только добавочный номер и приоритет, результат был бы аналогичным.
Обработка ошибочных вводов и времени ожидания
Теперь, когда создание нашего первого голосового меню уже близится к завершению, введем специальные добавочные номера. Во-первых, нам необходим добавочный номер для недействительных вводов; когда абонент нажимает не ту кнопку (например, 9 для предыдущего примера), вызов направляется на добавочный номер i. Во-вторых, необходим добавочный номер для обработки ситуаций, когда абонент не производит ввод вовремя (время ожидания по умолчанию - 10 с). Если абонент слишком долго не нажимает кнопку после запуска приложения WaitExten, вызовы направляются на добавочный номер t. Вот как будет выглядеть диалплан после введения этих двух добавочных номеров: [incoming]
exten => 123,1,Answer
exten => 123,n,Background(enter-ext-of-person) exten => 123,n,WaitExten
exten => 1,1,Playback(digits/1)1,1,Playback(digits/1) |
exten => 1,n,Goto(incoming,123,1) |
exten => 2,1,Playback(digits/2) |
exten => 2,n,Goto(incoming,123,1) |
exten => 3,1,Playback(digits/3) |
exten => 3,n,Goto(incoming,123,1) |
exten => i,1,Playback(pbx-invalid) |
exten => i,n,Goto(incoming,123,1) |
exten => t,1,Playback(vm-goodbye) |
exten => t,n,Hangup |
Использование добавочных номеров i и t делает диалплан несколько более надежным и практичным. Но надо сказать, он по-прежнему довольно примитивен, потому что внешние абоненты не имеют возможности соединения с реальным живым человеком. Для этого нам придется ознакомиться с еще одним приложением - Dial (Звонить).
Использование приложения Dial
Одно из самых ценных свойств Asterisk - это возможность установления соединения между разными абонентами. Это особенно полезно, когда абоненты используют разные методы связи. Например, абонент А может звонить по традиционной аналоговой телефонной линии, тогда как пользователь В может сидеть в кафе в другой части света и говорить по IP-телефону. К счастью, большую часть тяжелой работы по установлению соединения и выполнению преобразований между разными сетями Asterisk берет на себя. От вас требуется лишь научиться использовать приложение Dial.
Синтаксис Dial немного сложнее, чем синтаксис приложений, которые применялись до сих пор, но не пугайтесь. Dial принимает четыре аргумента. Первый - получатель вызова. Он состоит (в самой простой форме) из названия технологии (или транспортного протокола), с помощью которой выполняется вызов, символа слэш и имени удаленной конечной точки или ресурса. Самыми широко используемыми типами технологий являются Zap (для аналоговых каналов и каналов T1/E1/ J1), SIP и IAX2. Например, допустим, требуется вызвать конечную точку Zap, определенную как Zap/1, которая представляет собой FXS- канал с подключенным к нему аналоговым телефоном. Технология - Zap, ресурс - 1. Аналогично, для вызова устройства SIP (описанного в sip.conf) получателем вызова может быть SIP/Jane, а для устройства IAX (описанного в iax.conf) - IAX2/Fred. Если бы потребовалось, чтобы при вызове добавочного номера 123 диалплана Asterisk звонил по каналу Zap/1, мы бы ввели следующий добавочный номер: exten => 123,1,Dial(Zap/1)
Также можно звонить по нескольким каналам одновременно, объединяя получателей вызова с помощью символа амперсанда (&):
exten => 123,1,Dial(Zap/1&Zap/2&SIP/Jane) Приложение Dial будет дозваниваться всем заданным получателям вызовов одновременно и установит связь с любым из заданных каналов, который ответит первым. Если приложение не может связаться ни с одним вызываемым абонентом, Asterisk задаст переменной DIALSTATUS (статус звонка) значение, соответствующее ситуации невозможности дозвониться на вызываемые номера, и продолжит выполнение следующего приоритета добавочного номера1.
Приложение Dial также позволяет устанавливать связь с удаленной конечной точкой VoIP, которая не была предварительно описана в конфигурационных файлах канала. Вот полный синтаксис такого типа соединения:
Dial(технология/пользователь[:пароль]@удаленный_хост[:порт][/удаленный_доба- вочный_номер])
В качестве примера можно позвонить на демонстрационный сервер Digium, который использует протокол IAX2, по следующему добавочному номеру:
exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)