Запись разговоров на Asterisk с простым управлением через CLI

Администратор,

Данный документ описывает, как создать систему выборочной записи разговоров на базе Asterisk.

Краткое описание решения


asterisk
Каждый выходящий и исходящий звонок направляется в контекст активации записи разговора, в котором на уровне специального диалплана реализован поиск правил. Для хранения правил записи используется внутренняя база данных Asterisk. Данный подход позовляет:

использовать встроенные функции DB для поиска значений;
использовать консоль Asterisk и команду database для модификации правил.
В базе существуют две ветки:

rec_a - в данной ветке содержатся номера абонента А (callerid), для которых нужно включать запись;
rec_b - соответственно, в этой ветке правила номера абоента Б (dnid).
Пример:

*CLI> database put rec_a 701 1
Updated database successfully
*CLI> database put rec_b 2323956 1
Updated database successfully
*CLI> database show
/rec_a/701                                        : 1
/rec_b/2323956                                    : 1
*CLI>
В вышеприведённом примере было создано два правила. Одно будет писать все звонки от внутреннего пользователя с номером 701, другое будет писать все звонки на номер 2323956. Как можно заметить, используется флаг активности правила - 0 или 1. Это позволяет временно отключать запись без удаления номера из базы.

Формат записи


Записанные файлы пишутся в папку /var/spool/asterisk/monitor в следующем формате:

data/yyyy/mm/dd/hh_MM_ss_a_b_callid, где:
yyyy - год записи;
mm - месяц записи;
dd - день записи;
hh - час начала разговора;
MM - минута начала разговора;
ss - секунда начала разговора;
a - номер обонента a или unknown, если callerid скрыт;
b - номер абонента b;
callid - ID звонка.
Таким образом, название файла несет в себе всю необходимую информацию для поиска нужной записи впоследствии.

При использовании приложений, ведущих собственную сквозную запись разговора можно остановить запись. При осуществлении перевода вызова так же требуется остановить запись разговора в TRANSFER_CONTEXT и начать запись снова.

Диалплан Asterisk


Ниже представлен фрагмент диалплана Asterisk, реализующий описанную выше логику.

extensions.conf:

[global]

[outgoing]
exten => _X.,1,Gosub(sub-recording,${EXTEN},1}
exten => _X.,n,Dial(ZAP/g1/${EXTEN},,t)

[office]
exten => _X.,1,Gosub(sub-recording,${EXTEN},1}
exten => _X.,n,Dial(SIP/${EXTEN},,T)

[sub-recording]
exten => s,1,StopMixMonitor()
exten => _X.,1,Set(CALLER=unknown)
exten => _X.,n,GoToIf($[0${CALLERID(num)} = 0]?db)
exten => _X.,n,Set(CALLER=${CALLERID(num)})
exten => _X.,n(db),GotoIf($[0${DB(rec_a/${CALLERID(num)})} = 01]?record:stop)
exten => _X.,n,GotoIf($[0${DB(rec_b/${EXTEN})} = 01]?record:stop)
exten => _X.,n(record),MixMonitor(data/${STRFTIME(,,%G/%m/%H_%M_%S)}_${CALLER}_${CALLED}.gsm)
exten => _X.,n(stop),Return

Недостатки:


1. Время в названии файла - время поступления вызова, но не начала разговора. Для указания времени начала раговра требуется создание симлинка или переименование после окончания разговора