Пожалуйста, войдите здесь. Часто задаваемые вопросы О нас
Задайте Ваш вопрос

определения события разединения в очереди

0

Весм привет, есть задача: звонит человек, попадает в очередь, нужно делать запись в БД mysql при входящем звонке о том что такой человек звонит(это не проблема), затем если звонящий отключился сам(надоело ждать) то нужно записывать в БД состояние не дозвонился, как это реализовать в очереди? я чето пока не пойму, подскажите люди добрые.

удалить закрыть спам изменить тег редактировать

спросил 2011-02-17 10:55:01 +0400

romariosar Gravatar romariosar flag of Russian Federation
588 93 10 44
http://www.webunix.ru/

3 Ответа

1

Если нужно реалтайм, то для очереди отличное решение AMI. Если поставить в конфигах очереди eventwhencalled=yes то на каждое событие очереди: присоединение к очереди, попытка дозвона до оператора, разъединения и прочее генерится событие. Если не реалтайм то парсинг логов

ссылка удалить спам редактировать

ответил 2011-02-17 11:20:14 +0400

kasper Gravatar kasper
305 3 10

обновил 2011-02-17 11:20:54 +0400

0

можно написать скрипт который евент_лог парсит. выглядит вот так

#!/usr/bin/perl
$| = 1;         
open(DAT, 'last.time') || die("Could not open file!");
$last=<DAT>;
close(DAT);

while ($line = <>) {
     # process $line here 
$line=~s/Local\///;
$line=~s/\@from-queue\/n//;
#print $line;
@input = split(/\|/, $line);
$call_time=$input[0];
if($call_time>=$last){
 open(DAT, '>last.time') || die("Could not open file!");
 print DAT $call_time;
 close(DAT);
 print "select $call_time;\n";
$uniq=$input[1];
$queue=$input[2];
$agent=$input[3];
$ACTION=$input[4];
#create table mon_queue(id serial, queue varchar(10) not null,description varchar(100), ok bigint default 0, not_ok bigint default 0, waiting bigint default 0,avg_wait double);

#create table mon_agent(id serial, agent varchar(10) not null,description varchar(100),ok bigint default 0);
#create table mon_calls(id serial, queue varchar(10),uniq varchar(20));
if($ACTION eq "RINGNOANSWER"){
}elsif($ACTION eq "ENTERQUEUE"){
        print "insert into mon_calls(queue,uniq) values('$queue','$uniq');";
        print "update mon_queue set waiting=waiting+1 where  queue='$queue';\n";
}elsif($ACTION eq "CONNECT"){
        $wait_time=$input[5];
        print "update mon_queue set waiting=waiting-1,ok=ok+1,
                        avg_wait=case when ( (ok+not_ok)= 0) then $wait_time
                         else (avg_wait*(ok+not_ok)+$wait_time)/(ok+not_ok+1) end where  queue='$queue';\n";

        print "delete from mon_calls where uniq='$uniq' and queue='$queue';";
}elsif(($ACTION eq "COMPLETECALLER")||($ACTION eq "COMPLETEAGENT")){
        $time=$input[6];
        if($time eq "0"){# not ok call
                print "update mon_queue set ok=ok-1,not_ok=not_ok+1 where  queue='$queue';\n";

        }else{
                print "update mon_agent set ok=ok+1 where  agent=$agent ;\n";
        }
}elsif($ACTION eq "ABANDON"){
        $wait_time=$input[7];
        print "update mon_queue set waiting=waiting-1,not_ok=not_ok+1,
                        avg_wait=case  when ((ok+not_ok) = 0) then $wait_time
                         else (avg_wait*(ok+not_ok)+$wait_time)/(ok+not_ok+1) end where  queue='$queue';\n";

        print "delete from mon_calls where uniq='$uniq' and queue='$queue';\n";

}
}}
ссылка удалить спам редактировать

ответил 2011-02-18 20:46:41 +0400

meral Gravatar meral flag of Ukraine
23347 24 20 177
http://pro-sip.net/

обновил 2011-02-20 00:30:08 +0400

Comments

литни. ну вот КАК выложить код в этом вопроснике.. ето просто ***** meral ( 2011-02-18 20:47:18 +0400 )редактировать
вобщем если сильно надо разберетесь.. запускается такой скрипт вот так tail -n 100000 -F /var/log/asterisk/queue_log |/root/script/do.pl|/usr/bin/mysql -u user database -ppassword meral ( 2011-02-18 20:49:07 +0400 )редактировать
ну или вписать в перл доступ к базе, но необходимости особой нет. и атк достаточно надежно. meral ( 2011-02-18 20:49:48 +0400 )редактировать
0

ну поставил яэтот параметр, что-то никаких изменения в логах не вижу, как мне определить кто именно отсоединился?

ссылка удалить спам редактировать

ответил 2011-02-17 11:27:40 +0400

romariosar Gravatar romariosar flag of Russian Federation
588 93 10 44
http://www.webunix.ru/

Comments

Непонял о каких логах ты говоришь. Этот параметр нужен что бы очередь генерила событие, которое можно увидеть через ами. А что касается логов очереди то все события очереди туда и без этого параметра попадать должны. Если не ошибаюсь по умолчанию это файлики queue_log. А вот тут описание логов и событий http://www.voip-info.org/wiki/view/Asterisk+log+queue_logkasper ( 2011-02-17 11:38:47 +0400 )редактировать
да в этом логе формат не очень понятный, придется походу скрипт писать, можно както изменить формат вывода в файл? Вроде есть возможность писать лог очереди сразу в mysql, подскажите как это можно делать? romariosar ( 2011-02-17 12:04:13 +0400 )редактировать
Писать в базу можно сделав файл queue_log пайпом (mkfifo) , и сразу же читать его другим скриптом, который в бесконечном цикле все строчки разбивает строку по разделителю "|" и заносит все поля в БД. asteriskguru ( 2011-02-18 21:23:03 +0400 )редактировать
Пайпом, как оказалось, не надежно... switch ( 2011-02-20 06:22:26 +0400 )редактировать

Ваш ответ

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!
[скрыть предварительный просмотр]

Закладки и информация

Добавить закладку

подписаться на rss ленту новостей

Статистика

Задан: 2011-02-17 10:55:01 +0400

Просмотрен: 1,018 раз

Обновлен: Feb 20 '11

Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией GNU GPL.