Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 109, ЯНВАРЬ 2008 г.

VoIP особого назначения

Сергей «grinder» Яремчук

Хакер, номер #109, стр. 148

(grinder@ua.fm)

Полезные фичи Asterisk IP-PBX

Возможности сервера IP-PBX Asterisk не ограничиваются лишь обслуживанием звонков клиентов. В зависимости от характера деятельности организации, в которой будет использоваться Asterisk, могут понадобиться и некоторые другие его возможности. Например, в службе поддержки не помешает функция перехвата или перенаправления звонков, а использование голосовой почты поможет всегда «отвечать» на звонки клиентов. И это далеко не все, что может этот сервер.

Music on Hold

Слушать гудки, пока абонент не снял трубку, невероятно скучно. Чтобы избежать неприятных ощущений, можно установить мелодию, которая будет проигрываться вместо гудков. В 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 оn Hold (MOH). Второй описывает ресурс для MOH. В нем мы указали режим воспроизведения файлов, каталог, в котором находится музыка, и установили случайное воспроизведение. Если файлы имеют специфический формат, который не может воспроизвести 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]

; Устанавливаем класс для MOH

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

В каждом диалплане можно использовать свой класс MOH и вешать трубку по истечении определенного времени. Например, так:

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 позволяет абоненту отключаться от конференции нажатием #. Описание остальных параметров можно найти по адресу www.asteriskguru.com/tutorials/meetme_conf.html.

Работа с голосовой почтой

В статье «Строим телефонную сеть» из ноябрьского номера ][ за прошлый год я применил в одном из расширений команду VoiceMail, но работу с голосовой почтой мы не настраивали. Естественно, такой полезной возможностью пренебрегать нельзя. Настройки голосовых ящиков производятся в файле voicemail.conf. Параметров в нем много, большинство из них касается настройки почтового уведомления, сообщающего пользователю о наличии нового сообщения.

$ sudo mcedit /etc/asterisk/voicemail.conf

[general]

; Формат файла для записи сообщения

format=wav49|gsm|wav

; Адрес для поля From e-mail

serveremail=Asterisk

; Разрешение прикреплять voicemail к письму

attach=yes

; Команда для отправки email

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

Кстати, по адресу romik-g.livejournal.com/19022.html доступна таблица перевода сообщений (с английского на русский) голосового ящика для Asterisk 1.4.х.

Содержание
ttfb: 6.7610740661621 ms