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

Skip to end of metadata
Go to start of metadata

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

Данный документ описывает, как создать систему выборочной записи разговоров на базе 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. Время в названии файла - время поступления вызова, но не начала разговора. Для указания времени начала раговра требуется создание симлинка или переименование после окончания разговора

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.