добрый день!у кого-нить есть примеры иерархических голосовых меню на цискином TCL IVR?
задача - создать факс-сервер на cisco 2811 с такими возможностями:
вход. звонок приходит на циску, играется приветствие
"вы позвонили в фирму Рога и Копыта"
"если хотите отправить факс, нажмите 1"
"или если хотите соединиться с сотрудником, нажмите 2 или оставайтесь на линии"
далее, если звонящий жмет 1, то попадает на меню, реализованную цискиным скриптом
fax_detect_2.1.2.0.tcl, проигрывающего записи
"нажмите внутренний номер абонента и кнопку Старт"
"или дождитесь ответа секретаря"
первая часть реализована на скрипте, любезно предоставленным Xevyk (http://www.opennet.dev/openforum/vsluhforumID6/11941.html)
вторая часть реализована
(как описано http://www.cisco.com/univercd/cc/td/doc/product/software/ios... и http://www.cisco.com/en/US/products/sw/iosswrel/ps1839/produ...) и работает сама по себе.
не получается состыковать обе части вместе - при попадании на циску по тестовому номеру 300 и выборе 1 или 2 получаем тишину, а циска в дебагах пишет что не нашла подходящий диал-пир.
при этом по отдельности звонки на 301 или 302 пишат факсом.
звонок на 300 - играет приветствеи и дает на выбор жать 1 или 2, отдельной конфигурацией проверял что после 1 или 2 нужный номер набирается.
где грабли? подскажите плиз, что исправить...
часть конфига
!
fax receive called-subscriber $d$
fax interface-type fax-mail
mta send server 80.80.106.249 port 25
mta send subject fax2mail from cisco.ccard.ru
mta send filename fax
mta send postmaster fax@ccard.ru
mta send mail-from hostname cisco.ccard.ru
mta send mail-from username $s$
!
application
service test tftp://tftp-server/test.tcl
!
service fax2mail flash:app_faxmail_onramp.2.0.1.3.tcl
!
service faxdetect flash:fax_detect_2.1.2.0.tcl
param prompt tftp://tftp-server/prompts/en/en_default_fax.au
param warning-time 10
param voice-dtmf 1
param fax-dtmf 2
param account-id-method ani
param mode default-fax
!
dial-peer voice 100 mmoip
service fax_on_vfc_onramp_app out-bound
destination-pattern .T
information-type fax
session target mailto:faxtest1@domen.ru
image encoding MH
image resolution super-fine
!
dial-peer voice 101 mmoip
service fax_on_vfc_onramp_app out-bound
destination-pattern 101
information-type fax
session target mailto:faxtest2@domen.ru
image encoding MH
image resolution super-fine
!
! пир для входящих звонков с АТСки
dial-peer voice 300 pots
service test
incoming called-number 300
direct-inward-dial
!
dial-peer voice 301 pots
service fax2mail
answer-address 301
incoming called-number 301
direct-inward-dial
!
dial-peer voice 302 pots
service faxdetect
incoming called-number 302
direct-inward-dial
!
в самом скрипте test.tcl прописано, что если жмем 1, то скрипт набирает 301, а если жмем 2, то
cсам скрипт (cлегка модифицировнный скрипт от Xevyk):
proc init { } {
# Инициализация глобальных статических переменных
puts "\n proc Init start"
global param
global phonePattern
global commercePhone
global customerSupport
infotag set med_language_map 0 ru
infotag set med_location ru 0 tftp://tftp-server/prompts/
infotag set med_location ru 1 tftp://tftp-server/prompts/
infotag set med_language 0
set param(initialDigitTimeout) 10
set param(maxDigits) 1
set phonePattern(1) {[1,2]}
# Телефонные номера служб "по умолчанию"
set commercePhone "301"
set customerSupport "302"
puts "\n proc Init finish"
}
proc init_perCallVars { } {
# Процедура инициализирует глобальные динамические переменные
puts "\n proc Init_perCallVars start"
global PressedKey
global Status
if { [info exists PressedKey] } { unset PressedKey }
if { [info exists Status] } { unset Status }
# Сразу же сбрасываем переменные на всякий случай
puts "\n proc Init_perCallVars finish"
}
proc act_Setup { } {
# Процедура принимает входящий звонок, т.е. снимает трубку
puts "\n proc act_Setup start"
init_perCallVars
leg setupack leg_incoming
leg proceeding leg_incoming
leg connect leg_incoming
Play_Intro_Sound
puts "\n proc act_Setup finish"
}
proc Play_Intro_Sound { } {
# Процедура проигрывает приветствие
puts "\n proc Play_Intro_Sound start"
media play leg_incoming %s500 _hello.au
fsm setstate CHECKENTERED
puts "\n proc Play_Intro_Sound finish"
}
proc SelectMenu { } {
# Процедура проигрывает файл с информацией по номерам и собирает нажатую цифру
puts "\n proc SelectMenu start"
global param
global phonePattern
global PressedKey
global Status
set param(interruptPrompt) true
# Разрешаем прервать звуковой файл
if { [info exists PressedKey] } { unset PressedKey }
if { [info exists Status] } { unset Status }
# Сбрасываем значение переменных если они уже присвоены
media play leg_incoming %s1000 _phones.au
# Файл содержит информации по номерам
leg collectdigits leg_incoming param phonePattern
# Собираем набранные цифры и проверям соответствуют ли они нашему шаблону
puts "\n proc SelectMenu finish"
}
proc CheckEnteredDigit { } {
# Процедура проверяет событие
puts "\n proc CheckEnteredDigit start"
global Status
global PressedKey
set Status [infotag get evt_status]
set PressedKey [infotag get evt_dcdigits]
switch $Status {
"cd_001" {
# НИчего не введено - сработал таймаут
media play leg_incoming _redirect.au
fsm setstate CALLNOTHING
}
#"cd_002" {
#SelectMenu
#fsm setstate CALLCOMES
#}
"cd_005" {
# Сделан корректный выбор - соединяем с требуемым отделом
fsm setstate PLACECALL
act_CallSetup
}
"cd_006" {
media play leg_incoming _wrongMenuPoint.au
# Выбран несуществующий пункт меню
fsm setstate CALLNOTHING
}
"cd_007" {
# Сбор цифры был прерван - пользователь повесил трубку
fsm setstate CALLDISCONNECT
}
}
puts "\n proc CheckEnteredDigit finish"
}
proc act_CallSupport { } {
# После таймаута и проигрывания файла соединяем пользователя с техподдержкой
puts "\n proc act_CallSupport start"
global customerSupport
leg setup $customerSupport callinfo leg_incoming
puts "\n proc act_CallSupport finish"
}
proc act_CallSetup { } {
# Процедура установки звонка
puts "\n proc act_CallSetup start"
global customerSupport
global commercePhone
global PressedKey
set PressedKey [infotag get evt_dcdigits]
switch $PressedKey {
"1" {
leg setup $commercePhone callinfo leg_incoming
}
"2" {
leg setup $customerSupport callinfo leg_incoming
}
default {
media play leg_incoming _wrongMenuPoint.au
fsm setstate CHECKENTERED
}
}
}
proc act_Cleanup { } {
# Процедура завершения звонка
call close
}
requiredversion 2.0
init
# FSM
set ivr_fsm(any_state,ev_disconnected) "act_Cleanup same_state"
set ivr_fsm(CALLCOMES,ev_setup_indication) "act_Setup same_state"
set ivr_fsm(CALLCOMES,ev_collectdigits_done) "CheckEnteredDigit CHECKENTERED"
set ivr_fsm(CALLNOTHING,ev_media_done) "act_CallSupport same_state"
set ivr_fsm(CHECKENTERED,ev_media_done) "SelectMenu CALLCOMES"
set ivr_fsm(PLACECALL,ev_media_done) "act_CallSetup same_state"
set ivr_fsm(CALLDISCONNECT,ev_disconnect_done) "act_Cleanup same_state"
fsm define ivr_fsm CALLCOMES
надеюсь на помощь
если вся эта штука заработает, то в итоге будет очень полезная фича :)