Как и любая современная АТС, Asterisk имеет свою встроенную систему хранения истории звонков - CDR (Call Detail Record). Она используется для снятия статистики, ведения отчетности, прослушивания вызовов или подсчета биллинговых показателей.
В Asterisk для этого создана база данных asteriskcdrdb, в которой существует таблица cdr. Давайте рассмотрим как пользоваться данной таблицей и ее структуру.
[root@asterisk]# mysql // подключаемся к MySQL
После успешного подключения, необходимо выбрать для работы базу данных asteriskcdrdb:
mysql> use asteriskcdrdb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed
Давайте убедимся, что у нас есть таблица cdr. Выполним это, как указано ниже:
mysql> show tables; +-------------------------+ | Tables_in_asteriskcdrdb | +-------------------------+ | cdr | | cel | +-------------------------+ 2 rows in set (0.00 sec)
На данном этапе мы убедились, что у нас есть база данных asteriskcdrdb, в которой находится таблица cdr. Давайте попробуем посмотреть входящие звонки из города за сегодня (дата написания статьи 18 марта 2016 года), в период с 12:00 до 12:10, т.е за 10 минут:
SELECT `dst` , `src` , `duration` , `calldate` , `recordingfile` FROM `cdr` WHERE `calldate` >= '2016-03-18 12:00:00' AND `calldate` <= '2016-03-18 12:10:00' AND LENGTH( `src` ) >3; +-----+-------------+----------+---------------------+----------------------------------------------------------------+ | dst | src | duration | calldate | recordingfile | +-----+-------------+----------+---------------------+----------------------------------------------------------------+ | 113 | 84991111111 | 140 | 2016-03-18 12:00:36 | external-113-84991111111-20160318-115933-1458291573.157155.wav | | 104 | 89162222222 | 81 | 2016-03-18 12:01:33 | external-104-89162222222-20160318-120133-1458291693.157169.wav | +-----+-------------+----------+---------------------+----------------------------------------------------------------+ 2 rows in set (0.00 sec)
В вышеуказанном примере, в SQL запросе указано LENGTH( `src` ) >3. Столбец ‘src’ – показывает номер звонящего (source - источник). Это сделано для того, чтобы исключить внутренние звонки, так как у нас используется трехзначная нумерация. Тем самым, мы получаем в результате данные, с которыми затем можем работать. Например, отправить на почту в виде отчета. Ниже рассмотрена структура таблицы cdr в базе данных asteriskcdrdb:
Столбец | Пример значения | Описание |
---|---|---|
calldate | 2016-03-18 12:00:36 | Дата и время звонка |
clid | "Oleg Ivanov" <84991111111> | В данное поле попадает полное CallerID (CLID, CID), которое состоит из имени и номера звонящего. Это доступно только для считывания. |
src | 84991111111 | Номер звонящего в конструкции CallerID (CNUM). Это доступно только для считывания. |
dst | 113 | Номер назначения для звонка. Это доступно только для считывания. |
dcontext | CustomContext1 | Контекст для обработки. Это доступно только для считывания. |
channel | SIP/0002B2356854-a34bh3ef | Канал, через который поступил звонок |
dstchannel | SIP/0004F6675969-97836bb0 | Канал, через который ушел исходящий звонок |
lastapp | Dial, Busy, Congestion | Приложение, которое последним отработало этот вызов перед попаданием в таблицу cdr |
lastdata | SIP/0004F6675969,30,tT | Аргумент, который был передан приложению, которое отработало вызов последним (lastapp) |
duration | 75 | Количество секунд от начала (отметка start) до окончания вызова (отметка end) |
billsec | 67 | Количество секунд от ответа (отметка answer) до окончания вызова (отметка end). Данное значение всегда меньше значения duration, и отражает длительность самого разговора, что важно для подсчета стоимости. |
disposition | ANSWERED, BUSY, NO ANSWER, FAILED | Результат звонка |
amaflags | OMIT, BILLING, DOCUMENTATION, Unknown | Метка Automatic Message Accounting (AMA) – автоматический учет стоимости вызова. |
accountcode | 23232 | Идентификатор аккаунта. Данное значение пустое по умолчанию, и определяется параметрами конкретного пользователя. |
uniqueid | 1458291693.157169 | Уникальный идентификатор звонка |
userfield | - | Пользовательское поле. Здесь можно передавать что угодно, добавляя данные в этот столбец при работе с вызовом внутри контекста обработки. |
did | 4996491913 | DID (Direct Inward Dialing). На основании DID вызова на Asterisk осуществляется его маршрутизация (это значение приходит от провайдера). |
recordingfile | external-113-84991111111-20160318-115933-1458291573.157155.wav | Имя файла, содержащего запись разговора. В данном имени можно проследить путь к файлу в файловой структуре сервера. |
cnum | 84991111111 | Номер звонящего в структуре CallerID. |
cnam | Oleg Ivanov | Имя звонящего в структуре CallerID. |
Теперь, когда вы понимаете принцип формирования запросов к базе данных и ее структуру, вы можете без труда формировать собственные отчеты. Например, ежедневный отчет о количестве входящих звонков за текущий день на почту. Это реализуется средствами php скрипта и добавления расписания через cron. Поговорим об этом в следующей статье