Сообщения без ответов | Активные темы Текущее время: 28 мар 2024, 16:27



Ответить на тему  [ Сообщений: 17 ] 
Помогите написать TCL скрипт 
Автор Сообщение

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
Привет, коллеги!
В языке TCL не силен - могу только читать готовый код.
Необходим скрипт, который можно прикрутить к диал-пиру, при звонке на коотоый пользователь будет слышать музыку.
Пользуясь своим умением, указанным выше (умением читать готовый код) я выдрал из стандартных скриптов b-ACD кусок кода, отвечающий за проигрывание аудиофайлов и сделал такой скрипт. Звоню на номер 500 и слышу воспроизведение музыкального файла с флешки. но проблема в том, что файлик проигрывается только один раз. А мне нужно его зациклить. Пробовал делать безусловный цикл - система при запуске такого скрипта ругается на рекурсию. Пробовал делать цикл с переменной по счетчику (10 раз проиграть файл мне в принципе, хватит) - но почему-то скрипт либо один раз проигрывает музыку, либо рутер вообще в креш уходит.
Помогите написать цикл с условием, например, что трубка еще не положена - значит, играем музычку.. ну или хотя бы чтобы была возможность проиграть музыку n-раз, где n - любая указанная мною, переменная.
Можно и на VXML сделать. На чем угодно - лишь бы работало. С VXML у меня вообще все туго.
Долблюсь с этим уже месяц - пока безуспешно. Если кому интересно - могу выложить свои наработки скрипта. Но думаю - что делу это не поможет, т.к. скрипт некорректный и только собъет вас с толку. и я уже писал - скрипт не мною написан, а выдраны просто куски когда из B-ACD.
Коллеги, очень надеюсь на вашу помощь - уже зашиваюсь просто :(
поднимал тему на сертификейшн.ком - там дали несколько советов, но безуспешно все.
вся надежда только на обитателей этого форума :)
Сергей, помоги прилежному слушателю твоих курсов :))) С меня пиво - при следующей встрече :)


16 сен 2010, 14:20
Профиль

Зарегистрирован: 01 янв 1970, 03:00
Сообщения: 125
А не пробовали так зациклить?

while 1 {
bla-bla-bla...
}


16 сен 2010, 15:18
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
пробовал. почему-то не работает.
если условие while не меняется, то вылетает с жалобой на рекурсию, кажется. а если я пытаюсь подставлять там какую-либо переменную со счетчиком, то проигрывается все-равно только один раз.
ни кто не может написать готовый скрипт?


16 сен 2010, 15:33
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
наверное, имеет смысл все же выложить мои конструкции :) так быстрей пойдет обсуждение..


16 сен 2010, 15:34
Профиль

Зарегистрирован: 01 янв 1970, 03:00
Сообщения: 4519
Обрудование опиши свое.

Может это подойдет. http://www.comptek.ru/box/lab/result_seminars/407


16 сен 2010, 16:06
Профиль
Супермодератор

Зарегистрирован: 01 окт 2008, 12:24
Сообщения: 4434
Выложи, че есть.

ИОС менял?

2 колхозных решения твоей проблемы:
1. Сделать длинный МП3 файл
2. Сделать несколько одинаковых файлов с разным именем и играть их по очереди.
3. Не делать цикл, а описать явно 10 раз одно и то же


16 сен 2010, 18:53
Профиль

Зарегистрирован: 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
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
длинный файл с музыкой не получится сделать - у циски есть определенные ограничения на длинну файлов.


17 сен 2010, 12:26
Профиль

Зарегистрирован: 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
Профиль

Зарегистрирован: 01 янв 1970, 03:00
Сообщения: 125
Попробуйте паршифку обновить. У меня бесконечный цикл на tcl работает нормально.


17 сен 2010, 14:18
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
gandoshka, можно пример привести?
у меня вообще, построение алгоритма правильное? Просто у меня после проигрывания музыки происходит событие ev_media_done и на этом все останавливается :(


17 сен 2010, 15:29
Профиль

Зарегистрирован: 01 янв 1970, 03:00
Сообщения: 125
Дык, я вроде уже приводил...

} else {
while 1 {
media play leg_incoming _bacd_music_on_hold.au
}
}


17 сен 2010, 15:45
Профиль

Зарегистрирован: 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
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
как можно замутить что-то типа пока не положена трубка, крутить скрипт?
Событие ev_disconnected должно быть.
ИОС мне менять некуда - и так уже 15.1Т версия


17 сен 2010, 16:05
Профиль

Зарегистрирован: 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
Профиль

Зарегистрирован: 13 апр 2009, 11:00
Сообщения: 138
ну же, коллеги!
ни кто ни когда не писал IVR скрипты для кисок?
У меня сегодня последний день выполнения задачи :(


20 сен 2010, 08:30
Профиль

Зарегистрирован: 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
Профиль
Показать сообщения за:  Поле сортировки  
Ответить на тему   [ Сообщений: 17 ] 

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Designed by ST Software for PTF.
Русская поддержка phpBB