VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы Asterisk без вэб-оболочек и их решения

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

tim77
Сообщения: 21
Зарегистрирован: 09 фев 2012, 15:16

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

Сообщение tim77 »

Доброго времени. Столкнулся с такой задачей. Нужно выполнять AGI скрипт после успешного завершения Dial, т.е. когда DIALSTATUS имеет значение либо CONGESTION, либо CANCEL (если вызов отменили). В обычной ситуации по завершении вызова ничего после DIAL не выполняется, выход из положения нашел в том, что сделал экстеншн h, на который перескакивает вызов после завершения и там все выполняется, но тогда в CDR портится вся статистика, т.е. в поле DST везде пишется h.
Может есть какой то более простой спопоб?
Аватара пользователя
Aven
Сообщения: 798
Зарегистрирован: 28 янв 2011, 16:20

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

Сообщение Aven »

У меня ничего не портится. Какая версия?
Решения телефонии на базе Asterisk || http://it-need.ru
tim77
Сообщения: 21
Зарегистрирован: 09 фев 2012, 15:16

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

Сообщение tim77 »

версия 1.4.21.
Меня интересует, можно ли переходить к продолжению выполнения команд по контексту после завершения DIAL с различными статусами без использования экстеншна h
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение Vlad1983 »

опция Dial
g - Proceed with dialplan execution at the current extension if the destination channel hangs up.

при любых других сценариях (за исключением когда инициатор завершил вызов) всегда переходит на следующий приоритет.
ЛС: @rostel
Аватара пользователя
Obi Van
Сообщения: 340
Зарегистрирован: 03 сен 2010, 11:21

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

Сообщение Obi Van »

tim77
Может пора уже сменить версию на более свежую? Ветки 1.4 и 1.6 уже не поодерживаются, а делать это всё равно рано или поздно, но придётся. Я помню перешёл практически как говорится бескровно. Делал бы это сейчас, когда система в офисе стала куда сложнее, работы (рутины) было бы заметно больше.
tim77
Сообщения: 21
Зарегистрирован: 09 фев 2012, 15:16

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

Сообщение tim77 »

А если мне нужно выполнять что-то даже когда инициатор повесил трубку, то есть статус CANCEL?
Иными словами, инициатор звонит на экстеншн, далее он либо дозванивается, либо нет не важно и по какой причине тоже. В любом случае после того, как команда Dial будет отработана мне нужно анализировать DIALSTATUS и в зависимости от различных значений выполнять те или иные действия.
Пока удалось однозначно это реализовать через h экстеншн, звонки на который перекидываются всегда после завершения Dial, но, как я сказал, в данном случае в cdr таблице в поле dst всегда вместо номера пишется h
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

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

Сообщение Vlad1983 »

у всех нормально у вас h
покажите контекст
ЛС: @rostel
tim77
Сообщения: 21
Зарегистрирован: 09 фев 2012, 15:16

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

Сообщение tim77 »

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

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

Сообщение 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 - тоже не срабатывает
Аватара пользователя
Obi Van
Сообщения: 340
Зарегистрирован: 03 сен 2010, 11:21

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

Сообщение Obi Van »

tim77
Я вас прекрасно понимаю, т.к сам проходил. Пугающая рутина только заберёт время. В новых версиях добавлено куча функционала, но уж никак не убрано. Возможно нечто реализуется несколько по другому. Так что проведите анализ функционала, доки в руки и можно всё перепилить. Более того можно делать это на какой-нибудь тестовой машине и спокойно отладить. :)
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH