Страница 1 из 4

Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 10:20
chardisdze
Добрый день!
Пользуемся оповещением о занятости абонента в таком виде:
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,MacroExit()
т.е. узнаем статус девайса - играем сообщение - узнаем статус девайса - MOH. Следим за двумя статусами в зависимости от марки voip-device.
Требует доработки по использованию двух аргументов - сделаю ;)

Кривовато конечно, но... Работает.

Проблемка в том, что если во время проигрывания файла звонящему, звонящий положит трубку до окончания файла, то у абонента которому звонили не отобразиться пропущенный вызов.

Собственно вопрос: можно ли в execif запускать два приложения одновременно?
типа
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))|Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))exten => s,n,MacroExit()
или
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))&Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))exten => s,n,MacroExit()
Чтоб игралось оповещение и шел звонок (ну в последствии пропущенный вызов)

Или нужно скрипт мастрячить?

Не кидайтесь тапками!!! Направьте в нужном направлении, плиз ;)

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 10:50
ded

Код: Выделить всё

exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Gosub(sub-play-and-set),s,1)

[sub-play-and-set]
exten => s,1,Set(D_OPTIONS=Ttm))
exten => s,n,Playback(custom/V-dannyi-moment-sotrudnik))

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 13:13
chardisdze
Огромное спасибо за решение! Попробую!
И всетаки, так как я описал работать не должно? Не предусмотрено логикой execif запуск двух приложений одновременно?

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 15:19
chardisdze
ded писал(а):

Код: Выделить всё

exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Gosub(sub-play-and-set),s,1)

[sub-play-and-set]
exten => s,1,Set(D_OPTIONS=Ttm))
exten => s,n,Playback(custom/V-dannyi-moment-sotrudnik))

D_OPTIONS=Ttm - не отрабатывает

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 15:37
chardisdze
Извиняюсь. Вызов не туда заруливает.
Выпрыгивает из macro-dial-one после gosub

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 16:00
chardisdze
Подскажите почему выпрыгивает из macro-dial-one при
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Gosub(sub-play-and-set,s,1)
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Gosub(sub-play-and-set,s,1)
exten => s,n,MacroExit()

[sub-play-and-set]
exten => s,1,Set(D_OPTIONS=Ttm)
exten => s,n,Playback(custom/V-dannyi-moment-sotrudnik)
exten => s,n,Return()
вот так
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
pbx.c: Executing [s@macro-dial-one:51] Macro("SIP/XXX-0001a326", "dialout-one-predial-hook,") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:1] NoOp("SIP/XXX-0001a326", "DEVICE STATE - INUSE") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:2] ExecIf("SIP/XXX-0001a326", "1?Gosub(sub-play-and-set,s,1") in new stack
app_macro.c: Channel 'SIP/XXX-0001a326' jumping out of macro 'dialout-one-predial-hook'
app_macro.c: Channel 'SIP/XXX-0001a326' jumping out of macro 'dial-one'
app_macro.c: Channel 'SIP/XXX-0001a326' jumping out of macro 'exten-vm'
pbx.c: Executing [s@sub-play-and-set:1] Set("SIP/XXX-0001a326", "D_OPTIONS=Ttm") in new stack
pbx.c: Executing [s@sub-play-and-set:2] Playback("SIP/XXX-0001a326", "custom/V-dannyi-moment-sotrudnik") in new stack
file.c: <SIP/XXX-0001a326> Playing 'custom/V-dannyi-moment-sotrudnik.slin' (language 'ru')
pbx.c: Executing [s@sub-play-and-set:3] Return("SIP/XXX-0001a326", "") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:3] ExecIf("SIP/XXX-0001a326", "0?Gosub(sub-play-and-set,s,1") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:4] MacroExit("SIP/XXX-0001a326", "") in new stack
app_mixmonitor.c: MixMonitor close filestream (mixed)
app_mixmonitor.c: End MixMonitor Recording SIP/XXX-0001a326
почитать про app_macro.c ?

при
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
[macro-dialout-one-predial-hook]
exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})})
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(custom/V-dannyi-moment-sotrudnik))
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,MacroExit()
вот так отрабатывает
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
pbx.c: Executing [s@macro-dial-one:51] Macro("SIP/XXX-0001a348", "dialout-one-predial-hook,") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:1] NoOp("SIP/XXX-0001a348", "DEVICE STATE - INUSE") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:2] ExecIf("SIP/XXX-0001a348", "1?Playback(custom/V-dannyi-moment-sotrudnik)") in new stack
file.c: <SIP/XXX-0001a348> Playing 'custom/V-dannyi-moment-sotrudnik.slin' (language 'ru')
pbx.c: Executing [s@macro-dialout-one-predial-hook:3] ExecIf("SIP/XXX-0001a348", "1?Set(D_OPTIONS=Ttm)") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:4] ExecIf("SIP/XXX-0001a348", "0?Playback(custom/V-dannyi-moment-sotrudnik)") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:5] ExecIf("SIP/XXX-0001a348", "0?Set(D_OPTIONS=Ttm)") in new stack
pbx.c: Executing [s@macro-dialout-one-predial-hook:6] MacroExit("SIP/XXX-0001a348", "") in new stack
pbx.c: Executing [s@macro-dial-one:52] ExecIf("SIP/XXX-0001a348", "0?Set(D_OPTIONS=tmI)") in new stack
pbx.c: Executing [s@macro-dial-one:53] NoOp("SIP/XXX-0001a348", "") in new stack
pbx.c: Executing [s@macro-dial-one:54] ExecIf("SIP/XXX-0001a348", "0?Set(D_OPTIONS=Ttmg)") in new stack
pbx.c: Executing [s@macro-dial-one:55] Dial("SIP/XXX-0001a348", "SIP/XXY,60,Ttmb(func-apply-sipheaders^s^1)") in new stack
netsock2.c: Using SIP VIDEO TOS bits 136
netsock2.c: Using SIP VIDEO CoS mark 6
netsock2.c: Using SIP RTP TOS bits 184
netsock2.c: Using SIP RTP CoS mark 5

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 16:00
ded
http://asterisk.ru/knowledgebase/Asterisk+cmd+Macro

Код: Выделить всё

[sub-play-and-set]
exten => s,1,Set(__D_OPTIONS=Ttm) ; читаем мануал про наследование переменных
exten => s,n,Playback(custom/V-dannyi-moment-sotrudnik)
exten => s,n,Return()
pbx.c: Executing [s@macro-dialout-one-predial-hook:3] ExecIf("SIP/XXX-0001a348", "1?Set(D_OPTIONS=Ttm)") - тут условие сработало "1
pbx.c: Executing [s@macro-dialout-one-predial-hook:4] ExecIf("SIP/XXX-0001a348", "0?Playback(custom/V-dannyi-moment-sotrudnik)") а тут не сработало "0
chardisdze писал(а):Выпрыгивает из macro-dial-one после gosub
как описано кодом, так и выпрыгивает. А куда ему надо? Разве понятно?

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 16:09
chardisdze
ded, большое спасибо за направление. буду копать. Наткнулся на статью Macro vs Gosub :D Я так понимаю они не друзья ;)

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 16:14
chardisdze
На счет того что условие не сработало: Там 2 состояния девайсов прописано INUSE и RINGINUSE, в зависимости от того какая модель voip аппарата, отрабатывает либо то состояние либо другое.

Re: Использование 2ух приложений одновременно в execif

Добавлено: 26 ноя 2018, 16:22
ded
Тогда проще условие переписать - усложнить
exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE | RINGINUSE "]?Gosub(sub-play-and-set),s,1)