Журнал LinuxFormat - перейти на главную

LXF82:Asterisk

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

Asterisk: замените вашу АТС

Душа горит желанием внедрить в своей организации VoIP взамен недешёвой АТС, но не уверены, что справитесь? Попробуйте эту открытую систему и добавьте отличные функции – например, конференции с интернет-вызовами.

Выход технологии за пределы круга своих приверженцев в коммерческий мир всегда волнителен. Это произошло с Интернетом в середине девяностых; с Linux незадолго до смены тысячелетий; и теперь это происходит с IP-телефонией. Поскольку «голос поверх IP» (Voice over IP, VoIP) – это сервис, работающий поверх общедоступного Интернета (или, возможно, сегмента частной LAN/WAN), большинство протоколов и стандартов, используемых данной технологией, открыты, и это способствует разработке широкой номенклатуры программ и оборудования. Есть несколько различных реализаций VoIP, каждая из которых имеет свои преимущества и недостатки.


Приложение, которое я здесь демонстрирую, Asterisk – это открытая УАТС (учрежденческая АТС), или телефонный узел частного пользования (private branch exchange, PBX). Хотя Asterisk был разработан для использования с VoIP – и поддерживает богатый набор протоколов VoIP, включая SIP и H.323 – им вполне можно бесплатно заменить УАТС даже и без функций VoIP. Мы особо приглашаем собрать её для себя любителей удушающе больших счетов от телекоммуникационных компаний и непристойных тарифов на «дальние» и международные звонки (см. врезку «Подключение к телефонной сети общего пользования»).

На этом уроке я предполагаю, что вы пошли путём свободного VoIP. Мы сосредоточимся на трёх специфических функциях Asterisk:

  • Как уберечь передачу вызовов от нестабильности Интернета.
  • Как поддерживать связь с друзьями и коллегами с помощью конференции.
  • Как помещать входящие звонки в очередь

Но как это работает? Кто использует УАТС? И о чём я вообще тут толкую?

Если вы не привыкли к телефонии, вам придётся потерпеть, пока я коротко опишу её функционирование – но, с другой стороны, крутые хакеры вроде вас должны бы терпимо относиться к техническим разъяснениям. Приступим. Любая реализация VoIP в принципе состоит из двух компонентов: процесс, передающий звуковую информацию от пользователя в сеть VoIP (обычно, телефон), и процесс, позволяющий оборудованию VoIP взаимодействовать с телефонной сетью общего пользования (ТфОП). Хотя люди с техническим складом ума из многих стран терпеть не могут общую телефонную сеть, всё же это стандарт, и к ней подсоединён почти каждый. Как бы ни была хороша технология VoIP, пользуются ею не все, так что не обойтись без способности звонить на стандартные телефонные системы и принимать вызовы практически от любого абонента в мире.

Наша задача согласовать две отдельные телефонные сети не нова – любое предприятие с более чем пятью сотрудниками, вероятно, имеет внутреннюю телефонную сеть с расширениями и голосовыми услугами. Чтобы подключить эту сеть к общей коммутационной сети (public switched telephone network, PSTN), используется УАТС. УАТС можно рассматривать как телефонный маршрутизатор, со своим внутренним диапазоном адресов (известных также как добавочные номера или расширения, extensions) и доступом к общим номерам снаружи. УАТС хорошего качества стоят не дёшево (несколько тысяч долларов и более за абсолютный минимум функций), зато предоставляют ожидаемую пользователями надёжность почти со 100%-й готовностью на протяжении нескольких лет, если не десятилетий.

