добрый день!у кого-нить есть примеры иерархических голосовых меню на цискином TCL IVR?
задача - создать факс-сервер на cisco 2811 с такими возможностями:
вход. звонок приходит на циску, играется приветствие
"вы позвонили в фирму Рога и Копыта"
"если хотите отправить факс, нажмите 1"
"или если хотите соединиться с сотрудником, нажмите 2 или оставайтесь на линии"далее, если звонящий жмет 1, то попадает на меню, реализованную цискиным скриптом
fax_detect_2.1.2.0.tcl, проигрывающего записи
"нажмите внутренний номер абонента и кнопку Старт"
"или дождитесь ответа секретаря"
первая часть реализована на скрипте, любезно предоставленным Xevyk (http://www.opennet.me/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 customerSupportinfotag 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 0set 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 Statusif { [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_incomingPlay_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 Statusset 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 PressedKeyset 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 PressedKeyset 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
надеюсь на помощь
если вся эта штука заработает, то в итоге будет очень полезная фича :)
я тоже ничего не понимаю в TCL. зная некоторое количество всяких языков, TCL так и не освоил. Зато очень быстро и наглядно состряпал ряд "полезный фишек" на VXML. вот пример НАШЕГО голосового меню с функциями автоответчика и автопереключения на факс.<?xml version="1.0"?>
<vxml version="2.0" base="flash:mymenu.vxml"><var name="number" expr="'phone://8117200'"/>
<var name="aons" expr="session.connection.remote.uri"/><form id="main">
<property name="timeout" value="2s"/>
<catch event="noinput"> <goto next="#sek"/> </catch>
<catch event="nomatch"> <goto next="#bad"/> </catch>
<catch event="com.cisco.fax.cng"> <goto next="#fax"/> </catch>
<block> <prompt>
<audio src="flash:beep.wav"/>
<audio src="flash:mymenu.wav"/>
</prompt> </block>
<field name="num">
<grammar type="application/grammar+regex">2[0-9][0-9]</grammar>
<filled>
<assign name="number" expr="'phone://8117'+num"/>
<prompt> <audio src="flash:soed.wav"/></prompt>
<goto next="#transfer"/>
</filled>
</field>
</form>
<form id="sek">
<block>
<prompt> <audio src="flash:sekretar.wav"/></prompt>
<assign expr="'phone://8117230'" name="number"/>
<goto next="#transfer"/>
</block>
</form>
<form id="fax">
<transfer name="mycall" dest="phone://8117234" bridge="false"> </transfer>
</form><form id="bad">
<block>
<prompt> <audio src="flash:nneverno.wav"/> </prompt>
<goto next="#sek"/>
</block>
</form>
<form id="transfer">
<transfer name="mycall" connecttimeout="30s" destexpr="number" bridge="true">
<filled>
<if cond = "mycall == 'busy'">
<prompt> <audio src="flash:zanyat.wav"/> </prompt>
<goto next="#sek"/><elseif cond = "mycall == 'network_busy'"/>
<prompt> <audio src="flash:zanyat.wav"/> </prompt>
<goto next="#sek"/><elseif cond = "mycall == 'noanswer'"/>
<goto next="#ao"/>
</if>
</filled>
</transfer>
</form>
<form id="ao"><catch event="noinput">
<submit expr="'http://..../cgi-bin/gmail.cgi?aon=' + aons + '-' + number" namelist="audio" method="post" enctype="multipart/form-data" />
</catch>
<catch event="telephone.disconnect.hangup">
<submit expr="'http://..../cgi-bin/gmail.cgi?aon=' + aons + '-' + number" namelist="audio" method="post" enctype="multipart/form-data" />
</catch>
<record name="audio" maxtime="180s" beep="true" finalsilence="3s">
<prompt>
<audio src="flash:ao.wav"/>
<audio src="flash:beep.wav"/>
</prompt>
<filled>
<submit expr="'http://.../cgi-bin/gmail.cgi?aon=' + aons + '-' + number" namelist="audio" method="post" enctype="multipart/form-data" />
</filled>
</record>
<block> <exit/> </block>
</form>
</vxml>помоему куда понятнее TCL :) подробнее скоро вероятно выложу на http://kekalo.narod.ru
> Зато очень быстро и наглядно состряпал
>ряд "полезный фишек" на VXML. вот пример НАШЕГО голосового меню с
>функциями автоответчика и автопереключения на факс.огромное, большое спасибо!!
а как это все в циске "подвязывается" в конфиге???
>> Зато очень быстро и наглядно состряпал
>>ряд "полезный фишек" на VXML. вот пример НАШЕГО голосового меню с
>>функциями автоответчика и автопереключения на факс.
>
>огромное, большое спасибо!!
>а как это все в циске "подвязывается" в конфиге???точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.
>точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.cisco 2811, IOS поддерживает vxml
а можно пример конфига?? плииз
можно в личку (sergey@remove-this-fake.rsu.ru)
>>точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.
>
>cisco 2811, IOS поддерживает vxml
>
>а можно пример конфига?? плииз
>можно в личку (sergey@remove-this-fake.rsu.ru)звонок приходит со стороны E1:
application
service mymenu flash:mymenu.vxmldial-peer voice 20 pots
service mymenu.vxml
destination-pattern 7777777и еще я коечто добавил на страничке kekalo.narod.ru
> service mymenu.vxml.vxml тут лишнее конечно
>dial-peer voice 20 pots
> service mymenu.vxml
> destination-pattern 7777777dial-peer voice 25 pots
service mymenu
incoming called-number 7777777вот так ПРАВИЛЬНО.
>[оверквотинг удален]
>не получается состыковать обе части вместе - при попадании на циску по
>тестовому номеру 300 и выборе 1 или 2 получаем тишину, а
>циска в дебагах пишет что не нашла подходящий диал-пир.
>
>при этом по отдельности звонки на 301 или 302 пишат факсом.
>звонок на 300 - играет приветствеи и дает на выбор жать 1
>или 2, отдельной конфигурацией проверял что после 1 или 2 нужный
>номер набирается.
>
>где грабли? подскажите плиз, что исправить...Грабли в том что дальше Циска после того как попадает на пир с IVR тобишь 300, ищет не диал пир с полем Incoming called number а с полем destination Pattern но если в пирах с номерами 301, 302 сделать соответствующие изменения пахать не будет, сам проверял.
И тут же вопрос,
Че конкретно делает апликация fax_detect_2.1.2.0.tcl и если можно скрипт ? Это не одно ли и то же что faxmail_onramp?
Добрый день.
Отлаживаю элемент transfer vxml скипта:<form id="xfer">
<transfer name="mycall" dest="phone://7777777" transferaudio="tftp://xx.x.xxx.xx/vxml/wav/hold.wav" connecttimeout="10s" bridge="true">
<audio src="tftp://xx.x.xxx.xx/vxml/wav/soed.wav"/><filled>
<log>TRANSFER RETURNED: <value expr="mycall"/></log>
</filled>
</transfer>
<block> <log>TRANSFER END</log> </block>
</form>Файл hold.wav длительностью 30 сек.
Звонок проходит. Всё ок, но вот если настанет таймаут 10сек, алерт как положенно прекращается, а музычка продолжает играть. По окончании музычки наступает тишина и в лог вываливается это:CALL_ERROR; tftp://xx.x.xxx.xx/vxml/xfer.vxml
wrong event, async_status 80020000при этом звонящий продолжает оставатся на линии.
IOS: c3640-ik9o3s-mz.124-19.bin
Кто нить с таким сталкивался?