ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

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

Сообщение chardisdze » 26 ноя 2018, 11:20

Добрый день!
Пользуемся оповещением о занятости абонента в таком виде:
[Показать] Спойлер:
[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 запускать два приложения одновременно?
типа
[Показать] Спойлер:
[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()

или
[Показать] Спойлер:
[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()


Чтоб игралось оповещение и шел звонок (ну в последствии пропущенный вызов)

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

Не кидайтесь тапками!!! Направьте в нужном направлении, плиз ;)
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение ded » 26 ноя 2018, 11:50

Код: выделить все
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))
ded
 
Сообщений: 15805
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение chardisdze » 26 ноя 2018, 14:13

Огромное спасибо за решение! Попробую!
И всетаки, так как я описал работать не должно? Не предусмотрено логикой execif запуск двух приложений одновременно?
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение chardisdze » 26 ноя 2018, 16:19

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 - не отрабатывает
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение chardisdze » 26 ноя 2018, 16:37

Извиняюсь. Вызов не туда заруливает.
Выпрыгивает из macro-dial-one после gosub
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение chardisdze » 26 ноя 2018, 17:00

Подскажите почему выпрыгивает из macro-dial-one при

[Показать] Спойлер:
[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()


вот так

[Показать] Спойлер:
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 ?

при

[Показать] Спойлер:
[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()


вот так отрабатывает

[Показать] Спойлер:
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
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение ded » 26 ноя 2018, 17:00

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
как описано кодом, так и выпрыгивает. А куда ему надо? Разве понятно?
ded
 
Сообщений: 15805
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение chardisdze » 26 ноя 2018, 17:09

ded, большое спасибо за направление. буду копать. Наткнулся на статью Macro vs Gosub :D Я так понимаю они не друзья ;)
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение chardisdze » 26 ноя 2018, 17:14

На счет того что условие не сработало: Там 2 состояния девайсов прописано INUSE и RINGINUSE, в зависимости от того какая модель voip аппарата, отрабатывает либо то состояние либо другое.
chardisdze
 
Сообщений: 85
Зарегистрирован: 17 июн 2016, 17:18

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

Сообщение ded » 26 ноя 2018, 17:22

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

След.

Вернуться в Вопросы новичков

Кто сейчас на форуме

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

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH