artem
18.11.2016
3662

Обработка записи вызова после окончания вызова в Asterisk

В Asterisk 11 добавили удобный механизм выполнения действий после завершения вызова – hangup handler, но он будет описан в одной из последующих статей, в этой статье будет использован экстеншен h.Ниже приведён пример простого диалплана, позволяющего делать вызовы на внутренние номера и в очередь с записью вызова.

[default]
exten => _1XX,1,MixMonitor(${EXTEN}_${CALLERID(number)}_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M)}_${UNIQUEID}.wav,ab)
same => n,Dial(SIP/${EXTEN},60,Tt)
same => n,Hangup
exten => 200,1,MixMonitor(${EXTEN}_${CALLERID(number)}_${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M)}_${UNIQUEID}.wav,ab)
same => n,Set(QUEUE_CALL=true)
same => n,Queue(call-center,t,,,300)
same => n,Hangup

После завершения вызовов все записи нужно конвертировать в MP3 для экономии места и переносить на сетевое хранилище, смонтированное в директории /mnt/record_storage, записи вызовов в очередь нужно дополнительно отправлять на почту супервизора supervisor@example.com.
Можно было бы перекодировать, переместить и отправить запись по почте прямо из экстеншена h с помощью приложения System или функции SHELL, но тут возникает две проблемы:
1) Когда экстеншен h начнёт выполняться, Asterisk может не успеть закончить работу с файлом записи, следовательно нужно сделать задержку в несколько секунд перед обработкой файла записи.
2) Канал, на котором происходит завершение вызова, уничтожается в течение 1-2 секунд после завершения вызова, вне зависимости от того, выполнился экстеншен h полностью или нет.
Решить обе проблемы можно с помощью скрипта, который после запуска выполнит fork, затем выполнит ожидание, после чего выполнит обработку файла записи. Ниже приведён пример такого скрипта на bash, скрипт находится в файле /usr/local/bin/process_recording.sh (для перекодировки в MP3 используется lame, для отправки писем используется sendEmail.pl, Asterisk сохраняет записи вызовов в директорию /var/spool/asterisk/monitor).

#!/bin/bash
(
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
AST_REC_DIR=/var/spool/asterisk/monitor
TARGET_DIR=/mnt/record_storage
MAIL_TO=supervisor@example.com
REC_FILE=”$1″
QUEUE_CALL=”$2″
if ! grep -q ” $TARGET_DIR ” <(mount); then
exit 1
fi
if [ “$REC_FILE” == ” ]; then
exit 1
fi
if ! [[ $REC_FILE =~ ^$AST_REC_DIR/.* ]]; then
exit 1
fi
sleep 5
REC_FMT=”${REC_FILE##*.}”
REC_SUBPATH=${REC_FILE##$AST_REC_DIR/}
REC_SUBPATH=${REC_SUBPATH%/*}
if [ “$REC_FMT” == ‘wav’ ]; then
REC_FILE_MP3=”${REC_FILE%.*}.mp3″
rm -f “$REC_FILE_MP3”
date=$(ls –full-time $REC_FILE | awk ‘{print $6,$7}’)
lame -V3 “$REC_FILE” “$REC_FILE_MP3” >/dev/null 2>&1
if [ $? -eq 0 ] && [ -f “$REC_FILE_MP3” ]; then
rm -f “$REC_FILE”
touch -d “$date” “$REC_FILE_MP3”
REC_FILE=”$REC_FILE_MP3″
fi
fi
if [ “$REC_FILE” == ” ]; then
exit 1
fi
if [ “$QUEUE_CALL” != ” ]; then
sendEmail.pl -t “$MAIL_TO” -u “Запись вызова в очередь” -m “Запись вызова в очередь” -o message-charset=UTF-8 -a “$REC_FILE”
fi
! [ -d “$TARGET_DIR”/”$REC_SUBPATH” ] && mkdir -p “$TARGET_DIR”/”$REC_SUBPATH”
yes | cp “$REC_FILE” “$TARGET_DIR”/”$REC_SUBPATH”/
) &
disown -h
exit 0

Теперь делаем вызов скрипта из диалплана, добавляем в приведённый выше контекст default экстеншен h.

exten => h,1,System(/usr/local/bin/process_recording.sh “${MIXMONITOR_FILENAME}” “${QUEUE_CALL}”)
same => n,Hangup

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

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices