如何从Asterisk的CDR表(mysql)中提取未应答的呼叫?

时间:2012-02-06 13:33:47

标签: asterisk

我正在尝试制作一个网页,列出来自CDR的未接来电。在来电时,所有软电话和一些手机同时振铃。星号版本是1.8.5。

以下是针对单个 ANSWERED 电话写入CDR表的内容:

╔═════════════════════╦══════╦═════════╦═════╦══════════╦═══════════════════════════╦═══════════════════════════╦═════════╦═══════════════════════╦══════════╦═════════╦═════════════╦══════════╦═════════════╦═══════════╦════════════════╦══════════╗
║      calldate       ║ clid ║   src   ║ dst ║ dcontext ║          channel          ║        dstchannel         ║ lastapp ║       lastdata        ║ duration ║ billsec ║ disposition ║ amaflags ║ accountcode ║ userfield ║    uniqueid    ║ imported ║
╠═════════════════════╬══════╬═════════╬═════╬══════════╬═══════════════════════════╬═══════════════════════════╬═════════╬═══════════════════════╬══════════╬═════════╬═════════════╬══════════╬═════════════╬═══════════╬════════════════╬══════════╣
║ 2012-02-06 12:40:45 ║      ║ 5020971 ║ 595 ║ OUTGOING ║ Local/595@OUTGOING-5d9a;2 ║ SIP/help.desk-000000b8    ║ Dial    ║ SIP/help.desk/595,,Tt ║        8 ║       0 ║ ANSWERED    ║        3 ║             ║           ║ 1328524845.301 ║        0 ║
║ 2012-02-06 12:40:45 ║      ║ 5020971 ║ 599 ║ OUTGOING ║ Local/599@OUTGOING-038b;2 ║ SIP/help.desk-000000b9    ║ Dial    ║ SIP/help.desk/599,,Tt ║        8 ║       0 ║ NO ANSWER   ║        3 ║             ║           ║ 1328524845.303 ║        1 ║
║ 2012-02-06 12:40:44 ║      ║ 5020971 ║ s   ║ to_tech  ║ SIP/help.desk-000000b6    ║ Local/595@OUTGOING-5d9a;1 ║ Queue   ║ TECH,Tt,,,300         ║      111 ║     110 ║ ANSWERED    ║        3 ║             ║           ║ 1328524844.298 ║        0 ║
╚═════════════════════╩══════╩═════════╩═════╩══════════╩═══════════════════════════╩═══════════════════════════╩═════════╩═══════════════════════╩══════════╩═════════╩═════════════╩══════════╩═════════════╩═══════════╩════════════════╩══════════╝

获取未应答呼叫的SQL是:

    SELECT * FROM cdr WHERE disposition = 'NO ANSWER' AND imported='0'

不用说,我通过实际回答的电话得到误报。 :-)

他们只链接我看到NO ANSWER和ANSWERED行之间的时间间隔非常短(并且它们共享相同的src编号)。

现在,在我开始检查是否有一些来自相同号码的ANSWERED呼叫以及接近的时间间隔(例如3秒)之前,我想知道是否有人知道更好的方法来解决这个问题。

我不会说extensions.conf非常流利,实际上我们拨号计划的人早已不见了但我在extensions.conf中注意到了这一点:

[class1]
exten => s,n,SET(CDR(accountcode)=${UNIQUEID})
include => accounts
include => OUTGOING

如果我直截了当,那么扩展线应该将CDR表中的帐户代码字段设置为来电的唯一ID值?无论如何它不起作用,因为帐户代码字段永远不会填入表格。

3 个答案:

答案 0 :(得分:3)

如果我正确地读取该输出,似乎呼叫进入并被放入队列,然后Queue()应用程序将呼叫转移到没有应答的代理(599),因此呼叫是转移到另一个代理人(595),然后接听电话。

此外,似乎每次调用由Queue()应用程序处理时,都会给它一个新的调用ID,因此很难跟踪。

