Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otchet.doc
Скачиваний:
17
Добавлен:
18.03.2015
Размер:
2.48 Mб
Скачать

Обработка ошибочных вводов и времени ожидания

Теперь, когда создание нашего первого голосового меню уже близится к завершению, введем специальные добавочные номера. Во-первых, нам необходим добавочный номер для недействительных вводов; когда абонент нажимает не ту кнопку (например, 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)

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 (статус звонка) значение, соответствующее ситуации невозможности дозвониться на вызываемые номера, и продолжит выполнение следующего приоритета добавочного номера.

Приложение Dial() также позволяет устанавливать связь с удаленной конечной точкой VoIP, которая не была предварительно описана в конфигурационных файлах канала. Вот полный синтаксис такого типа соединения:

Dial(технология/пользователь[:пароль]@удаленный_хост[:порт][/удаленный_добавочный_номер])

В качестве примера можно позвонить на демонстрационный сервер Digium, который использует протокол IAX2, по следующему добавочному номеру:

exten => 500,1,Dial(IAX2/guest@misery.digium.com/s)

Полный синтаксис приложения Dial() для звоноков по каналам Zap немного иной, как показано ниже:

Dial(Zap/[gGrR]канал_или_группа[/удаленный_добавочный_номер])

Например, вот как описывался бы вызов номера 1-800-555-1212 по Zap-каналу под номером 4.

exten => 501,1,Dial(Zap/4/18005551212)

Второй аргумент приложения Dial() - время ожидания, задаваемое в секундах. Если время ожидания задано, Dial() будет пытаться дозвониться по заданным номерам в течение этого количества секунд, а потом перейдет к следующему приоритету добавочного номера. Если время ожидания не задано, Dial() будет дозваниваться на вызываемые каналы до тех пор, пока кто-нибудь не ответит или пока вызывающий абонент не повесит трубку. Введем для нашего добавочного номера время ожидания 10 с:

exten => 123,1,Dial(Zap/1,10)

Если ответ на звонок получен до истечения времени ожидания, связь между каналами устанавливается и диалплан выполнен. Если вызываемый номер просто не отвечает, занят или недоступен по какой-то другой причине, Asterisk задаст переменную DIALSTATUS и перейдет к следующему приоритету добавочного номера.

Давайте применим то, что изучили на данный момент, в другом примере:

exten => 123,1,Dial(Zap/1,10)

exten => 123,n,Playback(vm-nobodyavail)

exten => 123,n,Hangup()

Как видите, этот пример будет воспроизводить звуковой файл vm- nobodyavail.gsm в случае, если звонок остается без ответа.

Третий аргумент Dial() - строка опций. Она может содержать один или более символов, влияющих на поведение приложения Dial(). Список возможных опций слишком велик, чтобы приводить его здесь; рассмотрим лишь самую популярную из них - опцию m. Если указать m в качестве третьего аргумента, вызывающая сторона, пока выполняется дозвон до вызываемого абонента, будет слышать во время ожидания вместо гудков музыку (конечно, если эта музыка сконфигурирована правильно). Чтобы добавить опцию m в наш последний пример, просто изменим первую строку:

exten => 123,1,Dial(Zap/1,10,m)

exten => 123,n,Playback(vm-nobodyavail)

exten => 123,n,Hangup()

Теперь, когда мы научились использовать приложение Dial(), добавочные номера 1 и 2 в диалплане стали бесполезными. Давайте заменим их новыми добавочными номерами, которые позволят внешним абонентам дозваниваться до Джона (John) и Джейн (Jane):

[incoming]

exten =>123,1,AnsweK)

exten =>123,n,Backgгound(enteг-ext-of-peгson)

exten =>123,n,WaitExten()

exten =>1,1,Dial(Zap/1,10)

exten =>1,n,Playback(vm-nobodyavail)

exten =>1,n,Hangup()

exten =>2,1,Dial(SIP/Jane,10)

exten =>2,n,Playback(vm-nobodyavail)

exten =>2,n,Hangup()

exten =>l,1,Playback(pbx-lnvalld)

exten =>l,n,Goto(lncomlng,123,1)

exten =>t,1,Playback(vm-goodbye)

exten =>t,n,Hangup()

Четвертый и последний аргумент приложения Dial() - URL. Если вызываемый канал поддерживает прием URL в момент вызова, заданный URL будет передан (например, если используется IР-телефон, поддерживающий прием URL, этот URL появится на дисплее телефона; аналогично, если используется программный телефон, URL может быть выведен на экран монитора). Этот аргумент применяется очень редко.

Обратите внимание, что второй, третий и четвертый аргументы могут быть опущены. Например, если требуется определить опцию, но при этом вы не собираетесь задавать время ожидания, просто оставьте пропуск на месте аргумента времени ожидания, как в данном примере:

exten => 1,1,Dial(Zap/1,,m)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]