The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"иерархические голосовые меню на TCL IVR на cisco"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Маршрутизаторы CISCO и др. оборудование. (Public)
Изначальное сообщение [ Отслеживать ]

"иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от lisergey email(ok) on 19-Июн-07, 14:24 
добрый день!

у кого-нить есть примеры иерархических голосовых меню на цискином TCL IVR?

задача - создать факс-сервер на cisco 2811 с такими возможностями:
вход. звонок приходит на циску, играется приветствие
"вы позвонили в фирму Рога и Копыта"
"если хотите отправить факс, нажмите 1"
"или если хотите соединиться с сотрудником, нажмите 2 или оставайтесь на линии"

далее, если звонящий жмет 1, то попадает на меню, реализованную цискиным скриптом
fax_detect_2.1.2.0.tcl, проигрывающего записи
"нажмите внутренний номер абонента и кнопку Старт"
"или дождитесь ответа секретаря"


первая часть реализована на скрипте, любезно предоставленным Xevyk (https://www.opennet.ru/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


надеюсь на помощь
если вся эта штука заработает, то в итоге будет очень полезная фича :)

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от an (??) on 19-Июн-07, 19:23 
я тоже ничего не понимаю в 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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от lisergey email(ok) on 20-Июн-07, 12:09 
> Зато очень быстро и наглядно состряпал
>ряд "полезный фишек" на VXML. вот пример НАШЕГО голосового меню с
>функциями автоответчика и автопереключения на факс.

огромное, большое спасибо!!
а как это все в циске "подвязывается" в конфиге???

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от an (??) on 20-Июн-07, 12:24 
>> Зато очень быстро и наглядно состряпал
>>ряд "полезный фишек" на VXML. вот пример НАШЕГО голосового меню с
>>функциями автоответчика и автопереключения на факс.
>
>огромное, большое спасибо!!
>а как это все в циске "подвязывается" в конфиге???

точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от lisergey email(ok) on 20-Июн-07, 12:32 
>точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.

cisco 2811, IOS поддерживает vxml

а можно пример конфига?? плииз
можно в личку (sergey@remove-this-fake.rsu.ru)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от an (??) on 20-Июн-07, 17:28 
>>точно также как и tcl скрипт. Если конечyо IOS поддерживает vxml.
>
>cisco 2811, IOS поддерживает vxml
>
>а можно пример конфига?? плииз
>можно в личку (sergey@remove-this-fake.rsu.ru)

звонок приходит со стороны E1:

application
service mymenu flash:mymenu.vxml

dial-peer voice 20 pots
service mymenu.vxml
destination-pattern 7777777

и еще я коечто добавил на страничке kekalo.narod.ru

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от an (??) on 20-Июн-07, 20:15 

> service mymenu.vxml

.vxml тут лишнее конечно

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от an (??) on 21-Июн-07, 08:57 
>dial-peer voice 20 pots
> service mymenu.vxml
> destination-pattern 7777777

dial-peer voice 25 pots
service mymenu
incoming called-number 7777777

вот так ПРАВИЛЬНО.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от Kirilll email(ok) on 28-Авг-07, 13:53 
>[оверквотинг удален]
>не получается состыковать обе части вместе - при попадании на циску по
>тестовому номеру 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?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "иерархические голосовые меню на TCL IVR на cisco"  
Сообщение от stepan_spb on 23-Мрт-08, 17:46 
Добрый день.
Отлаживаю элемент 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

Кто нить с таким сталкивался?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру