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

Правильный CDR(dst) после макроса

Добавлено: 10 апр 2012, 11:42
Pardus
Asterisk 1.8 + FreePBX

Ситуация:
Потребовалось при входящем звонке звонящему проиграть сообщение(только при условии поднятия трубы вызываемого).
Реализовал это через через разрыв каналов.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
направление звонка на оператора: DAHDI/g2/799,30,G(welcome,,1)

[welcome]
exten => s,1,Macro(client-channel)
exten => s,n,Macro(operator-channel)
exten => s,n,Hangup

[macro-operator-channel]
exten => s,1,Set(GLOBAL(operator_channel)=${CDR(channel)})
exten => s,n,Set(CHANNEL(language)=ru)
exten => s,n,Playback(ozhidajte-soedinenija)
exten => s,n,Wait(10)
exten => s,n,Hangup

[macro-client-channel]
exten => s,1,Set(CHANNEL(language)=ru)
exten => s,n,Playback(IVR/welcome_1)
exten => s,n,Set(__TRANSFER_CONTEXT=transfer-custom)
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/${UNIQUEID}_(${STRFTIME(${EPOCH},,%d-%m-%Y)}_${STRFTIME(${EPOCH},,%H-%M)})_SRC(${CDR(src)})-DST(${CDR(dst)}).wav,b) ;
exten => s,n,Bridge(${operator_channel},p)
exten => s,n,Hangup
Ну и следствие в CDR(dst)=s. Как найти реальный dst, понятно(через CUT и CDR(channel)). А вот как потом в dst звонка записать то что найдено?
т.к. CDR(dst) только для чтения.
Можно конечно через sql, но как то не верится что нет решения при помощи *.

Re: Правильный CDR(dst) после макроса

Добавлено: 10 апр 2012, 11:54
Vlad1983
попробовать так
направление звонка на оператора: DAHDI/g2/799,30,G(welcome,799,1)

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

[welcome]
exten => _.,1,Macro(client-channel)
exten => _.,n,Macro(operator-channel)
exten => _.,n,Hangup

Re: Правильный CDR(dst) после макроса

Добавлено: 10 апр 2012, 12:05
Pardus
asterisk сразу в усмерть падает.)
в логах

file.c: Failed to write frame
[Apr 10 13:58:50] WARNING[4599] app_playback.c: ast_streamfile failed on Bridge/DAHDI/i2/799-5dec<ZOMBIE> for IVR/welcome_1

за бугром пишут что создание своего CDR поможет.

[incoming]
exten => _X.,1,Verbose(New call coming in)
exten => _X.,n,Set(CDR(original_dst)=${EXTEN})
exten => _X.,n,Goto(mainmenu,s,1)

на сколько жизнеспособное? А то экспериментировать пока больше не хочется * в работе. и только что я ее ронял)

Re: Правильный CDR(dst) после макроса

Добавлено: 10 апр 2012, 12:18
Vlad1983
если поменять местами
exten => _.,1,Macro(client-channel)
exten => _.,n,Macro(operator-channel)
?

Re: Правильный CDR(dst) после макроса

Добавлено: 10 апр 2012, 12:23
Pardus
а что это даст? просто клиент и оператор пойдут в противоположные контексты.

Re: Правильный CDR(dst) после макроса

Добавлено: 31 мар 2015, 10:57
zzz777z

Re: Правильный CDR(dst) после макроса

Добавлено: 31 мар 2015, 14:27
zzz777z
Использование вместо Macro, команды GoSub решит вашу проблему без модификации CDR.

Re: Правильный CDR(dst) после макроса

Добавлено: 01 апр 2015, 00:42
1g0r
А если что-то типа такого?

[welcome]
exten => s,1,Set(SHARED(REALDSTNUM,${CHANNEL})=${EXTEN});
exten => s,n,Macro(client-channel)
exten => s,n,Macro(operator-channel)
exten => s,n,Hangup

[macro-operator-channel]
exten => s,1,Set(GLOBAL(operator_channel)=${CDR(channel)})
exten => s,n,Set(CHANNEL(language)=ru)
exten => s,n,Playback(ozhidajte-soedinenija)
exten => s,n,Wait(10)
exten => s,n,Hangup

[macro-client-channel]
exten => s,1,Set(CHANNEL(language)=ru)
exten => s,n,Playback(IVR/welcome_1)
exten => s,n,Set(__TRANSFER_CONTEXT=transfer-custom)
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/${UNIQUEID}_(${STRFTIME(${EPOCH},,%d-%m-%Y)}_${STRFTIME(${EPOCH},,%H-%M)})_SRC(${CDR(src)})-DST(${SHARED(REALDSTNAME,${BRIDGEPEER})}).wav,b) ;
exten => s,n,Bridge(${operator_channel},p)
exten => s,n,Hangup

Не уверен что совпадает ${CHANNEL} с {BRIDGEPEER}... надо сравнивать.
А в CDR(dst) ожидается что? Ответивший оператор или набранный экстеншен?