对于Queues的这个特定问题,我建议使用QueueLog功能,该功能可以与SQL集成。然后,您可以在QueueLog表中跟踪调用,并跟踪每个步骤并在QueueLog SQL表中进行传输。

然后可以构造一个SQL查询来将QueueLog表与cdr表连接起来,以查看哪些唯一的调用是未应答的,而不是像您当前那样的情况。

编辑:

可在以下位置找到分步说明:http://www.voip-info.org/wiki/view/Asterisk+queue_log+on+MySQL。然后将队列事件插入到表中,如下所示:

mysql> select * from queue_log;
+----+------------+--------------+------------------+-------+------------+-------+
| id | time       | callid       | queuename        | agent | event      | data  |
+----+------------+--------------+------------------+-------+------------+-------+
| 1  | 1198356717 | 1198356717.0 | voipsolutions.ru | NONE  | ENTERQUEUE | |serg |
| 2  | 1198356719 | 1198356717.0 | voipsolutions.ru | NONE  | ABANDON    | 1|1|2 |
+----+------------+--------------+------------------+-------+------------+-------+

然后,您可以使用此表跟踪队列活动。

希望有所帮助。

答案 1 :(得分:0)

此查询在00:01 am通过电子邮件发送报告

<?php
/* Переменные для соединения с базой данных */ 
$hostname = "localhost"; 
$username = "asteriskcdruser"; 
$password = "asteriskcdrpass"; 
$dbName = "asteriskcdrdb"; 

/* Таблица MySQL, в которой хранятся данные */ 
$cdrtable = "cdr"; 

/* Переменные для определения вчерашней даты */ 
$time = mktime(date('H'), date('i'), date('s'), date('m'), date('d')-1, date('Y'));
$ydate = date("d.m.Y", $time);

/* создать соединение */ 
mysql_connect($hostname,$username,$password) OR DIE("Не могу создать соединение "); 

/* выбрать базу данных. Если произойдет ошибка - вывести ее */ 
mysql_select_db($dbName) or die(mysql_error());

/* запрос данных . номерация у нас трехзначная, поэтому LENGTH(  `src` ) >3, отсекаем исходящие вызовы */ 
$query = "SELECT  `dst` ,  `src` ,  `duration` ,  `dstchannel` ,  `calldate`
      FROM  `cdr`
      WHERE DATE_SUB( CURDATE( ) , INTERVAL 1 DAY ) <=  `calldate`
        AND CURDATE( ) >  `calldate`
        AND  `disposition` =  'NO ANSWER'
        AND LENGTH(  `src` ) >3"; 

/* Выполнить запрос. Если произойдет ошибка - вывести ее. */ 
$res=mysql_query($query) or die(mysql_error());

/* Как много нашлось строк */ 
$number = mysql_num_rows($res); 

/* заголовок письма */ 
$mes="Отчет о пропущенных вызовах за $ydate.\r\n\r\n";

/* готовим текст письма*/ 
if ($number == 0) { 
  $mes .= "Пропущенных вызовов не было"; 
} else { 

  /* Получать по одной строке из таблицы в массив $row, пока строки не кончатся */  
  while ($row=mysql_fetch_array($res)) { 
    $mes .= "   ".$row['calldate'].". От ".$row['src'];
    $mes .= " Абонент ".mb_substr($row['dstchannel'],4,3);
    $mes .= ". Ожидание  ".$row['duration']." сек.\r\n"; 
  } 
}

/* Отправляем письмо */ 
mail('name@domain.com.ua',      $ydate.' Missed calls report', $mes);    
echo "Отчеты были отправлены на почту...";
?> 

答案 2 :(得分:-1)

对于只有未接来电,请使用mysql请求:

SELECT  `src`,`dst` , `duration` ,  `dstchannel` ,  `calldate` 
FROM  `cdr`  
WHERE DATE_SUB( CURDATE( ) , INTERVAL 1 DAY ) <=  `calldate` 
AND CURDATE( ) >  `calldate`
AND  `disposition` =  'NO ANSWER' 
AND LENGTH(  `dst` ) <4 AND LENGTH(  `src` ) >3 ;