Полезные фичи Asterisk IP-PBX
Сергей «grinder» Яремчук (grinder@ua.fm, )
Возможности сервера IP-PBX Asterisk не ограничиваются лишь обслуживанием звонков клиентов. В зависимости от характера деятельности организации, в которой будет использоваться Asterisk, могут понадобиться и некоторые другие его возможности. Например, в службе поддержки не лишней будет функция перехвата или перенаправления звонков, а использование голосовой почты поможет всегда «отвечать» на звонки клиентов. И это далеко не все, что может этот сервер.
Содержание:
Слушать гудки, пока абонент не снял трубку, невероятно скучно. Чтобы немного снять напряжение, можно установить мелодию, которая будет проиграна вместо гудков. В Asterisk в качестве источника звука можно использовать WAV, MP3, UL, RAW и другие файлы и даже потоковое аудио. Формат WAV в версии 1.4.x используется по умолчанию и является предпочтительным, так как отнимает меньше системных ресурсов. Учитывая нагрузку на канал и качество связи, 8 бит часто вполне достаточно, использовать файлы с лучшим качеством не стоит. В ранних версиях для воспроизведения MP3 файлов необходимо было установить mpg123. Сейчас разработчики Asterisk отказались от его использования, и теперь для поддержки MP3 достаточно установить пакет asterisk-addons. Будем считать, что мелодии подготовлены, открываем файл /etc/asterisk/musiconhold.conf и создаем новый класс, состоящий из нескольких директив:
$ sudo mcedit /etc/asterisk/musiconhold.conf
[none]
mode=files
directory=/dev/null
[default]
mode => files
directory => /var/lib/asterisk/moh
random=yes
Первый класс, обозначенный «none», будет использоваться для обеспечения тишины при помощи Music On Hold (MON). Второй описывает ресурс для MON. В нем мы указали режим воспроизведения файлов, каталог, в котором находится музыка, и установили случайное воспроизведение. Если файлы имеют специфический формат, который не может воспроизвести Asterisk, или хочется задействовать потоковое аудио, полученное с Shoutcast или подобного сервера, дополнительно необходимо использовать директиву «application». Например, MP3 с потокового сервера можно воспроизвести, добавив такие строки:
mode=custom
application=/usr/local/bin/mpg123 -q -r 8000 -f 8192 -s --mono
http://shoutserver:8000/
В качестве аргумента в «application» можно использовать и скрипты, умеющие воспроизводить музыку в определенном формате. Теперь в нужных секциях extensions.conf прописываем параметры MOH:
$ sudo mcedit /etc/asterisk/extensions.conf
[default]
; Устанавливаем класс для MON
exten => s,1,SetMusicOnHold(default)
[local]
; Первым делом указываем обязательное использование Answer
exten => 6000,1,Answer
exten => 6000,2,MusicOnHold()
; Создаем макрос для отключения MOH
[macro-nomusic]
exten => s,1,NoOp()
exten => s,2,SetMusicOnHold(none)
; Используем его для отключения при соединении по IAX
[outgoing]
exten => 7020,1,NoOp(Dial -> IAX2/outbound/${EXTEN})
exten => 7020,n,Dial(IAX2/outbound/${EXTEN},,M(nomusic))
exten => 7020,n,Hangup
В каждом диалплане можно использовать свой класс MON и вешать трубку по истечении определенного времени. Например, так:
exten => 5000,2,SetMusicOnHold(myclass)
exten => 5000,3,WaitMusicOnHold(20)
exten => 5000,4,Hangup
Здесь варианты реализации зависят от твоей фантазии. Да, и не забывай перезапускать Asterisk после изменений в конфигурации:
$ sudo asterisk -r CLI> reload
Asterisk может работать как система, автоматически распределяющая поступающие вызовы (ACD – Automatic Call Distribution). В службах поддержки это очень полезная возможность. Пользователь звонит на один из номеров, а на звонок отвечает свободный в данное время сотрудник. Реализуется такая функциональность при помощи агентов, которые активируются в системе, используя специальную процедуру, и делают себя доступными для приема вызовов. Агенты определяются в файле agents.conf:
$ sudo mcedit /etc/asterisk/agents.conf
[general]
; Сохранение статуса агентов в локальной базе (не требует повторной его регистрации в случае перезагрузки сервера)
persistentagents=yes
; Разрешение/запрет привязки нескольких агентов к одному экстешну
;multiplelogin=yes
[agents]
; Количество неудачных регистраций агента перед отказом
; maxlogintries=3
; Разрешение отключения агента, если трубка в течение указанного времени не снята (в секундах)
autologoff=15
; Отключаем обязательное нажатие кнопки # при регистрации агента
ackcall=no
; Время (в мс) между отключением и повторным вызовом агента (например, чтобы пользователь успел заполнить отчет)
wrapuptime=5000
; Класс MOH
musiconhold=default
; Звуковой сигнал, проигрываемый для подключенных агентов
custom_beep=beep
; Звуковой файл, проигрываемый при отключении агента
;agentgoodbye => vm-goodbye
; Членство в группах для агентов, используется в queues.conf
; group=1,2
; Далее описывается запись разговоров агентов; эта секция является глобальной для канала агентов chan_agent; включение записи (по умолчанию выключена)
;recordagentcalls=yes
; Формат файла: wav (по умолчанию), gsm, wav49
;recordformat=gsm
; Строка, добавляемая к имени при записи, позволяет формировать URL
;urlprefix=http://localhost/calls/
; По умолчанию записи сохраняются в /var/spool/asterisk/monitor, каталог можно изменить
;savecallsin=/var/calls
; Описание агентов в виде agent => agentID,agentPassword,имя
agent => 3001,1234,Vasja Pupkin
agent => 3002,2345,Serg Grinder
Но следует помнить, что номера телефонов и ID агента это не одно и то же. В Asterisk агенты не привязаны к одному номеру и могут подключаться с любых номеров, то есть агент – как бы еще один виртуальный телефон. Кстати, эту фичу можно использовать и в том случае, когда сотрудники постоянно перемещаются. Привязав к каждому сотруднику агента, можно всегда его «поймать», вне зависимости от того, какой телефон он сейчас использует. Применение агентов не снимает необходимости в создании записи для регистрации телефона в sip.conf и экстешна в extensions.conf. При поступлении входящего звонка Asterisk поднимает трубку, переводя вызов в отвеченное состояние. Если все номера заняты, использование MOH может немного развлечь звонящего, скрасив тоскливые минуты ожидания.
Очереди для обработки вызовов определены в файле queues.conf, а имена очередей вызовов используются в качестве аргумента Queue в extensions.conf. В queues.conf все можно оставить по умолчанию, достаточно добавить в конце файла описание новой очереди:
$ sudo mcedit /etc/asterisk/queues.conf
[MyQueue]
; Персональный MOH, используется, если нет musiconhold в agents.conf
; musicclass = default
; Поиск свободного агента
strategy=ringall
timeout=15
retry=5
; Вес очереди
weight=0
wrapuptime=15
; Максимальное количество абонентов в очереди (без ограничений)
maxlen = 0
; Когда объявлять о приблизительном времени ожидания или позиции абонента в очереди (0 – выкл)
announce-frequency = 0
; Включение в анонсы времени ожидания абонента (yes|no|once)
announce-holdtime = no
; Описание агентов, обслуживающих очередь
member => Agent/3001
member => Agent/3002
; Группа агентов
;member => Agent/@1
Кстати, здесь же можно записать агентов в качестве участников, обрабатывающих указанную очередь. Поэтому некоторые параметры файлов agents.conf и queues.conf совпадают.
Чтобы агенты могли регистрироваться, необходимо в extensions.conf добавить специальные расширения и занести сам экстешн:
$ sudo mcedit /etc/asterisk/extensions.conf
; Для регистрации
exten=> 7001,1,AgentCallbackLogin(||${CALLERIDNUM}@callcenter)
; Для выхода
exten=> 7002,1,AgentCallbackLogin(||l)
[callcenter]
exten=> 911,1,Answer
exten=> 911,2,Ringing
exten=> 911,3,Wait(2)
exten=> 911,4,Queue(MyQueue)
exten=> 911,5,Hangup
Теперь, чтобы зарегистрировать агента, набираем номер 7001. Вводим пароль и логин по подсказкам системы. После регистрации агент будет поставлен в очередь на обработку звонков, поступающих по номеру 911. Позвонив на номер 7002, можно сменить экстешн или, нажав кнопку #, отменить регистрацию агента.
Парковка вызова (Call parking) является одним из несомненных удобств, предоставляемых Asterisk. Работает это так. Ты поднимаешь трубку и в процессе разговора понимаешь, что разбираться с проблемой должен другой сотрудник, либо для выяснения всех обстоятельств необходимо перейти на другое рабочее место. Вместо того чтобы просить абонента перезвонить по другому телефону, ты, просто набирая комбинацию клавиш, помещаешь вызов во временный слот, а перейдя на новое место и набрав номер этого слота, продолжаешь разговор. Параметры парковки и комбинация для передачи вызова определяются в файле features.conf. После установки сервера в нем активированы следующие параметры:
$ sudo mcedit /etc/asterisk/features.conf
[general]
; Экстешн для парковки
parkext => 700
; Слоты для парковки
parkpos => 701-720
; Контекст для парковки
context => parkedcalls
; Время парковки (в секундах), после которого будет произведен вызов по первому номеру
parkingtime => 45
; Время набора цифры при передаче вызова
transferdigittimeout => 3
; Оповещения
courtesytone = beep
xfersound = beep
xferfailsound = beeperr
; Отсылка информации на экраны ADSI телефонов
adsipark = yes
[featuremap]
; Комбинация активации передачи звонка
blindxfer => #
; Разъединение
disconnect => *
И в диалплане тех пользователей, которым разрешена парковка, подключаем экстешн parkedcalls:
include => parkedcalls
Теперь если во время разговора нажать клавишу #, а затем номер, указанный в parkext, то есть в нашем примере 700, ты услышишь номер слота, к которому будет подключен абонент. Только набирать нужно быстро, иначе получишь сообщение о неудачной операции. Набрав на другом телефоне полученный номер слота, ты сможешь продолжить разговор.
Теперь несколько другая ситуация, также не редкая в любом офисе. Сотрудник, находящийся рядом, по некоторым причинам не может ответить на телефонный звонок, можно подойти к звонящему телефону, а можно просто набрать определенную комбинацию, плюс номер звонящего телефона и перехватить вызов (Call Pickup). Реализуется это несколькими способами. Самый простой – добавить в описание каждого аккаунта параметры callgroup и pickupgroup. В этом случае нажатием «*8″ можно перехватить звонок на любой номер в пределах группы. Комбинация цифр для перехвата определена в переменной «pickupexten» в файле features.conf. В остальных случаях следует использовать функцию Pickup:
Pickup(extension[@context][&extension2@context...])
[xxxxxx]
exten => *8,1,Pickup(1111@xxxxxx)
exten => 1111,1,Dial(1111,60,rtT)
Следует помнить, что перехват вызова работает только в пределах технологии SIP, IAX, Zapata и так далее. То есть, например, в схеме «SIP телефон – SIP телефон» Pickup работать будет, а перехватить входящий звонок с обычной телефонной линии с помощью SIP телефона не получится.
Не менее полезной функцией Asterisk является возможность создания виртуальных комнат для конференций, в которых могут одновременно общаться все абоненты, имеющие доступ. Комнаты конференции описываются в файле meetme.conf. Причем, обнаруживая вызов MeetMe(), сервер перечитывает этот файл, поэтому при внесении в него изменений сервер перезапускать не требуется.
$ sudo mcedit /etc/asterisk/meetme.conf
[rooms]
; Описание конференции в виде
; conf => conf№[,pin][,adminpin]
conf => 1234
conf => 2345,9938,0123
Как видишь, здесь все просто. Например, в комнату 1234 может зайти каждый абонент, в чей контекст она включена при помощи конструкции «MeetMe(confno, [options])«. Для доступа к 2345 потребуется ввести PIN 9938, пин администратора – 0123. Теперь в нужный контекст добавляем строку:
exten => 500,1,MeetMe(2345|p)
Необязательный параметр «p» позволяет абоненту отключаться от конференции нажатием #. Описание остальных параметров можно найти по адресу .
В статье «Строим телефонную сеть» из X_11_2007 я применил в одном из расширений команду VoiceMail, но работу с головой почтой мы не настраивали. Естественно, такой полезной возможностью пренебрегать нельзя. Настройки голосовых ящиков производятся в файле voicemail.conf, параметров в нем много, большинство из них касается настройки почтового уведомления, сообщающего пользователю о наличии нового сообщения.
$ sudo mcedit /etc/asterisk/voicemail.conf
[general]
; Формат файла для записи сообщения
format=wav49|gsm|wav
; Адрес для поля From e-mail
serveremail=Asterisk
; Разрешение прикреплять voicemail к письму
attach=yes
; Команда для отправки e-mail
mailcmd=/usr/sbin/sendmail –t
; mailcmd=/usr/exim/bin/exim -t
; Временная зона
tz=moscow
; Далее описываем контекст(ы) для голосовых ящиков; некоторые параметры секции general здесь можно переопределить как для всей секции, так и индивидуально
[default]
1234 => 4242,Test Mailbox,grinder@localhost
4444 => 0855,Master,master@localhost,grinder@ua.fm,attach=yes|
serveremail=asterisk@grinder.com|tz=kiev
[office]
101=>2345,VoiceMail,,,
102=>2345,Vasja Pupkin,vasja@localhost
Здесь определено два контекста для голосовой почты: default и office. Первым идет почтовый ящик 1234 с паролем для доступа 4242, именем пользователя «Test Mailbox» и почтовым адресом grinder@localhost. В ящике 4444 показано, как можно переопределить глобальные настройки для конкретной записи. В ящике 101 не указан почтовый адрес, это означает, что e-mail о наличии нового сообщения отправляться не будет. Не забываем в записи абонента использовать параметр «mailbox=102@office» и в файл extensions.conf, в соответствующие диалпланы, добавляем:
$ sudo mcedit /etc/asterisk/extensions.conf
include => voicemail
…
[office]
; Записываем голосовое сообщение, если пользователь не снимает трубку
exten => 1234,1,Dial(SIP/1234,20)
exten => 1234,2,Voicemail(1234@default)
…
; Циркулярный голосовой ящик для 101 и 102
exten => 100,1,VoiceMail(u101&102)
; Проверка наличия сообщений в 101
; Флаг s означает, что пароль при проверке сообщений вводить не нужно
exten => 111,1,VoiceMailMain(s101@office)
; Если имеется несколько почтовых ящиков в диапазоне 100-199, можно разрешить оставлять в них сообщения напрямую после набора * и номера расширения (флаг u – Unavailable сообщение)
exten => _*1XX,1,VoiceMail(u${EXTEN:1})
exten => _*1XX,2,Hangup
Кстати, по адресу доступна таблица перевода сообщений (с английского на русский) голосового ящика для Asterisk 1.4.х.
Статья опубликована в январском номере журнала «Xakep» за 2008 год.