При формировании среды VoIP, для ИТ-персонала УАТС – первоочередная область внимания, поскольку это линия фронта между ТфОП и нашими пользователями. Коммерческие системы УАТС с поддержкой VoIP предлагаются почти всеми, кто использует стандартные устройства УАТС – посмотрите на решения Nortel (http://www.nortel.com), Lucent (http://www.lucent.com) и Cisco (http://cisco.com) – но имеется замечательная альтернатива в настоящем стиле open source, работающая на стандартном оборудовании Intel. И здесь мы возвращаемся к Asterisk.


Будем знакомы

Эта программа была разработана Марком Спенсером [Mark Spencer], чья телефонная компания Digiun оказала проекту разработке Asterisk первичную поддержку, а вообще-то поставляет телекоммуникационное оборудование. Asterisk бесплатен для загрузки, что делает использование УАТС возможным для очень маленьких фирм и даже отдельных пользователей.

Во многих дистрибутивах, включая Fedora Core и Debian, доступны двоичные пакеты Asterisk, а также модули ядра и требуемые библиотеки поддержки. Пока оборудование для соединения с ТфОП (PSTN) не используется, поддержка на уровне ядра не нужна. Пользователи Debian могут просто выполнить apt-get install Asterisk, чтобы загрузить и установить систему Asterisk, или скачать исходные коды с http://www.Asterisk.org.

Сборка Asterisk проста, хотя и требует компиляции libpri и zaptel для C-заголовков. Установить его можно стандартно: make && make install с правами суперпользователя – для большинства пользователей сборка пройдёт успешно. Asterisk потребует немного времени на компиляцию, но, будучи установленным, он будет использовать некоторые файлы конфигурации по умолчанию, поставляемые с пакетом.

Мы можем протестировать установленный нами Asterisk, выполнив от имени суперпользователя:

# Asterisk -cvvvvv

На экране замелькает всевозможная информация, по мере загрузки каждого модуля, но в конечном счёте мы увидим простенькое приглашение, с помощью которого сможем управлять нашей системой Asterisk:

Asterisk Ready.
CLI>

Командная строка Asterisk весьма напоминает Cisco IOS, так что если вы знакомы с этим популярным ПО для маршрутизаторов, то моментально в ней разберётесь. Команда show version выведет текущую версию Asterisk, а все команды можно просмотреть, введя ? в командной строке. Поначалу наиболее полезной командой будет show modules, которая отображает все модули, входящие в комплекс Asterisk. Каждая из возможностей Asterisk, например, обеспечение протоколов телефонии, кодеки для сжатия звука и различные устанавливаемые по умолчанию приложения, представлена в Asterisk в виде модуля.

Устойчивая маршрутизация вызовов

Теперь, после установки, самое время воспользоваться Asterisk для решения нашей первой общей проблемы телефонии: непрофессиональная маршрутизация вызовов.

Понятно, что полным-полно провайдеров VoIP с бизнес-моделями отнюдь не звёздного уровня (см. врезку «Выбор вашего оператора VoIP», там перечислены операторы, имеющие репутацию солидных). Пусть они и предлагают звонки в Тибет за копейки, но человек разумный вряд ли будет ожидать высокой стабильности их сети. Asterisk предоставляет достаточную гибкость в подключении к более чем одному оператору VoIP для обработки вызовов, и мы можем построить логику нашей УАТС так, что если один оператор вдруг «умрёт», для звонков во внешний мир станет использоваться другой метод.

Жизненно важная составляющая в этой смеси – приведённый ниже макрос «дозвона», он важнее всех тех, что вам доведётся увидеть (по крайней мере, сегодня на уроке):

[macro-dial]
exten=>s,1,Dial(${ARG1},120)
exten=>s,2,Goto(s-${DIALSTATUS},1)
exten=>s-NOANSWER,1,Handup
exten=>s-BUSY,1,Busy(45)
exten=>s-CONGESTION,1,NoOp
exten=>s-CHANUNAVAIL,1,NoOp
exten=>s-.,1,Goto(s-NOANSWER,1)

Как видите, макрос позволяет нам создать список методов для передачи клиентских звонков и не волноваться об «уборке» после себя.

Мы можем реализовать этот макрос в соответствии с нашим номерным планом и логикой, используемой для перенаправления вызовов, в extensions.conf:

exten=>_0.,1,Macro(dial,IAX2/carrier1/${EXTEN})
exten=>_0.,2,ResetCDR
exten => _0.,3,Macro(dial,IAX2/carrier2/${EXTEN})
exten=>_0.,4,Hangup()

Эту конфигурацию можно расширять как угодно, добавляя в список других операторов VoIP. Её недостаток – когда звонок уже принят, нет гарантии, что он пройдёт гладко. Немногие конечные пользователи хотели бы иметь дело с недостатками вроде плавающего или одностороннего звука и прерванных соединений, но как только провайдер VoIP берёт вызов в свои руки, мы, естественно, предполагаем, что он всё сделает правильно. Если у вас достаточно времени, вы, думаю, сможете набросать что-то в пять строк на Perl для анализа вызовов, сделанных из Asterisk, и определить, какие маршруты более надёжны.

В больших системах основное преимущество даёт маршрутизация по критерию наименьшей стоимости (Least Cost Routing, LCR), разновидность услуги сравнения, особенно когда у провайдеров различаются тарифы для звонков за границу. Тарифные планы пары провайдеров можно поместить в базу данных и использовать для определённых звонков провайдера, предложившего более низкую цену. Подробную информацию можно получить на http://cpan.uwinnipeg.ca/htdocs/Asterisk-LCR.

Строим конференц-связь

Теперь – наша вторая задача. Все телефоны, кроме самых простых, способны принимать трёхсторонние звонки, так что можно организовать небольшую конференцию с двумя другими абонентами. Если участников больше трёх, это усложняется и требует усовершенствованного решения, ориентированного на группы абонентов. Даже если вы проводите основную часть своих групповых дискуссий в сети, не мешает знать, как создать мост конференций и запустить его, на случай, если сеть IRC будет неработоспособна.

Для поддержки телефонных конференций Asterisk предоставляет приложение, известное как MeetMe; примеры конфигураций включены в поставку Asterisk. Основная зависимость MeetMe – подсистема времени Asterisk. Обычно, чтобы предоставить точные часы, Asterisk использует драйвер Zaptel и физические устройства; однако это доступно не всегда, особенно в случае серверов-стоек, где разъёмы PCI в большом дефиците. Вместо этого, в ядре 2.6 и текущем релизе Zaptel вы можете использовать модуль ядра ztdummy, и всё замечательно заработает. Многие функции Asterisk связаны с синхронизацией, так что при подгруженном ztdummy всё работает гораздо более гладко.

Построить мост конференций в MeetMe.conf совсем не сложно, требуется только номер ID конференции и необязательный PIN-код для доступа:

conf => 2345,9938

Мы можем затем переключиться на этот мост из нашего extensions. conf:

exten => 2000,1,MeetMe(2345)

Первому позвонившему сообщат, что он пока только один, и будет проигрываться мелодия ожидания. Как только присоединится второй абонент, мелодия ожидания завершится, и они смогут побеседовать. При подключении или отсоединении очередного абонента все будут оповещаться об этом звуковым сигналом. MeetMe имеет огромный набор опций, включая расширения для подключения к конференции с различными предпочтениями. Это идеально, когда мы хотим, чтобы определённые абоненты подсоединились и послушали, но не смогли ввязаться в разговор; или когда к мосту уже подключено несколько человек, но мелодия ожидания звучит до тех пор, пока не объявится некая конкретная личность.

Есть ряд версий мостов конференций сторонних разработчиков, работающих с Asterisk, но MeetMe имеет так много опций, что его замену обосновать очень трудно.

Управление очередью

Теперь мы можем заняться третьей задачей Asterisk, которая ждёт своего часа, слушая мелодию Greensleeves буквально с самого начала урока. Любая организация, клиентов у которой намного больше, чем сотрудников на телефоне, должна рационально расставить приоритеты звонков и обрабатывать их так, чтобы люди не спятили окончательно. Очереди звонков хороши для решения первой проблемы, хотя некоторые считают, что они могут серьёзно подорвать психическое здоровье клиентов. Типичная очередь – это система, когда дозвонившийся абонент слушает некоторое время музыку, затем один из агентов может поднять телефон и ответить на звонок. Asterisk легко с этим справляется при помощи приложения Queue.

Очереди определены в файле queues.conf, который имеет ту же структуру, что и другие файлы конфигурации Asterisk. Каждая очередь строится с собственной конфигурацией и списком агентов. Простейшая очередь может выглядеть примерно так:

[support]
musiconhold=default
strategy=roundrobin
timeout=15
retry=5
wrapuptime=30
maxlen=0
announce-frequency=90
announce-holdtime=yes
announce-round-seconds=60
context=operator
reportholdtime=yes
member => SIP/200
member => SIP/208
member => SIP/212

Большая часть этой конфигурации довольно прямолинейна, хотя есть ряд опций, подстраиваемых под требования конкретной очереди. Строки announce позволяют приложению периодически сообщать звонящему, сколько он просидел в очереди и какова его позиция, и радовать его позорными сообщениями типа: «Вы – следующий на очереди, среднее время разговора – пять часов». Опция reportholdtime включает уведомления агенту о том, как долго звонящий ждал соединения. Отделам технической поддержки такая информация полезна для определения тенденций по времени вызова и может быть включена в документацию по запросу.

В нашей базовой конфигурации очереди есть только статические агенты, которые не могут покинуть очередь, пока не переведут свои телефоны в режим DnD (Do not Disturb, «не беспокоить») или не отключатся. Для людей, которые приходят и уходят, или для удалённых пользователей использование агентов позволяет подключаться к очереди, когда они хотят ответить на звонок. Система отсоединит их, если они не смогут ответить в течение определённого времени. Создадим agents. conf, похожий на этот:

[agents]
ackcall=no ; Агент не нажал #, чтобы ответить на звонок
musiconhold => default
agent => 1234,0000,Agent1_Name
agent => 1235,0000,Agent2_Name

Для подключения и отсоединения используется команда AgentCallBackLogin в файле extensions.conf, чтобы предоставить расширение для аутентификации пользователей по их ID и PIN-коду, прежде чем они присоединятся к очереди в качестве агента:

exten => 700,1,AgentCallBackLogin(|${CALLERIDNUM}@local)

В этом примере вызовы для очереди будут выполняться на идентификатор подключённого лица, исключая необходимость определять его местоположение. Однако имейте в виду: если ваш телефонный номер снабжен добавочным, идентификатор может оказаться неправильным местом для перенаправления вызова.

Узнайте больше

Нарождающаяся технология развивается с необычайной быстротой – за ней трудно уследить. Сайт http://www.voip-info.org – чудесный ресурс для каждого, кто работает с VoIP, даже если Asterisk не является «частью уравнения». Даже не пытайтесь настроить VoIP-телефон от Cisco или Polycom, не посетив этот сайт: без толкового руководства вы можете зря потратить время, пытаясь во всём разобраться.

Персональные инструменты
купить
подписаться
Яндекс.Метрика