|
|
Страница 1 из 1
|
[ Сообщений: 17 ] |
|
Помогите написать TCL скрипт
Автор |
Сообщение |
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
Привет, коллеги! В языке TCL не силен - могу только читать готовый код. Необходим скрипт, который можно прикрутить к диал-пиру, при звонке на коотоый пользователь будет слышать музыку. Пользуясь своим умением, указанным выше (умением читать готовый код) я выдрал из стандартных скриптов b-ACD кусок кода, отвечающий за проигрывание аудиофайлов и сделал такой скрипт. Звоню на номер 500 и слышу воспроизведение музыкального файла с флешки. но проблема в том, что файлик проигрывается только один раз. А мне нужно его зациклить. Пробовал делать безусловный цикл - система при запуске такого скрипта ругается на рекурсию. Пробовал делать цикл с переменной по счетчику (10 раз проиграть файл мне в принципе, хватит) - но почему-то скрипт либо один раз проигрывает музыку, либо рутер вообще в креш уходит. Помогите написать цикл с условием, например, что трубка еще не положена - значит, играем музычку.. ну или хотя бы чтобы была возможность проиграть музыку n-раз, где n - любая указанная мною, переменная. Можно и на VXML сделать. На чем угодно - лишь бы работало. С VXML у меня вообще все туго. Долблюсь с этим уже месяц - пока безуспешно. Если кому интересно - могу выложить свои наработки скрипта. Но думаю - что делу это не поможет, т.к. скрипт некорректный и только собъет вас с толку. и я уже писал - скрипт не мною написан, а выдраны просто куски когда из B-ACD. Коллеги, очень надеюсь на вашу помощь - уже зашиваюсь просто поднимал тему на сертификейшн.ком - там дали несколько советов, но безуспешно все. вся надежда только на обитателей этого форума Сергей, помоги прилежному слушателю твоих курсов )) С меня пиво - при следующей встрече
|
16 сен 2010, 14:20 |
|
|
705
Зарегистрирован: 01 янв 1970, 03:00 Сообщения: 125
|
А не пробовали так зациклить?
while 1 { bla-bla-bla... }
|
16 сен 2010, 15:18 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
пробовал. почему-то не работает. если условие while не меняется, то вылетает с жалобой на рекурсию, кажется. а если я пытаюсь подставлять там какую-либо переменную со счетчиком, то проигрывается все-равно только один раз. ни кто не может написать готовый скрипт?
|
16 сен 2010, 15:33 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
наверное, имеет смысл все же выложить мои конструкции так быстрей пойдет обсуждение..
|
16 сен 2010, 15:34 |
|
|
imperorr
Зарегистрирован: 01 янв 1970, 03:00 Сообщения: 4519
|
|
16 сен 2010, 16:06 |
|
|
Fedia
Супермодератор
Зарегистрирован: 01 окт 2008, 12:24 Сообщения: 4434
|
Выложи, че есть.
ИОС менял?
2 колхозных решения твоей проблемы: 1. Сделать длинный МП3 файл 2. Сделать несколько одинаковых файлов с разным именем и играть их по очереди. 3. Не делать цикл, а описать явно 10 раз одно и то же
|
16 сен 2010, 18:53 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
Вот такой скрипт: Код: proc init { } {
global param }
proc act_Setup {} { global menuRetries leg setupack leg_incoming leg proceeding leg_incoming leg connect leg_incoming set menuRetries 0 RetryMenu }
proc RetryMenu {} {
global param global timeDigit global menuRetries set menuRetries [expr $menuRetries + 1] if {$menuRetries > 3} { call close } else { media play leg_incoming _bacd_music_on_hold.au } }
proc act_Close {} { call close }
requiredversion 2.0 init
#---------------------------------- # State Machine #---------------------------------- set fsm(any_state,ev_disconnected) "act_Close same_state" set fsm(any_state,ev_session_terminate) "act_Close same_state" set fsm(INIT,ev_setup_indication) "act_Setup same_state" set fsm(GET_TIME,ev_collectdigits_done) "act_GotTime same_state" set fsm(GET_CONFIRM,ev_collectdigits_done) "act_GotConfirm same_state" set fsm(CONFIRMING,ev_media_done) "RetryMenu CONFIRMED" set fsm(CONFIRMED,ev_msg_indication) "act_Msg same_state" set fsm(MSG_GET,ev_msg_indication) "act_MsgReply GET_RECONFIRM" set fsm(GET_RECONFIRM,ev_collectdigits_done) "act_GotReconf CONFIRMED" set fsm(CONFIRMED,ev_media_done) "act_Close same_state" set fsm(CONFIRMED,ev_named_timer) "act_Timer CALLING" set fsm(CALLING,ev_setup_done) "act_SetupDone ANNOUNCING" set fsm(ANNOUNCING,ev_media_done) "act_Close same_state"
fsm define fsm INIT
Как видите, я пытался сделать счетчик от 0 до 3 для переменной menuRetries. Но все-равно проигрывается один раз. Мне кажется, все дело в set fsm. Я не совсем понимаю, как это работает, но есть событие: ev_media_done - оно возникает тогда, когда заканчивается проигрывание аудиофайла. Видимо, надо от этого плясать.. Я пробовал на событие ev_media_done вешать процедуру RetryMenu - не помогало. Дебаг за пару секунд до окончания проигрывания файла выдает: Sep 17 08:47:44.707: //25//AFW_:/AFW_FSM_Drive: FSM no match for (INIT[1],UnknownEvent[25]) а по окончанию: Sep 17 08:48:36.797: //25//AFW_:/AFW_FSM_Drive: FSM no match for (INIT[1],ev_media_done[164]) Странно. Ведь я же в FSM написал что делать по этому событию.. В общем, НИИД ХЕЛП! решение рядом на поверхности! Скрипт в общем, рабочий. Проблема в моем не знании и неумении пользоваться FSM.
|
17 сен 2010, 11:46 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
длинный файл с музыкой не получится сделать - у циски есть определенные ограничения на длинну файлов.
|
17 сен 2010, 12:26 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
удалось с помощью такой конструкции: Код: media play leg_incoming %s2000 _bacd_music_on_hold.au %s500 _bacd_music_on_hold.au _bacd_music_on_hold.au проиграть музыку три раза. Но это, как писал Сергей, колхоз Надо все-таки сделать цикл. Проблему я вроде как решил. Думаю, трех минут музыки более чем достаточно. Но все же это некорректно. Давайте подумаем вместе, как решить вопрос с циклом. Кстати, это решает проблему совместимости ТА линксис 900 серии с CME. Не играет MOH у них широковещательный. В циске развели руками, мол и не должен - не поддерживается. Вот я этим скриптом сделал костыли - MOH играет теперь, но не в цикле. Как будет готов скрипт - напишу подробней решение.
|
17 сен 2010, 12:51 |
|
|
705
Зарегистрирован: 01 янв 1970, 03:00 Сообщения: 125
|
Попробуйте паршифку обновить. У меня бесконечный цикл на tcl работает нормально.
|
17 сен 2010, 14:18 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
gandoshka, можно пример привести? у меня вообще, построение алгоритма правильное? Просто у меня после проигрывания музыки происходит событие ev_media_done и на этом все останавливается
|
17 сен 2010, 15:29 |
|
|
705
Зарегистрирован: 01 янв 1970, 03:00 Сообщения: 125
|
Дык, я вроде уже приводил...
} else { while 1 { media play leg_incoming _bacd_music_on_hold.au } }
|
17 сен 2010, 15:45 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
Написал скрипт такой: proc RetryMenu {} { global param global timeDigit global menuRetries while 1 { media play leg_incoming %s2000 _bacd_music_on_hold.au %s500 _bacd_music_on_hold.au } } После звонка - циска загибается видать реально зацикливается бесконечно, но это тоже неправильно.. Необходимо какое-то условие..
|
17 сен 2010, 16:03 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
как можно замутить что-то типа пока не положена трубка, крутить скрипт? Событие ev_disconnected должно быть. ИОС мне менять некуда - и так уже 15.1Т версия
|
17 сен 2010, 16:05 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
написал цикл с условием: Код: proc RetryMenu {} {
global param global timeDigit global menuRetries while {$menuRetries<3} { set menuRetries [expr $menuRetries + 1] media play leg_incoming %s2000 _bacd_music_on_hold.au %s500 _bacd_music_on_hold.au } } Музыка играет только один раз, после проигрывание происходит событие Код: //25//AFW_:/AFW_FSM_Drive: FSM no match for (INIT[1],ev_media_done[164])
и все - тишина. А по-идее, должна прибавиться единица, провериться условие и снова выполнить скрипт, пока не дойдет до 3х. Странно. Что-то видимо, нужно сделать после события ev_media_done, чтобы продолжилось выполнение скрипта.
|
17 сен 2010, 16:21 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
ну же, коллеги! ни кто ни когда не писал IVR скрипты для кисок? У меня сегодня последний день выполнения задачи
|
20 сен 2010, 08:30 |
|
|
MindGames
Зарегистрирован: 13 апр 2009, 11:00 Сообщения: 138
|
В общем, дело было в простой строчке, которой не хватало: Код: set fsm(INIT,ev_media_done) "RetryMenu same_state" вот работающее решение топика, вроде все лишнее убрал. Если кто может подсказать чего тут еще можно убрать и довести до идеала - то буду рад Код: proc init { } {
global param }
proc act_Setup {} { global menuRetries leg setupack leg_incoming leg proceeding leg_incoming leg connect leg_incoming set menuRetries 0 RetryMenu }
proc RetryMenu {} {
global param global timeDigit global menuRetries
media play leg_incoming _bacd_music_on_hold.au
}
proc act_Close {} { call close }
requiredversion 2.0 init
#---------------------------------- # State Machine #---------------------------------- set fsm(any_state,ev_disconnected) "act_Close same_state" set fsm(any_state,ev_session_terminate) "act_Close same_state" set fsm(INIT,ev_setup_indication) "act_Setup same_state" set fsm(INIT,ev_media_done) "RetryMenu same_state"
fsm define fsm INIT
Музыка играет бесконечно - в течении 15-ти минут слушал - играла Возможно, кому-то пригодится, если тоже столкнется с проблемой совместимости LinkSys 900й серии и Cisco Call Manager Express.
|
20 сен 2010, 12:58 |
|
|
|
Страница 1 из 1
|
[ Сообщений: 17 ] |
|
Кто сейчас на конференции |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1 |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения
|
|
|