Anticisco http://www.anticisco.ru/forum/ |
|
Помогите написать TCL скрипт http://www.anticisco.ru/forum/viewtopic.php?f=7&t=1025 |
Страница 1 из 1 |
Автор: | MindGames [ 16 сен 2010, 14:20 ] |
Заголовок сообщения: | Помогите написать TCL скрипт |
Привет, коллеги! В языке TCL не силен - могу только читать готовый код. Необходим скрипт, который можно прикрутить к диал-пиру, при звонке на коотоый пользователь будет слышать музыку. Пользуясь своим умением, указанным выше (умением читать готовый код) я выдрал из стандартных скриптов b-ACD кусок кода, отвечающий за проигрывание аудиофайлов и сделал такой скрипт. Звоню на номер 500 и слышу воспроизведение музыкального файла с флешки. но проблема в том, что файлик проигрывается только один раз. А мне нужно его зациклить. Пробовал делать безусловный цикл - система при запуске такого скрипта ругается на рекурсию. Пробовал делать цикл с переменной по счетчику (10 раз проиграть файл мне в принципе, хватит) - но почему-то скрипт либо один раз проигрывает музыку, либо рутер вообще в креш уходит. Помогите написать цикл с условием, например, что трубка еще не положена - значит, играем музычку.. ну или хотя бы чтобы была возможность проиграть музыку n-раз, где n - любая указанная мною, переменная. Можно и на VXML сделать. На чем угодно - лишь бы работало. С VXML у меня вообще все туго. Долблюсь с этим уже месяц - пока безуспешно. Если кому интересно - могу выложить свои наработки скрипта. Но думаю - что делу это не поможет, т.к. скрипт некорректный и только собъет вас с толку. и я уже писал - скрипт не мною написан, а выдраны просто куски когда из B-ACD. Коллеги, очень надеюсь на вашу помощь - уже зашиваюсь просто поднимал тему на сертификейшн.ком - там дали несколько советов, но безуспешно все. вся надежда только на обитателей этого форума Сергей, помоги прилежному слушателю твоих курсов )) С меня пиво - при следующей встрече |
Автор: | 705 [ 16 сен 2010, 15:18 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
А не пробовали так зациклить? while 1 { bla-bla-bla... } |
Автор: | MindGames [ 16 сен 2010, 15:33 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
пробовал. почему-то не работает. если условие while не меняется, то вылетает с жалобой на рекурсию, кажется. а если я пытаюсь подставлять там какую-либо переменную со счетчиком, то проигрывается все-равно только один раз. ни кто не может написать готовый скрипт? |
Автор: | MindGames [ 16 сен 2010, 15:34 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
наверное, имеет смысл все же выложить мои конструкции так быстрей пойдет обсуждение.. |
Автор: | imperorr [ 16 сен 2010, 16:06 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Обрудование опиши свое. Может это подойдет. http://www.comptek.ru/box/lab/result_seminars/407 |
Автор: | Fedia [ 16 сен 2010, 18:53 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Выложи, че есть. ИОС менял? 2 колхозных решения твоей проблемы: 1. Сделать длинный МП3 файл 2. Сделать несколько одинаковых файлов с разным именем и играть их по очереди. 3. Не делать цикл, а описать явно 10 раз одно и то же |
Автор: | MindGames [ 17 сен 2010, 11:46 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Вот такой скрипт: Код: 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. |
Автор: | MindGames [ 17 сен 2010, 12:26 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
длинный файл с музыкой не получится сделать - у циски есть определенные ограничения на длинну файлов. |
Автор: | MindGames [ 17 сен 2010, 12:51 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
удалось с помощью такой конструкции: Код: 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 играет теперь, но не в цикле. Как будет готов скрипт - напишу подробней решение. |
Автор: | 705 [ 17 сен 2010, 14:18 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Попробуйте паршифку обновить. У меня бесконечный цикл на tcl работает нормально. |
Автор: | MindGames [ 17 сен 2010, 15:29 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
gandoshka, можно пример привести? у меня вообще, построение алгоритма правильное? Просто у меня после проигрывания музыки происходит событие ev_media_done и на этом все останавливается |
Автор: | 705 [ 17 сен 2010, 15:45 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Дык, я вроде уже приводил... } else { while 1 { media play leg_incoming _bacd_music_on_hold.au } } |
Автор: | MindGames [ 17 сен 2010, 16:03 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
Написал скрипт такой: 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 } } После звонка - циска загибается видать реально зацикливается бесконечно, но это тоже неправильно.. Необходимо какое-то условие.. |
Автор: | MindGames [ 17 сен 2010, 16:05 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
как можно замутить что-то типа пока не положена трубка, крутить скрипт? Событие ev_disconnected должно быть. ИОС мне менять некуда - и так уже 15.1Т версия |
Автор: | MindGames [ 17 сен 2010, 16:21 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
написал цикл с условием: Код: 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, чтобы продолжилось выполнение скрипта. |
Автор: | MindGames [ 20 сен 2010, 08:30 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
ну же, коллеги! ни кто ни когда не писал IVR скрипты для кисок? У меня сегодня последний день выполнения задачи |
Автор: | MindGames [ 20 сен 2010, 12:58 ] |
Заголовок сообщения: | Re: Помогите написать TCL скрипт |
В общем, дело было в простой строчке, которой не хватало: Код: 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. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |