Логирование звонков 27.04.2011

Эта задача, точнее простота ее решения, вызвала у меня особый восторг. Реализуется все это через множество различных выходных форматов, я выбрал MySQL через ODBC, настройка которого для нашего случая описана здесь.

В терминах астериска, данная функциональность называется CDR (Call Detail Records).

Сначала создаем таблицу в нашей базе

use asterisk;

CREATE TABLE tbl_call_details (
  calldate datetime NOT NULL default '0000-00-00 00:00:00',
  clid varchar(80) NOT NULL default '',
  src varchar(80) NOT NULL default '',
  dst varchar(80) NOT NULL default '',
  dcontext varchar(80) NOT NULL default '',
  channel varchar(80) NOT NULL default '',
  dstchannel varchar(80) NOT NULL default '',
  lastapp varchar(80) NOT NULL default '',
  lastdata varchar(80) NOT NULL default '',
  duration int(11) NOT NULL default '0',
  billsec int(11) NOT NULL default '0',
  disposition varchar(45) NOT NULL default '',
  amaflags int(11) NOT NULL default '0',
  accountcode varchar(20) NOT NULL default '',
  userfield varchar(255) NOT NULL default '',
  uniqueid varchar(32) NOT NULL default '',
  KEY calldate (calldate),
  KEY dst (dst),
  KEY accountcode (accountcode)
);

Настраиваем общие параметры /etc/asterisk/cdr.conf

[general]
; разрешить логирование
enable=yes

; логировать неотвеченные звонки
unanswered = yes

Настраиваем параметры подключения к ODBC /etc/asterisk/cdr_odbc.conf:

[global]
; имя нашего DSN
dsn=asterisk

;логин и пароль
username=asterisk
password=*****

; имя таблицы в базе
table=tbl_call_details

; Сохранять идентификатор
loguniqueid=yes

Перезапускаем asterisk. После этого проверяем, что cdr инициализирован:

asterisk*CLI> cdr show status

Call Detail Record (CDR) settings
— ---------------------------------
  Logging:                    Enabled
  Mode:                       Simple
  Log unanswered calls:       Yes

* Registered Backends
  -------------------
    ODBC
    Adaptive ODBC
    cdr-custom

И, собственно, все. Все звонки логируются. Вы можете проверить это, выполнив SELECT из базы.

На всякий случай – распишу значения полей (а то больно короткая статья получилась :)

  • calldate - дата и время начала звонка;
  • clid – caller id звонящего;
  • src – исходящий номер;
  • dst – набранный номер;
  • dcontext – контекст, в котором произошел набор;
  • channel – исходящий канал;
  • dstchannel – канал-назначение;
  • lastapp – последняя вызванная функция, в основном, думаю, - Dial;
  • lastdata – параметры, переданные последней вызванной функции;
  • duration – продолжительность всего разговора, секунд (сюда входят и гудки ожидания);
  • billsec – время непосредственного разговора, т.е. после снятия трубки;
  • disposition – числовое значение результата звонка (1 – сбой, 2 – занято, 4 – нет ответа, 8 – отвечено, 0 – разрыв связи до ответа);
  • amaflags – статус биллинговой строки (я не очень понял, что это :)
  • accountcode – учетный код, который можно задать в настройках (у меня - пустое);
  • userfield – пользовательское поле (у меня - пустое);
  • uniqueid – уникальный идентификатор.