AsteriskのCDRテーブル(mysql)から未応答の呼び出しを抽出するには?

私はCDRからの未応答のコールをリストアップしたWebページを作ろうとしています。着信コールでは、すべてのソフトフォンと一部の携帯電話が同時に呼び出し音を鳴らします。アスタリスクのバージョンは1.8.5です。

CDRテーブルに ANSWERED という1回の呼び出しで書き込まれるものは次のとおりです。

╔═════════════════════╦══════╦═════════╦═════╦══════════╦═══════════════════════════╦═══════════════════════════╦═════════╦═══════════════════════╦══════════╦═════════╦═════════════╦══════════╦═════════════╦═══════════╦════════════════╦══════════╗
║      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/[email protected];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/[email protected];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/[email protected];1 ║ Queue   ║ TECH,Tt,,,300         ║      111 ║     110 ║ ANSWERED    ║        3 ║             ║           ║ 1328524844.298 ║        0 ║
╚═════════════════════╩══════╩═════════╩═════╩══════════╩═══════════════════════════╩═══════════════════════════╩═════════╩═══════════════════════╩══════════╩═════════╩═════════════╩══════════╩═════════════╩═══════════╩════════════════╩══════════╝

応答されない呼び出しを取得するSQLは次のとおりです。

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

言うまでもありませんが、私は実際に応答されるコールで誤検知をしています。 :-)

彼らは、私が見ているだけのリンクは、無回答と答えられた行は、それらの間の非常に短い時間間隔を持っている(そして、彼らは同じsrc番号を共有しています)。

今、私が先に進んで、(3秒のような)近い時間間隔で同じ番号からのいくつかのANSWEREDコールがあるかどうかをチェックする前に、誰かがこれを解決する良い方法を知っているかどうか聞いてみたい。

私はextensions.confを非常にうまく話すわけではありません。私たちのダイヤルプランを実際に配置している人は、ずっと前にいますが、私はextensions.confにこれを気付きました:

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

これをまっすぐにすると、CDRテーブルのaccountcodeフィールドを着信呼のuniqueidの値に設定することになっています。とにかく、accountcodeフィールドは決してテーブルに入力されないので、動作しません。

1

3 答え

その出力を正しく読んでいる場合は、コールが入ってきてキューに入れられたと思われる場合は、Queue()アプリケーションが応答しなかったエージェント(599)にコールを転送したため、コールは別のエージェント(595)は、その後電話に応答しました。

さらに、呼び出しがQueue()アプリケーションで処理されるたびに、新しい呼び出しIDが与えられているため、追跡が非常に困難になっているようです。

キューに関するこの特定の問題については、SQLと統合可能なQueueLog機能を使用することをお勧めします。その後、QueueLogテーブルでコールを追跡し、各ステップを追跡してQueueLog SQLテーブルで転送します。

これにより、QueueLogテーブルをcdrテーブルに結合して、現在持っているような状況ではなく、どのユニークなコールが応答されていないかを調べるSQLクエリを構築することが可能になります。

編集:

ステップバイステップの手順は、 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 |
+----+------------+--------------+------------------+-------+------------+-------+

この表を使用して、キューのアクティビティを追跡できます。

それが助けられたと願っています。

3
追加された
恵比寿:私は答えをより詳細に更新しました。
追加された 著者 ralfe,
通話が着信すると、誰かが応答するまで、または発信者が電話を切るまですべての電話が同時に鳴ります。呼び出し元はこの間に保留中の音楽を聞きます。 30秒ごとに、Asteriskは発信者にあらかじめ録音されたメッセージを通知します。この間、電話は鳴りません。アナウンスの後、すべての電話が再び鳴り始めます。
追加された 著者 Henno,
実際にこれを達成する方法のステップで答えを広げることができれば、非常に高く評価されます。
追加された 著者 Henno,

失敗した呼び出しのみmysql requestを使用します:

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 ;
1
追加された

00:01に電子メールによるレポートのこのクエリ)

<?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('[email protected]',      $ydate.' Missed calls report', $mes);    
echo "Отчеты были отправлены на почту...";
?> 
0
追加された