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

Обработка контекста после завершения Dial

Добавлено: 21 мар 2012, 17:39
tim77
Доброго времени. Столкнулся с такой задачей. Нужно выполнять AGI скрипт после успешного завершения Dial, т.е. когда DIALSTATUS имеет значение либо CONGESTION, либо CANCEL (если вызов отменили). В обычной ситуации по завершении вызова ничего после DIAL не выполняется, выход из положения нашел в том, что сделал экстеншн h, на который перескакивает вызов после завершения и там все выполняется, но тогда в CDR портится вся статистика, т.е. в поле DST везде пишется h.
Может есть какой то более простой спопоб?

Re: Обработка контекста после завершения Dial

Добавлено: 21 мар 2012, 21:59
Aven
У меня ничего не портится. Какая версия?

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 10:54
tim77
версия 1.4.21.
Меня интересует, можно ли переходить к продолжению выполнения команд по контексту после завершения DIAL с различными статусами без использования экстеншна h

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:06
Vlad1983
опция Dial
g - Proceed with dialplan execution at the current extension if the destination channel hangs up.

при любых других сценариях (за исключением когда инициатор завершил вызов) всегда переходит на следующий приоритет.

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:14
Obi Van
tim77
Может пора уже сменить версию на более свежую? Ветки 1.4 и 1.6 уже не поодерживаются, а делать это всё равно рано или поздно, но придётся. Я помню перешёл практически как говорится бескровно. Делал бы это сейчас, когда система в офисе стала куда сложнее, работы (рутины) было бы заметно больше.

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:36
tim77
А если мне нужно выполнять что-то даже когда инициатор повесил трубку, то есть статус CANCEL?
Иными словами, инициатор звонит на экстеншн, далее он либо дозванивается, либо нет не важно и по какой причине тоже. В любом случае после того, как команда Dial будет отработана мне нужно анализировать DIALSTATUS и в зависимости от различных значений выполнять те или иные действия.
Пока удалось однозначно это реализовать через h экстеншн, звонки на который перекидываются всегда после завершения Dial, но, как я сказал, в данном случае в cdr таблице в поле dst всегда вместо номера пишется h

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:47
Vlad1983
у всех нормально у вас h
покажите контекст

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:48
tim77
Obi Van писал(а):tim77
Может пора уже сменить версию на более свежую? Ветки 1.4 и 1.6 уже не поодерживаются, а делать это всё равно рано или поздно, но придётся. Я помню перешёл практически как говорится бескровно. Делал бы это сейчас, когда система в офисе стала куда сложнее, работы (рутины) было бы заметно больше.
Согласен, надо переходить, но это довольно сложно уже, т.к. диалплан очень громоздкий и специфичный и так просто не ложится даже на 1.6, не говоря уже про 1.8 и выше.
Думаю перейдем в конце концов, но пока функций 1.4 хватало вполне

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 11:57
tim77
Vlad1983 писал(а):у всех нормально у вас h
покажите контекст
у меня контекст на AEL. Вот кусок.

_5xxx => {

PEER_EXISTS=${EXISTS(${ODBC_AST(SELECT name FROM sip WHERE name=${EXTEN})})};
if(${PEER_EXISTS})
{
redial_number=${ODBC_AST(SELECT number FROM redirects WHERE mailbox=${EXTEN})};
redial_flag=!${ISNULL(${redial_number})};
voicemail=${ODBC_AST(SELECT voicemail FROM redirects WHERE mailbox=${EXTEN})};
email=${ODBC_AST(SELECT email FROM redirects WHERE mailbox=${EXTEN})};

if(${redial_flag})
{
redial_timeout=${ODBC_AST(SELECT timeout FROM redirects WHERE mailbox=${EXTEN})};
}
else
{
redial_timeout=${DEF_TIMEOUT};
};
&record(${EXTEN});

Dial(SIP/${EXTEN},${redial_timeout},tTr); // далее анализ DIALSTATUS если не дозвонились, либо таймаут ожидания вышел

switch("${DIALSTATUS}")
{
case "CHANUNAVAIL":
if(${voicemail}=1)
{
Wait(1);
Playback(ru/ru/vm-theperson);
Playback(ru/ru/vm-isunavail);
Playback(ru/ru/vm-intro);
VoiceMail(s${EXTEN});
}
else
{
if(${redial_flag})
{
goto office|${redial_number}|1;
}
else
{
Wait(2);
Playback(ru/ru/unavilibal);
Playback(ru/ru/try-again);
}
};
break;

case "NOANSWER":
if(${voicemail}=1)
{
Wait(1);
Playback(ru/ru/vm-theperson);
Playback(ru/ru/vm-isunavail);
Playback(ru/ru/vm-intro);
VoiceMail(s${EXTEN});
}
else
{
if(${redial_flag})
{
goto office|${redial_number}|1;

}
else
{
NoOp(Channel not answering);
Wait(2);
Playback(ru/ru/no-answer);
Playback(ru/ru/try-again);
}
};
break;

}
else
{
Wait(2);
Playback(ru/ru/pbx-invalid);
};

};

h => {
PEER_EXISTS=${EXISTS(${redial_number})};
if(${PEER_EXISTS})
{
if(${DIALSTATUS}=NOANSWER||${DIALSTATUS}=BUSY||${DIALSTATUS}=CANCEL||${DIALSTATUS}=CONGESTION)
{DeadAGI(sms.agi,7${redial_number:2},${CALLERID(number)});};
};
};


Если я втыкаю то, что в контексте h после DIAL, то нифига не работает
В данном случае DeadAGI, но я пробовал банальный NoOp - тоже не срабатывает

Re: Обработка контекста после завершения Dial

Добавлено: 22 мар 2012, 12:06
Obi Van
tim77
Я вас прекрасно понимаю, т.к сам проходил. Пугающая рутина только заберёт время. В новых версиях добавлено куча функционала, но уж никак не убрано. Возможно нечто реализуется несколько по другому. Так что проведите анализ функционала, доки в руки и можно всё перепилить. Более того можно делать это на какой-нибудь тестовой машине и спокойно отладить. :)