AEL, Gosub и CDR
Сообщений: 12
|
AEL, Gosub и CDR
Здравствуйте.
Частично переходя на AEL, заменил макросы на отдельные контексты, вызывая их командой Gosub. Работает, но наткнулся на путаницу с CDR.
Вызов на трехзначный SIP-телефон (SIP/115), если SIP-телефон не отвечает за 20 секунд - по NOANSWER идет вызов на этот SIP-телефон и определенный сотовый номер. Если SIP-телефон ответит в течение 20 секунд, в CDR(dst) будет верное значение - 115. Если же ответ произойдет после перехода на NOANSWER, в CDR(dst) пишется что-то типа "sw-1082-NOANSWER". Как бы добиться 115 в CDR(dst) даже после перехода на NOANSWER ?
Вызов (из контекста office1, которому принадлежат SIP-телефоны) делается так:
exten => 115,1,Gosub(internalcall-with-redirect-ael,${EXTEN},1(115,2487305))
Пример контекста:
context internalcall-with-redirect-ael {
_XXX => {
Set(TOUCH_MONITOR="${CDR(src)}-${CDR(dst)}");
Set(DENOISE(rx)=on);
Set(DENOISE(tx)=on);
Dial(SIP/${ARG1},20,dgtTW);
switch (${DIALSTATUS}) {
case NOANSWER:
noanswer:
Playback(redirect,noanswer);
Ringing();
Set(CALLERID(num)=3833540662);
Set(CDR(userfield)=3833540662);
Dial(SIP/${ARG1}&H323/sibirtelecom/${ARG2},,TtjgW);
Hangup();
case BUSY:
Playback(busy-cycl0,noanswer);
Goto(${CONTEXT},${ARG1},1);
case CHANUNAVAIL:
Playback(notavail,noanswer);
Hangup();
case CONGESTION:
Playback(busy-cycl0,noanswer);
Goto(${CONTEXT},${ARG1},1);
case ANSWER:
Hangup();
default:
Playback(notavail,noanswer);
Hangup();
};
};
h => {
if ("${ISNULL(${TOUCH_MONITOR_OUTPUT})}" = "1" ) {
Hangup();
} else
NoOp(${ODBC_RECORD(${CDR(src)},${ARG1},${TOUCH_MONITOR_OUTPUT})});
System(${SCRIPTS}/monitor_send.sh ${CDR(src)} ${ARG1} ${TOUCH_MONITOR_OUTPUT} &);
Set(TOUCH_MONITOR_OUTPUT="");
};
};
Лог звонка такой, SIP/115 звонит SIP/116:
-- Executing [115@office1:1] Gosub("SIP/116-00000072", "internalcall-with-redirect-ael,115,1(115,2487305)") in new stack
-- Executing [115@internalcall-with-redirect-ael:1] Set("SIP/116-00000072", "~~EXTEN~~=115") in new stack
-- Executing [115@internalcall-with-redirect-ael:2] NoOp("SIP/116-00000072", "116 115") in new stack
-- Executing [115@internalcall-with-redirect-ael:3] Set("SIP/116-00000072", "TOUCH_MONITOR="116-115"") in new stack
-- Executing [115@internalcall-with-redirect-ael:4] Set("SIP/116-00000072", "DENOISE(rx)=on") in new stack
-- Executing [115@internalcall-with-redirect-ael:5] Set("SIP/116-00000072", "DENOISE(tx)=on") in new stack
-- Executing [115@internalcall-with-redirect-ael:6] Dial("SIP/116-00000072", "SIP/115,20,dgtTW") in new stack
-- Called 115
-- SIP/115-00000073 is ringing
-- Nobody picked up in 20000 ms
-- Executing [115@internalcall-with-redirect-ael:7] Goto("SIP/116-00000072", "sw-1082-NOANSWER,10") in new stack
-- Goto (internalcall-with-redirect-ael,sw-1082-NOANSWER,10)
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:10] Playback("SIP/116-00000072", "redirect,noanswer") in new stack
-- <SIP/116-00000072> Playing 'redirect.slin' (language 'ru')
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:11] Ringing("SIP/116-00000072", "") in new stack
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:12] Set("SIP/116-00000072", "CALLERID(num)=3833540662") in new stack
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:13] Set("SIP/116-00000072", "CDR(userfield)=3833540662") in new stack
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:14] Dial("SIP/116-00000072", "SIP/115&H323/sibirtelecom/2487305,,TtjgW") in new stack
== Using SIP RTP TOS bits 10
-- Called 115
-- Requested transfer capability: 0x00 - SPEECH
-- Called sibirtelecom/2487305
-- SIP/115-00000074 is ringing
-- H323/sibirtelecom-40 is making progress passing it to SIP/116-00000072
-- H323/sibirtelecom-40 is ringing
-- H323/sibirtelecom-40 is ringing
-- SIP/115-00000074 answered SIP/116-00000072
-- Executing [sw-1082-NOANSWER@internalcall-with-redirect-ael:15] Hangup("SIP/116-00000072", "") in new stack
== Spawn extension (internalcall-with-redirect-ael, sw-1082-NOANSWER, 15) exited non-zero on 'SIP/116-00000072'
-- Executing [h@internalcall-with-redirect-ael:1] GotoIf("SIP/116-00000072", "1?2:4") in new stack
-- Goto (internalcall-with-redirect-ael,h,2)
-- Executing [h@internalcall-with-redirect-ael:2] Hangup("SIP/116-00000072", "") in new stack
|
Откуда: SPb
Сообщений: 1307
|
Re: AEL, Gosub и CDR
Jump
dial(local/exten@context/n,,)
заодно можно форкать вызов , выбирая нужный cdr . приятного секаса.
|
Сообщений: 12
|
Re: AEL, Gosub и CDR
а нету способа избежать секаса? Я вот уже пару дней ищу выход из ситуации, пока не вижу.
"форкать вызов , выбирая нужный cdr" - речь про ForkCDR ?
|
Откуда: SPb
Сообщений: 1307
|
Re: AEL, Gosub и CDR
ну да , дебажьте звонок , заставить в нужном плече написать правильный CDR - задача не простая , но выполнимая. Стандартные приемы написания диалплана , где после dial можно было писать switch на DIALSTATUS немного становяться неэфективны , в том и секас . Чтобы правильно писалось dst и src часто приходиться перекидывать вызовы в другие контексты , на что jump и опции Dial . Пробуйте , дебажьте .
Если долго мучаться - что-нибудь получиться.
|
|