Как приобрести журнал "Системный администратор"?
Проще всего подписаться! 87836 - Пресса России, 81655 - Роспечать.
Все подробности на странице подписки на сайте журнала.
Что важно знать об IP-телефонии?
Михаил Платов
Еще не так давно сети с коммутацией каналов (телефонные сети) и сети с коммутацией пакетов (IP-сети передачи данных) существовали практически независимо друг от друга и использовались для различных целей. Телефонные сети использовались для передачи голосовой информации, а IP-сети - для передачи данных. Определенной вехой в истории телекоммуникаций и Интернета является IP-телефония, позволившая передавать "голос" поверх получивших уже значительное распространение IP-сетей. IP-телефония дала возможность общения не только пользователям Интернета. С помощью специальных устройств - шлюзов (gateway) она также объединила телефонные сети и сети передачи данных.
Пять причин использовать IP-телефонию
С помощью IP-телефонии вы сможете:
1. Сократить расходы на междугородные и международные переговоры. Один из наиболее распространенных вариантов использования IP-телефонии. Связь через IP получается дешевле по ряду причин. Во-первых, в IP-телефонии используются широко распространенные (и дешевые) сети с коммутацией пакетов [1] , (в отличие от более дорогостоящих сетей с коммутацией каналов, применяемых в традиционной телефонии). Во-вторых, благодаря использованию голосовых кодеков (вокодеров, voice coders) достигается существенное сжатие речевой информации. Так, при передаче голосового потока в системах цифровой телефонии [2] требуется канал 64 кБит/с (ISDN). В системах IP-телефонии, при использовании наиболее популярных на сегодняшний день кодеков, требуется гораздо меньшая пропускная способность (6-13 кБит/с).
Можно выделить два наиболее популярных варианта подключения к провайдерам междугородной и международной телефонии:
n Через ТФОП (Телефонная сеть Общего Пользования) - при подключении пользователь набирает "городской" номер сервера IP-телефонии провайдера, проходит аутентификацию (по pin-коду) и набирает нужный ему номер. Чтобы пользоваться IP-телефонией по этой схеме, достаточно иметь обычный городской номер.
n С помощью специальных "шлюзов" - в этом случае пользователь приобретает специальное устройство - шлюз IP-телефонии, с помощью которого получает возможность совершать звонки без использования ТФОП (через интернет-канал, предоставляемый провайдером). В место шлюзов также можно применять программные (в том числе и бесплатные) и аппаратные IP-телефоны.
2. Построить корпоративную телефонную сеть. В данном случае для ведения телефонных разговоров в рамках предприятия используется внутренняя IP-сеть [3] . Однако в минимальном варианте такие системы используются достаточно редко [4] и как правило, корпоративные системы IP-телефонии также решают следующие задачи:
n обеспечение "мобильности" внутренних пользователей;
n организация связи между географически отдаленными филиалами;
n объединение телефонной емкости филиалов в единый номерной план;
n организация аудио- и видеоконференций;
n построение центров обработки вызовов (call-центров).
Данное направление систем IP-телефонии очень хорошо развито производителями оборудования. Наиболее известными поставщиками являются такие компании как, Cisco Systems, Avaya, Nortel Networks.
3. Получить дополнительные возможности, не свойственные обычным телефонным сетям: сlick2Dial - возможность совершить звонок (например, менеджеру продаж или в службу тех. поддержки) прямо с веб-сайта компании, голосовые авто-информаторы на основе IVR (Interactive Voice Response), аудио- и видеоконференций, голосовую почту и историю пропущенных звонков через web, определение присутствия абонента в сети и т. д.
4. Обеспечить "дешевую связь" в пределах зон Wi-Fi. Пользователь, находящийся в пределах беспроводной точки доступа 802.11 может применять VOIP (вместо сотовой связи) [5] .
5. Организовать сеансы аудиосвязи или связи типа точка-точка через Интернет. Используя стандартное оборудование IP-телефонии, можно организовать сеанс связи между пользователями Интернет (например, c использованием Microsoft NetMeeting) или соединить несколько географически отдаленных филиалов.
Протоколы IP-телефонии
На данный момент существует несколько стандартизованных протоколов, на базе которых строятся системы IP-телефонии. Рассмотрим некоторые из них более подробно.
Протокол H.323
Автором данного стандарта является организация ITU-T (International Telecommunication Union). Существует несколько версий стандарта H323. Первая была выпущена в 1996 году. Последующие являются эволюционным развитием (большая гибкость, масштабируемость и надежность). Последняя на данный момент версия 4 появилась в 2000 году. На данный момент протокол H.323 является стандартом де-факто для междугородной и международной телефонии. Если вы захотите воспользоваться предложением одного из транснациональных операторов IP-телефонии, то придется обратить внимание именно на H.323. Стандарт определяет базовую архитектуру сети передачи мультимедиаданных:
Рисунок 1. Возможная структура H323-сети
К числу объектов стандарта H.323 относятся:
n Терминал (Terminal).
n Шлюз (Gataway).
n Устройство управления конференциями (Multipoint Control Unit - MCU).
n Привратник (GateKeeper).
Терминал
Конечное H.323-устройство пользователя. Может быть как программным (приложение на компьютере), так и аппаратным (телефонный аппарат). Терминалам могут назначаться один или несколько псевдонимов (номера телефонов, названия).
Шлюз
Устройство, предназначенное для сопряжения разнородных сетей. Так, рекомендации ITU-T содержат информацию по сопряжению H.323-устройств с устройствами сетей ISDN, ATM и ТФОП.
Привратник
Основной управляющий [6] элемент сети H.323, координирующий и контролирующий работу всех ее устройств. К его задачам относятся:
n аутентификация;
n авторизация;
n разрешение имен;
n управление пропускной способностью, используемой H.323-устройствами.
Как правило, сеть H.323 разбивается на "зоны", в каждой из которых присутствует привратник, управляющий вверенными ему устройствами. Для обеспечения большей надежности одну "зону" могут обслуживать несколько привратников, тогда один из них называется "главным", а остальные - "альтернативными". Помимо управления и централизованного разрешения имен абонентов, привратники также могут предоставлять дополнительные возможности, например, выполнять функции прокси-сервера для сигнальных и медиаданных.
MCU [7]
Предназначено для организации конференций с числом участников более 3. Оно координирует передачу управляющей (и опционально мультимедийной) информации между участниками конференций. Работу с устройствами H323 мы рассмотрим на примере привратника GNU GateKeeper и открытых программных телефонов.
Протокол SIP
SIP - Session Initiation Protocol (протокол управления сессиями) - используется для создания, изменения и разрыва "сессий" между одним или несколькими участниками. Понятие "сессии" в протоколе SIP достаточно широкое. Под "сессией" могут подразумеваться не только телефонные звонки, но и передача данных, конференции, децентрализованные игры и т. д.
SIP регламентирует только процедуру установки соединения между устройствами, поэтому обычно наряду с SIP используется протокол передачи информации. В случае IP-телефонии в качестве таких протоколов выступают RTP [8] и SDP [9] .
Разработкой протокола SIP занимался комитет MMUSIC [10] организации IETF, поэтому в отличие от протокола H.323 (разработанного телефонистами из ITU-T) протокол SIP является более интернет-ориентированным и предназначен для предоставления несколько других (по сравнению с H.323) услуг.
Ключевые возможности протокола SIP:
n Мультимедийность.
n Персональная мобильность пользователей. Пользователи могут перемещаться без ограничений в пределах сети, поэтому услуги связи должны предоставляться им в любом месте этой сети. Пользователю присваивается уникальный идентификатор, а сеть предоставляет ему услуги связи вне зависимости от того, где он находится.
n Масштабируемость сети. Она характеризуется в первую очередь возможностью увеличения количества элементов сети при её расширении. Серверная структура сети, построенной на базе протокола SIP, в полной мере отвечает этому требованию.
n Открытость и простота. По убеждению авторов и специалистов, SIP позволит наполнить решения и продукты новыми сервисами и возможностями. Что касается простоты, то достаточно сказать, что все используемые в SIP сообщения имеют текстовый формат и поддерживают вложение любых типов данных. Поэтому голосовое соединение может сопровождаться обменом данными между приложениями. Так, разговор по протоколу SIP свободно дополняется передачей данных от одного абонента другому, например, электронной визитки, цифровых фотографий или даже файла MP3.
n Клиент-серверная архитектура.
n Возможность реакции на события. Так, клиент может "подписаться" на определенное событие (например, обновление статуса пользователя), и как только оно наступит, сервер вышлет соответствующее обновление.
Протокол SIP во многом схож с широко используемым протоколом HTTP, который также можно считать сигнальным (клиенты запрашивают у сервера нужные им документы). При установке соединения параметры сессии описываются в соответствии с SDP и вместе с заголовками протокола SIP передаются клиенту. Коды ответов протокола SIP также очень похожи на стандартные коды протокола HTTP. В случае удачного ответа клиенту посылается код 200, адрес не найден (404), ошибка авторизации (403) и др.
Клиенты SIP-сети идентифицируются по универсальным идентификаторам SIP-URI, внешне похожим на адреса электронной почты: sip:platov@cs.vsu.ru. Таким образом, имя клиента SIP состоит из персональной части (до знака @), идентифицирующей пользователя, и доменной части (после @), определяющей, например, организацию. В качестве доменной части возможно использование DNS-имени.
Протокол SIP выделяет следующие типы объектов сети:
n Агенты.
n Серверы регистрации.
n Серверы перенаправления.
n Прокси-серверы.
Агенты
Под агентами подразумеваются конечные устройства пользователя (телефоны, программные телефоны, мобильные телефоны, наладонные компьютеры, шлюзы в ТФОП, системы голосовых меню и т. д.)
В составе агентов выделяются две логические составляющие:
n агент-клиент (UAC - user agent client) - посылает запросы и получает ответы;
n агент-сервер (UAS - user agent server) - принимает запросы и посылает ответы.
Рисунок 2. Взаимодействие UAC и UAS
Ввиду того, что большинству устройств необходимо как передавать, так и принимать данные, в реальных устройствах присутствует как UAC, так и UAS [11] .
Прокси-серверы
Являются неотъемлемой частью SIP-сети, отвечают за маршрутизацию сообщений, а также аутентификацию и авторизацию пользователей. В стандарте определяется два типа SIP-прокси-серверов:
n Без учета состояния (stateless). Такие серверы не отслеживают состояния SIP-сессий и передают сообщения, используя внутренние правила маршрутизации. Их основное применение - распределение нагрузки и маршрутизация. Open Source-примером stateless SIP-прокси-сервера является SER [12] (SIP Express Router).
n С учетом состояния (stateful). Отслеживают состояние каждой SIP-сессии от момента ее создания до завершения. Могут использоваться для более интеллектуальной маршрутизации (перенаправление вызовов, голосовая почта, дополнительная обработка вызовов и т. д.), могут самостоятельно повторно пересылать пакеты (в случае если они были потеряны при передаче). Платой за дополнительные возможности является более сложная реализация и большие требования в вычислительной мощности сервера (из-за необходимости хранить информацию о каждой SIP-сессии). Наиболее популярным Open Source stateful прокси-сервером, работающим по протоколу SIP, является Asterisk - The Open Source Linux PBX [13] .
Рисунок 3. Типичная схема использования SIP-прокси-сервера
Если пользователь A1@a.com захочет позвонить пользователю B1@b.com, то он передаст запрос INVITE B1 своему прокси-серверу, который перенаправит вызов прокси-серверу b.com абонента B1.
Сервер регистрации (REGISTRAR)
Перед работой в сети каждое устройство должно зарегистрироваться с помощью специального сообщения REGISTER. При этом клиент сообщает серверу свое имя в формате: IP-адрес, номер порта, SIP-URI и пароль доступа. В случае успешной регистрации информация о клиенте заносится в специальную базу данных (используется в дальнейшем для нахождения клиента) и клиенту высылается сообщение: "200 OK". С определенной периодичностью этот процесс повторяется, таким образом обеспечивается "актуальность" данных о клиентах. Как правило, серверы REGISTRAR совмещаются с прокси-серверами. PBX Asterisk, рассмотрению которого будет посвящена отдельная статья, в этом отношении не является исключением и может выполнять как функции прокси-сервера, так и сервера регистрации.
SCCP (Skinny Client Control Protocol)
Данный протокол является корпоративным. Он разработан компанией Cisco Systems для организации работы IP-телефонов Cisco под управлением ПО Cisco Call Manager, являющегося в том числе и шлюзом в сети H.323. Идея подхода, лежащего в основе разработки протокола SCCP, заключалась в переносе логики обработки H.323 соединений из конечных устройств в ПО Cisco Call Manager. Таким образом, существенно упрощалась (и удешевлялась) реализация конечного устройства клиента.
Как оценить качество систем IP-телефонии
Существуют различные методики оценки качества систем IP-телефонии. Наиболее известные из них MOS (Mean Opinion Score или "усредненная субъективная оценка экспертов"), представляющая собой численную оценку, характеризующую "качество" сети телефонии. Идея MOS очень проста: специально сформированной группе людей предоставляют возможность воспользоваться системой связи и просят поставить оценку от 1 (ужасно) до 5 (отлично) [14] . Усредненные данные такого исследования и называются MOS. Кроме того, для оценки качества речи также существуют и объективные методы, например, рекомендация ITU-T G.113 (измерение качества речи системы телефонии на основе искажений, вносимых каждым ее элементом), PSQM (оценка качества работы вокодеров), PESQ (развитие PSQM для оценки сетей телефонии). Не вдаваясь в детали методов оценки качества, давайте лучше рассмотрим основные параметры, оказывающие на него непосредственное влияние:
n используемый кодек;
n наличие/отсутствие "эха";
n параметры каналов связи.
Все используемые на данный момент в IP-телефонии кодеки обеспечивают "сжатие с потерями". В зависимости от используемых алгоритмов эти "потери" могут быть по-разному различимы "на слух" именно в этом аспекте рассматривается влияние кодеков на качество речи.
При ведении разговоров на больших расстояниях начинает проявляться эффект "эха". Существуют различные алгоритмы, призванные с этим бороться (G.165, G.168, G.168 2000, и др.), и в подавляющем большинстве устройств какой-нибудь из них обязательно должен присутствовать.
Приведу три основных параметра канала связи, оказывающих воздействие на качество систем телефонии:
n Задержка (latency). При передаче голоса или видео существуют определенные требования к максимально допустимой задержке. Различные исследования показывают, что для ведения нормального диалога необходимо, чтобы "двойная задержка" при передаче голоса не превышала 250-300 мс (бюджет задержки). При превышении этого порога участники начинают испытывать дискомфорт и стремятся закончить разговор. Таким образом, для ведения комфортного разговора односторонняя задержка не должна превышать 150 мс (задержка канала + алгоритмическая задержка кодека), что совпадает с рекомендацией ITU-T G.114. Для уменьшения задержки, вносимой сетью, необходимо использовать QoS (Quality of Service)
n Джиттер (jitter). Ethernet является сетью с коммутацией пакетов. В общем случае это означает, что пакеты могут быть получены клиентом не в том порядке, в каком они были ему отправлены (для доставки пакетов могли использоваться различные маршруты). Что в таком случае делать декодеру? Для решения таких проблем используются специальные "jitter buffers" (сглаживающий буфер). Задачей этих буферов является предварительное накопление пакетов перед их дальнейшей передачей декодеру. Очевидно, что буфер дрожания также вносит некоторую задержку в процесс передачи голоса, поэтому желательным является использование такого размера буфера дрожания, которое, с одной стороны, обеспечивает приемлемое качество речи, а с другой - минимизирует общее значение бюджета двусторонней задержки до значения 300 мс.
n Потеря пакетов. Как известно, в сетях Ethernet допускается потеря пакетов. Влияние потери пакетов на качество речи определяется размером пакета [15] , а также используемым алгоритмом сжатия речи [16] . Речевая информация в большей степени устойчива к пропаже одиночных пакетов, нежели целых серий. В любом случае, согласно рекомендации ITU-T, для нормальной работы систем IP-телефонии допускается потеря не более 1% пакетов, в противном случае ухудшение качества речи будет заметно. Для улучшения качества в условиях загруженных сетей можно использовать QoS либо, если пакеты теряются из-за природы самой сети (например, беспроводная сеть), то для улучшения качества можно использовать более помехоустойчивый кодек или уменьшать размер кодируемого кадра.
Кодеки IP-телефонии
За все время существования данного направления было разработано большое количество кодеков, используемых для передачи аудио- и видеоинформации в системах IP-телефонии. Наиболее популярными (по количеству пользователей и поддержки в конечных устройствах) в настоящее время являются:
n G711 - стандартизованный ITU-T кодек, используемый в устройствах ISDN. Требуемая пропускная способность - 64 кбит/сек. Существуют две разновидности кодека a-law и u-law, отличающиеся алгоритмами кодирования. Кодек поддерживается практически всеми устройствами IP-телефонии.
n G729 - стандартизованный ITU-T кодек, предназначенный для передачи речи с "хорошим качеством" при использовании небольшой пропускной способности (8 кбит/сек). Существуют две популярные (и несовместимые между собой) версии данного стандарта: Annex A (более "простая" схема кодирования) и Annex B (с использованием алгоритмов сжатия пауз). По субъективным оценкам, данный кодек обладает качеством лучшим, чем у G.723, но худшим, чем G711 [17] . Поддерживается практически всеми производителями оборудования. При коммерческом использовании требуется лицензия.
n G723.1 - кодек, стандартизованный ITU-T. Отличительной особенностью является возможность работы при очень низком потоке (5.3, 6.3 кбит/сек). По субъективными оценкам, обладает самым плохим качеством (среди рассматриваемых кодеков) речи. Поддерживается значительной частью устройств IP-телефонии. При коммерческом использовании требуется лицензия.
n GSM (RPE-LTP) - голосовой кодек, разработанный для использования в системах сотовой связи стандарта GSM. При кодировании кадра используется информация предыдущего кадра, кодирование осуществляется блоками по 20 мс со скоростью 13 кбит/с. Поддерживается производителями оборудования, в основном в шлюзах между сотовыми и VoIP-сетями.
n iLBC (Internet low bitrate codec) - открытый (не требуются лицензионные отчисления) голосовой кодек. Предназначен для кодирования с потоком 13.33 кбит/сек (при размере кадра 30 мс) и 15.20 кбит/сек (при размере кадра 20 мс). По субъективным оценкам экспертов, качество речи данного кодека превышает G.729A. Кроме того, кодек более устойчив (по сравнению с g729) к потере кадров, что позволяет эффективно использовать его при организации сеансов связи через сеть Интернет. Примером этому является популярная сеть IP-телефонии - Skype [18] . Поддерживается ограниченным числом производителей оборудования.
Сравнительные характеристики кодеков приводятся в таблице:
Таблица. Основные параметры кодеков IP-телефонии
Кодек |
Поток |
Размер пакета (мс [19] ) |
Алгоритмическая задержка (мс) |
Оценка MOS |
Суммарный поток [20] |
G.711 |
64 кбит/с |
20 |
0 |
4.4 |
81.2 |
G.729 |
8 кбит/с |
20 |
15 |
4.07 |
31.2 |
G.723.1 |
6.3 кбит/с |
30 |
37.5 |
3.87 |
21.9 |
G.723.1 |
5.3 кбит/с |
30 |
37.5 |
3.69 |
20.8 |
GSM |
13 кбит/с |
20 |
20 |
3.5 |
35.4 |
iLBC |
13.33 кбит/с |
30 |
30 |
4 |
28 |
iLBC |
15.2 кбит/с |
20 |
30 |
4 |
29 |
Таким образом, по показателю качества кодеки можно расположить следующим образом (в порядке ухудшения качества): G711, iLBC, G729, gsm, G723. По используемой пропускной способности (в порядке увеличения:) G723, iLBC, G729, GSM, G711.
Интерфейсы телефонии
Наиболее часто используемым оборудованием в IP-телефонии являются шлюзы. Как было сказано выше, задачей шлюза является сопряжение "обычных" телефонных сетей с IP. И если с одной стороны этого шлюза всегда будет IP, то количество интерфейсов с другой стороны запросто может поставить в тупик неподготовленного человека. Попробуем развеять эту неопределенность и рассмотрим наиболее известные "телефонные" интерфейсы:
n FXS (Foreign eXchange Subscriber) - аналоговый интерфейс телефонных станций. К голосовым шлюзам с таким интерфейсом могут подключаться обычные телефонные аппараты, факсы и другие абонентские устройства. Фактически, интерфейс FXS это то, что приходит к нам по телефонному кабелю от городской или мини-АТС. В задачу устройств, реализующих этот интерфейс, входят: генерация сигнала готовности АТС (гудок в линии), сигналов вызова абонента и т. д.
n FXO (Foreign eXchange Office) - аналоговый интерфейс абонентских устройств телефонных станций. Устройства с таким интерфейсом подключаются к интерфейсу FXS. Так те же самые факсовые аппараты, телефоны, модемы реализуют интерфейс FXO. Существует такое простое правило - если есть провод, соединяющий два аналоговых устройства телефонии, то с одной стороны этого провода должен быть FXS (АТС), а с другой - FXO (телефон). Таким образом, шлюзы с интерфейсом FXO подключаются вместо телефона. С их помощью можно организовать связь с ТФОП или предоставить доступ к IP-телефонии, используя "внутренние" (более дешевые) линии мини-АТС. Так как шлюзы FXO фактически "эмулирует телефон", зачастую для них бывает необходима настройка "отбоя". Для того чтобы шлюз "клал трубку", нужно научить его понимать сигнал "занято" той мини-АТС, к которой он подключен.
Рисунок 4. Cопряжение портов FXO и FXS
n E1 - цифровой интерфейс, используемый для создания высокоскоростных магистралей. В цифровом потоке E1 имеется 32 канала (2 из них служебные) по 64 кБит [21] . Таким образом, используя 1 поток E1, возможно организовать до 30 одновременных телефонных разговоров. В IP-телефонии такие интерфейсы часто используются для организации связи с ТФОП или для организации связи между АТС. В каналах E1 может использоваться различная сигнализация (CAS, SS7, R2, R1.5, Q.931), и при подключении устройств по E1 это необходимо учитывать.
Заключение
Итак, после того как мы получили представление об основных протоколах и кодеках, используемых в IP-телефонии, можно приступить к практической части - рассмотрению конкретных программ и устройств, реализующих эти протоколы. Об этом читайте во второй статье цикла.
[1] Необходимо отметить, что, хотя в сетях IP-телефонии для передачи голоса и используется IP-сеть, она не является IP-сетью в обычном понимании. Так, в голосовых IP-сетях особое внимание уделяется обеспечению гарантированного качества обслуживания QoS (DiffServ, IntServ, MPLS), хотя это вовсе не означает, что в IP-сетях без QoS IP-телефония не будет работать.
[2] Которые в виду своей стоимости так и не "ушли в массы".
[3] Вариант может быть особенно интересен предприятиям, еще не имеющим коммуникационной инфраструктуры, т.к. при использовании IP-телефонии можно полностью отказаться от прокладки "двойной проводки".
[4] Все-таки основным преимуществом корпоративных сетей является функциональность, а не стоимость.
[5] Инсталляции, работающие по такому принципу, существуют в некоторых западных образовательных учреждениях.
[6] Для сетей сетей H323 наличие "привратника" не является обязательным. В этом случае H323-устройства работают в режиме Peer to Peer и самостоятельно разрешают имена в IP-адреса.
[7] Устройство управления конференциями.
[8] Real-Time Protocol - для передачи "голоса".
[9] Session Description Protocol - для описания параметров сессии.
[10] Multiparty Multimedia Session Control.
[11] Более детально к вопросу о UAC и UAS мы вернемся при рассмотрении тестовых утилит для SIP.
[14] На практике MOS редко превышает 4.5.
[15] Чем больше размер пакета, тем сильнее скажется его пропажа на восстановленном голосе.
[16] Различные алгоритмы обладают разной степенью устойчивости к пропаже пакетов (при восстановлении используется информация "соседних" кадров).
[17] Эти данные также подтверждаются оценкой MOS.
[18] Бесплатная для звонков компьютер-компьютер.
[19] Некоторые кодеки поддерживают несколько размеров пакетов.
[20] При передаче через Ethernet к пакет "обрастает" различными заголовками (MAC, IP, RTP). В даной колонке приводится суммарная пропускная способность (без сжатия заголовков RTP, удаления пауз и потерь при передаче). В таблице приводятся данные для одного госолового канала, в то время как при сеансе их обычно 2 (прямой и обратный).
[21] Кроме Е1 (2 Мбит) также существуют Е2 (4 канала E1 или 8 Мбит), Е3 (4 Е2 или 34М бит), Е4 (4 Е1 или 139 Мбит), Е5 (4 Е4 или 565 Мбит). В Северной Америке используется очень схожая иерархия каналов T1, Т2 и т. д., отличающаяся количеством каналов (Т1 - 24 канала по 64 кБит) и, соответственно, пропускной способностью (Т1 - 1,5 Мбит).
Asterisk и Linux - миссия IP-телефония
Михаил Платов
У вас уже есть офисная мини-АТС или вы только планируете ее покупку? Думаете о предоставлении новых возможностей для повышения эффективности работы сотрудников? Сегодня мы приоткроем дверь в мир Open Source IP-телефонии, рассмотрев возможности одного из самых популярных продуктов для Linux - Asterisk PBX.
Итак, что же такое Asterisk? Читаем на официальном сайте [1]: "Asterisk - полностью программная учрежденческая АТС (УАТС), работающая под управлением операционной системы Linux". По возможностям (см. [2]) Asterisk зачастую опережает своих традиционных собратьев. Поддерживаются практически все популярные протоколы IP-телефонии (SIP, H323, SCCP, ADSI). Помимо стандартных и общеизвестных, Asterisk также имеет свой собственный протокол - IAX.
Его можно использовать как для подключения обычных клиентов, так и для передачи голосового трафика между несколькими серверами Asterisk. Для сопряжения с "традиционной телефонией" имеются аналоговые (FXO, FXS) и цифровые модули расширения (E1, T1). С помощью Asterisk вы сможете реализовать проект любого масштаба - от простого домашнего сервера голосовой почты до телефонного сервера предприятия с функциями IVR (Interactive Voice Response - система голосовых меню).
Сегодня мы рассмотрим простой пример установки и настройки сервера Asterisk для работы с несколькими пользователями.
Можно ли на него посмотреть?
Думаю, что после знакомства со списком возможностей (а это более 70 позиций) у вас возникло желание как можно быстрее взглянуть на Asterisk своими глазами. Спешу вас обрадовать - посмотреть на Asterisk без его установки можно! Для этого воспользуйтесь специальным LiveCD, образами сетевой загрузки для PXE-совместимой сетевой платы или карты CompactFlash [3].
Однако, если вы считаете LiveCD или другие способы "знакомства" излишними, можете сразу перейти к инсталяции, только предварительно давайте разберемся, что именно мы будем устанавливать.
Каким бывает Asterisk
Существует две версии Asterisk - HEAD и STABLE. Первая - версия для разработчиков и "продвинутых" пользователей. Все новые возможности первоначально добавляются именно в HEAD. Версия STABLE, напротив, содержит только проверенные и отлаженные компоненты и модули. В ней функциональность заведомо приносится в жертву стабильности и надежности. Сильно расстраиваться по этому поводу не стоит - немного терпения и все самое "модное" из HEAD плавно перейдет в STABLE.
Итак, для начинающих пользователей, желающих максимально быстро получить работающее и проверенное решение, рекомендуется использовать STABLE-версию. (Её же в силу простоты мы будем описывать в статье.)
Если же вы собираетесь принять участие в процессе разработки Asterisk или просто хотите всегда использовать все самое последнее и новое - устанавливайте версию HEAD.
Процесс установки. Что нам стоит "*" построить
Asterisk является свободно распространяемым продуктом для платформы. Рекомендуемый способ установки - компиляция из исходных кодов. (Существуют бинарные пакеты для Redhat/Fedora, Debian, а также ebuild для Gentoo, правда, как правило, более старой версии по сравнению с тем, что доступно на сайте.) Однако прежде чем что-либо компилировать, необходимо получить исходный код Asterisk. Сделать это можно двумя способами:
n Скачать tarball с официального сайта [1].
n Загрузить исходный код с CVS-сервера проекта.
Первый способ достаточно прост, и вряд ли он вызовет какие-то проблемы, поэтому при установке Asterisk воспользуемся вторым способом. К тому же, если вам потребуется установить HEAD-версию, вам просто придется использовать CVS. (Для Asterisk основной веткой CVS является HEAD, поэтому для загрузки STABLE-версии необходимо указать ревизию (-r v1-0).) Процесс компиляции для обеих веток абсолютно одинаков, поэтому все, что написано далее, применимо и для HEAD, и для STABLE.
Итак, нам понадобятся 3 модуля: zaptel - модуль аналоговой телефонии, libpri - модуль цифровой телефонии, и сам Asterisk. Для загрузки модулей с сервера CVS выполните следующие команды:
# cd /usr/src
# export CVSROOT=:pserver:anoncvs@cvs.digium.com:/usr/cvsroot
# cvs login # введите пароль anoncvs
# cvs checkout -r v1-0 zaptel libpri asterisk
После выполнения последней команды в /usr/src будут созданы соответствующие подкаталоги. Процесс установки достаточно прост - необходимо поочередно зайти в каждый из каталогов и выполнить команды make clean и make install:
# cd zaptel
# make clean install
# cd ../libpri
# make clean install
# cd ../asterisk
# make clean install samples
Последняя команда не только скомпилирует и установит Asterisk, но и скопирует стандартные файлы конфигурации в /etc/asterisk. Вообще установочный скрипт копирует файлы в 3 основных каталога:
n /etc/asterisk - расположение конфигурации;
n /usr/lib/asterisk/modules - место хранения модулей Asterisk;
n /var/lib/asterisk/ - здесь находятся дополнительные файлы asterisk (звуки, agi-скрипты, картинки и т. д.).
Сам же исполняемый файл обычно помещается в /usr/sbin/asterisk.
Для проверки правильности установки выполним следующую команду:
# asterisk -vvvvvcd
Если все нормально, то мы увидим несколько экранов пока еще непонятной для нас информации, заканчивающейся приветствием командного интерфейса Asterisk (см. рис. 1).
Рисунок 1. Консоль Asterisk
Не вдаваясь в подробности, напишем в консоли stop now и перейдем к более детальной настройке.
Чего же мы хотим?
Прежде чем приступить к редактированию конфигурационных файлов Asterisk, давайте определим, что же именно мы хотим от него получить. Итак, нам необходимо:
n Обеспечить возможность разговора абонентов по IP (SIP).
n Создать персонифицированные голосовые ящики (с автоматической отсылкой голосовых сообщений на e-mail).
n Настроить "перехват", передачу и парковку звонков.
С задачей вроде бы определились, поэтому, не откладывая дела в долгий ящик, приступим к ее выполнению.
А ты меня слышишь?
Первое, что мы сделаем с нашим сервером, - научим его обслуживать внутренние звонки. Начнем с редактирования файла /etc/asterisk/sip.conf. Убедимся, что в секции general присутствуют следующие строки:
[general]
context=default
allowguest=no
bindport=5060
bindaddr=0.0.0.0
В первой строке мы определяем контекст, в который будут попадать все входящие звонки. Во второй строке мы запрещаем неавторизованный доступ к нашему серверу, что особенно важно в случае, если Asterisk будет доступен из Интернета. В двух последующих строках мы задаем порт и интерфейс, на котором ожидаем запросы SIP-клиентов.
Теперь несколько слов о самих клиентах - они могут быть как программными (приложение на компьютере), так и аппаратными (автономное устройство, реализующее один из протоколов Asterisk). Для первого знакомства с Asterisk нам вполне хватит возможностей программных клиентов. Наиболее известные из них: X-Ten X-Lite, sjPhone, FireFly, MS Messenger, kPhone. Возможности этих программ лучше всего сравнивать, представив их в виде таблицы (см. таблицу 1).
Таблица 1. Сравнениваем возможности программных клиентов SIP
Возможность |
X-ten xlite |
Sjphone |
FireFly |
MS Messenger |
kPhone |
Поддержка протокола SIP |
+ |
+ |
+ |
+ |
+ |
Поддержка протокола IAX |
- |
- |
+ |
- |
- |
Работа с Asterisk |
+ |
+ |
+ |
+ |
+ |
Поддерживаемые ОС |
Windows |
Windows, Linux |
Windows |
Windows |
Linux |
Поддерживаемые кодеки |
G711, GSM, iLBC, Speex |
G711, GSM, iLBC |
G711, G729 [1] , GSM, iLBC, Speex |
G711 |
G711, iLBC GSM |
Поддержка функций Caller-ID, Call Transfer, Call Hold |
+ |
+ |
+ |
- |
+ |
Интерфейс пользователя [2] |
4 |
5 |
3 |
3 |
2 |
Возможность учета времени разговора |
+ |
+ |
+ |
- |
- |
Доступность |
бесплатно [3] |
бесплатно [3] |
бесплатно |
бесплатно |
бесплатно |
В зависимости от решаемой задачи можно использовать различные программные клиенты. Если ваш сервер будет преимущественно использоваться для внутренних звонков, то имеет смысл обратить внимание на программы с более функциональным интерфейсом (X-lite, sjPhone). В случае большого количества междугородних звонков (либо работы в условиях ограниченной пропускной способности или ненадежного канала) лучше использовать программы, поддерживающие кодек G729 (из бесплатных - firefly). Для тестового примера предположим, что у нас есть 3 пользователя, использующие X-lite, sjPhone и MS Messenger соответственно. Отразим эту информацию в конфигурационных файлах. Начнем с sip.conf:
[200] ; xlite phone
type=friend
host=dynamic
username=200
secret=user1_password
nat=no
canreinvite=no
context=office
callerid="User1" <200>
allow=gsm
allow=ulaw
allow=alaw
[201] ;sjphone
type=friend
host=dynamic
username=201
secret=user2_password
dtmfmode=rfc2833
context=office
callerid="User2" <202>
allow=gsm
allow=ulaw
allow=alaw
[203] ; ms messenger
type=friend
host=dynamic
username=202
secret=user3_password
dtmfmode=rfc2833
context=office
callerid="User3" <203>
allow-ulaw
allow-alaw
Небольшие пояснения по параметрам конфигурации. Поле type, определяющее тип клиента, может принимать три значения:
n user - возможны только входящие звонки;
n peer - возможны только исходящие звонки;
n friend - разрешены как исходящие, так и входящие вызовы.
Поле host позволяет определить IP-адрес, с которого разрешены подключения для данного клиента. В нашем случае задавать такое ограничение особого смысла нет, поэтому оставим динамические адреса (dynamic). Поля username и secret определяют имя пользователя и пароль, которые должны использоваться клиентом при регистрации. Dtmfmode задает способ передачи сигналов DTMF. Параметр nat говорит, может ли данный клиент работать из-за NAT. Canreinvite разрешает (yes) или запрещает (no) установку прямого соединения между участниками (минуя Asterisk). Некоторые клиенты поддерживают строго определенные способы работы, что необходимо отражать в файлах конфигурации. Context - имя контекста, в котором будет находиться данный абонент. CallerID - идентификационная строка, отображается при звонках от данного пользователя (АОН).
После задания всех вышеописанных настроек и сохранения файла sip.conf перейдем к определению номерного плана. Для этого нам понадобится отредактировать файл /etc/asterisk/extensions.conf. Но, прежде чем запустить редактор, давайте более детально посмотрим на то, что входит в стандартную поставку.
Номерной план в Asterisk (Dial plan) задается при помощи так называемых расширений (extension). В файле стандартной установки можно увидеть следующее:
[demo]
exten => s,1, Wait,1
exten => s,n, Answer
exten => s,n, SetVar(TIMEOUT(digit)=5)
exten => s,n, SetVar(TIMEOUT(response)=10)
exten => s,n(restart), BackGround(demo-congrats)
exten => s,n(instruct), BackGround(demo-instruct)
exten => s,n, WaitExten
Обработка контекста demo начинается с записей, в которых "s" является первым символом. Так, сначала Asterisk подождет 1 секунду, потом поднимет трубку и ответит на звонок, установит значения переменных (строки 2, 3), проиграет содержимое файлов demo-congrats и demo-instruct и будет ожидать набора добавочного номера. Следующие строки определяют конкретные номера в контексте demo:
exten => 2,1, BackGround(demo-moreinfo)
exten => 2,n,Goto(s,instruct)
exten => 3,1, SetVar(Language()=fr)
exten => 3,2, Goto(s, restart)
exten => 8500, 1, VoiceMailMain
exten => 8500, n, Goto,s
exten => 1000, 1, Goto(default,s,1)
Итак, определены 4 номера - 2, 3, 8500 и 100. При звонке на номер 2 мы прослушаем сообщение demo-moreinfo, после которого Asterisk перенаправит нас в начало, к сообщению demo-instruct. Набрав номер 3, мы изменим язык данной сессии на французский. (Чтобы Asterisk мог "разговаривать" с вами на французском языке, необходимо наличие соответствующих файлов озвучки в папке /var/lib/asterisk/sounds/fr.) При наборе номера 8500 нам ответит система голосовой почты Asterisk. Номер 1000 отправит нас в начало контекста demo.
Надеюсь, что теперь ситуация с контекстами немного прояснилась. Теперь добавим наши телефоны в этот номерной план. Для этого создадим следующий контекст:
[office]
exten => 200,1, Macro(stdexten,200,SIP/200)
exten => user1, 1, Goto(200|1)
exten => 201,1, Macro(stdexten,201,SIP/201)
exten => user2, 1, Goto(201|1)
exten => 202,1, Macro(stdexten,202,SIP/202)
exten => user3, 1, Goto(202|1)
include => demo
Мы определили три номера и три псевдонима, при наборе которых активируется макрос stdexten, отвечающий за обработку вызовов пользователей. Псевдонимы позволят звонить абоненту не только по его номеру, но и по имени. В качестве параметров макросу передается номер данного пользователя и имя его SIP-устройства. Давайте посмотрим, что же делает этот макрос:
[macro-stdexten]
exten => s, 1, Dial (${ARG2},20,t [4] )
exten => s, 2, Goto(s-$(DIALSTATUS),1)
exten => s-NOANSWER, 1, Voicemail(u${ARG1})
exten => s-NOANSWER, 2, (Goto(default,s,1))
exten => s-BUSY, 1, Voicemail(b,${ARG1})
exten => s-BUSY, 2, (Goto(default,s,1))
exten => _s-., 1, Goto(s-NOANSWER)
exten => a, 1, VoiceMailMain(${ARG1})
Данный макрос звонит указанному пользователю. Если в течение 20 секунд никто не ответил или вызываемый абонент был занят, звонящему проиграется соответствующее сообщение, после чего он получит возможность оставить сообщение голосовой почты. Правда, пока у наших абонентов голосовых ящиков еще нет. Исправим это недоразумение, добавив в файл /etc/asterisk/voicemail.conf следующие строки:
[general]
format=wav49
maxmessage=300
[office]
200 => 123, User1, user1@mail.company.com,,attach=yes
201 => 456, User2, user2@mail.company.com,,attach=yes
202 => 789, User3, user3@mail.company.com,,attach=yes
Этим мы определили 3 ящика голосовой почты для наших пользователей, с паролями 123, 456, 789 соответственно. При поступлении нового сообщения пользователю незамедлительно будет отсылаться e-mail на указанный адрес. Во вложении письма будет присутствовать само голосовое сообщение в формате wav (вместо wav можно использовать любой формат, поддерживаемый сервером). Максимальная длина сообщения - 5 минут. Если в качестве параметра ящика указать attach=no, то высылаться будет только уведомление об оставленных сообщениях. Для того чтобы сообщения отправлялись, нам понадобится определить еще один параметр - команду для отправки почты. По умолчанию она имеет следующий вид:
;mailcmd=/usr/sbin/sendmail -t
Как видно из названия, для работы данной функции необходимо, чтобы на компьютере с Asterisk был установлен почтовый сервер sendmail или другой, имеющий подобной интерфейс вызова (postfix, exim и др.). Информацию по настройке почтового сервера можно найти в [4-6].
Для работы с голосовой почты с телефона в нашем номерном плане используется номер 8500. После ввода номера телефона и пароля пользователь получает доступ к интерфейсу управления своим голосовым ящиком. Помимо стандартных возможностей прослушивания перемещения и удаления сообщений пользователь может самостоятельно записывать персональные приветствия, менять свой пароль или отправлять голосовые сообщения другим пользователям.
На этом базовую настройку Asterisk можно считать законченной, теперь самое время перейти к настройке наших программных клиентов.
Настраиваем X-Lite
Идем на сайт http://www.xten.com. Скачиваем, устанавливаем и запускаем программу X-Lite. При первом запуске программа предложит настроить микрофон и откроет окно настроек SIP прокси-сервера. В этом окне определим следующее:
Enabled - Yes
Display Name - Asterisk
Username - 200
Authorization User - 200
Password - user1_password
Domain/Realm - asterisk
SIP Proxy - 192.168.0.20 [5]
Outbound Proxy - 192.168.0.20
Register - Always
Если все настройки сделаны правильно, то в окне X-Lite мы увидим:
Рисунок 2. X-Lite, зарегистрированный на сервере Asterisk
Теперь можно попробовать позвонить по тестовым номерам стандартной инсталляции - 2, 3, 1000, 1234, 1236, 500, 600, 8500, 200, 201, 202. При звонках на последние два номера вам, скорее всего, ответит Allison Smith - обладательница приятного голоса, которым разговаривает Asterisk. Эти телефоны пока еще не настроены, и о том, как их можно найти, Asterisk еще ничего не знает. Что ж, давайте исправим это недоразумение!
Настраиваем sjphone
Скачиваем с сайта http://www.sjlabs.com программу sjphone. Устанавливаем и запускаем соответствующий файл установки. Для настройки нажимаем на "кнопку с отверткой" (см. рис. 3).
Рисунок 3. Элемент интерфейса sjPhone после установки
Переходим на закладку "Profile" и нажимаем на кнопку "New". Создадим новый профиль "Asterisk" с типом "Calls though SIP Proxy". Перейдем на закладку "SIP Proxy" и введем IP-адрес (или имя) сервера Asterisk и нажмем "ОК" (см. рис. 4).
Рисунок 4. Настраиваем параметры SIP sjPhone
В появившемся окне введем имя и пароль для данного сервера - 201 и user2_password соответственно. После закрытия окна свойств sjphone изменит свой вид. Если данные введены правильно, то мы увидим следующее (см. рис. 5).
Рисунок 5. sjPhone, зарегистрированный на сервере Asterisk
Настраиваем Windows Messenger
Если устанавливать специального клиента не хочется, можно попробовать разговаривать с помощью Windows Messenger. Работа с Asterisk не является для него стандартной возможностью, так что вооружимся редактором реестра и отправимся в путь. Если мы используем Windows Messenger версии ниже 4.7, то нам понадобится следующий ключ реестра: HKEY_CURRENT_USER\Software\Microsoft\MessengerService.
Если же установлена версия 5.1, то ключ будет другим [6] : HKEY_CURRENT_USER\Software\Policies\Microsoft\Messenger.
По данному адресу нам необходимо исправить значение поля CorpPC2Phone с "0" на "1".
Перезапустим Messenger. Из меню откроем "Tools -> Options -> Accounts". В поле "Communications Service Account" введем имя пользователя Asterisk - 202@asterisk. Нажмите на кнопку "Advanced" и в открывшемся диалоговом окне введите адрес сервера Asterisk, попутно отметьте UDP в качестве транспорта. Теперь попробуем подключиться к серверу Asterisk (sign in) с именем 202@asterisk. В случае успеха мы увидим следующее (см. рис. 6).
Рисунок 6. Windows Messenger, зарегистрированный на сервере Asterisk
Итак, теперь все три клиента настроены. Связь можно проверить, позвонив с каждого из них на приведенные выше номера нашего сервера.
Иду на перехват!
Как вы, наверное, уже догадались, сейчас речь пойдет о "перехвате звонков". Для начала несколько слов о том, что же это такое в понимании Asterisk. Допустим, вы слышите, как у человека рядом звонит телефон, а его самого на месте нет. По специфике вашей деятельности вы сами можете ответить на этот звонок, не заставляя звонившего лишний раз обращаться к голосовой почте. Для того чтобы не подходить к телефону физически, можно "перехватить" звонок со своего телефона. Нажав определенную последовательность клавиш, вы сможете ответить на "чужой" вызов. В Asterisk поддерживается два вида таких "перехватов":
n в рамках указанной группы;
n конкретного номера.
Для перехвата конкретного номера вы набираете на телефоне: *8#номер_звонящего_телефона, после чего звонок переключается на ваш номер. Первый способ более универсален. Вы определяете так называемые группы вызова - телефоны, звонки на которые можно перехватывать, а также для каждого из телефонов определяете, какие группы они могут перехватывать (см. рис. 7).
Рисунок 7. Группы вызова и группы перехвата
В нашем случае мы реализуем самый простой вариант перехвата звонков - все телефоны смогут перехватывать звонки друг друга. Для этого внесем некоторые дополнения в файл sip.conf. В секциях описания наших телефонов (200, 201, 202) добавим две строчки:
callgroup=1
pickupgroup=1
Теперь добавим саму возможность "перехвата" звонков, внеся соответствующие изменения в номерной план. В контекст [office] после правил вызова абонентов добавим следующую строчку [7] :
exten => *8,1,PickUP()
Теперь, после перезагрузки номерного плана Asterisk, у нас появится возможность перехвата вызовов. Для этого, когда вы услышите звонок телефона, просто нажмите *8, и разговор будет переключен на ваш телефон.
Можно здесь припарковаться?
Под "парковкой" в Asterisk понимается следующая ситуация: вам кто-то позвонил, в процессе разговора вы поняли, что вам нужно перейти к другому телефону. Вы "паркуете" ваш звонок в определенном месте, подходите к другому телефону и "подключаете" оставленный ранее звонок. Парковка в Asterisk сделана с использованием другой удобной возможности - передачи звонка. Определив некую последовательность символов (по умолчанию это 1#), можно в процессе разговора переводить звонки другим абонентам. Специфика же парковки заключается в том, что есть некие места - парковочные слоты, в которые собеседников можно помещать и забирать.
Давайте разберемся со всем этим на практике. Параметры парковки и передачи вызовов определяются в файле features.conf. В стандартной инсталляции для парковки звонков определяется 20 номеров, начиная с номера 701. Для активации функции убедимся, что файл features.conf содержит следующие данные:
[general]
parkext => 700
parkpos => 701-720
context => parkedcalls
xfersound =beep
xferfailsound = beeper
featuredigittimeout = 1000
[featuremap]
blindxfer => #1
Итак, для "парковки" звонка будем использовать номер 700, при его обратном подключении (или ошибке подключения) мы будем слышать звуковой сигнал, для активации режима передачи звонка будем использовать последовательность #1, при этом пауза между нажатиями кнопок не должна превышать одной секунды.
Теперь внесем изменения в номерной план, добавив в контекст [office] следующую строчку:
include => parkedcalls
Теперь, если во время разговора мы наберем 1#700, звонок "припаркуется" в свободный слот (Эллисон проговорит нам его номер). Затем мы можем подойти к другому телефону (при данных настройках на это у нас есть 45 секунд) и, набрав известный нам номер слота, продолжить разговор с данного телефона.
Включаем межгород (Межгород? Соединяю...)
Для совершения междугородних звонков можно использовать как более "родной" для Asterisk протокол SIP, так и более распространенный среди российских провайдеров IP-телефонии протокол H323. Поддержка H323 появляется после установки определенных модулей (в нашей инсталляции этих модулей пока нет), а вот SIP присутствует по умолчанию. Кроме того, есть как минимум один российский провайдер, работающий с этом протоколом, - сеть Тарио [7]. Работа в данной сети не бесплатна, поэтому предварительно нам придется зарегистрироваться [8] . После этого можно приступить к настройке. Откроем уже знакомый нам файл sip.conf и добавим в него следующие записи [9] :
[tario_out]
type=peer
host=адрес_сервера_tario
username= номер_лицевого_счета_tario
fromusername=номер_лицевого_счета_tario
fromdomain=домен_tario
secret= пароль_tario
usereqphone=yes
Для входящих вызовов:
register => номер_лицевого_счета_tario:пароль@tario_in
[tario_in]
type=user
context=tario_inc
host=ip_адрес_сервера_tario
Для исходящих звонков через этого провайдера будем использовать префикс 8. В контексте [office] добавим следующую строчку:
exten => _8, Dial(SIP/${EXTEN:1}@tario_out,20,rT)
Конструкция EXTEN:1 означает то, что при передаче звонка шлюзу провайдера первый символ будет отбрасываться.
Все входящие звонки от провайдера будем принимать в контекст [tario_inc]. Его можно сконфигурировать примерно так:
[tario_inc]
exten => s,1,Wait, 1
exten => s, 2, Answer
exten => s,3, BackGround(local-welcomе)
exten => s,4, WaitExten
exten => 200,1, Macro(stdexten,200,SIP/200)
exten => 201,1, Macro(stdexten,201,SIP/201)
exten => 202,1, Macro(stdexten,202,SIP/202)
exten => 8500,1, VoiceMailMain
exten => 8500,n, Hangup
При звонке в этот контекст пользователь сначала услышит сообщение local-welcome (сообщение нужно будет предварительно записать), в котором его попросят ввести добавочный номер вызываемого абонента. После введения номера звонящего соединят с требуемым пользователем, если же этот пользователь недоступен, звонивший получит возможность оставить сообщение голосовой почты. Подобно доступу к шлюзу голосовой почты мы также можем предоставить доступ к другим функциям Asterisk.
Несколько слов о безопасности
При определении контекстов, доступ к которым будут получать внешние пользователи, необходимо дважды (а то и трижды) подумать. Так, если бы в последнем примере вместо "ручного" создания правил для дозвона до каждого пользователя мы бы просто написали:
include => office
то все внешние пользователи, звонящие на наш сервер, помимо вполне легального доступа к внутренним номерам и серверу голосовой почты также получили бы не совсем легальный доступ к междугородним звонкам с использованием нашего провайдера. Однако дублировать записи вызова тоже не слишком красиво, поэтому более правильно было бы перенести все доступные извне правила маршрутизации в отдельный контекст [office-rules], а в контексте [office] вместо них написать так:
[office]
include => [office-rules]
exten => _8, Dial(SIP/${EXTEN:1}@tario_out,20,rT
После этого в контексте [tario-inc] вместо повторного перечисления правил дозвона до пользователей можно смело написать include => [office-rules]. При такой схеме office-rules не содержит ничего лишнего, и соответственно воспользоваться нашим "межгородом" внешние пользователи уже не смогут.
Заключение
Итак, сегодня мы рассмотрели основы настройки Asterisk и связанные с этим подробности - файлы конфигурации пользователей, настройки номерного плана, настройки "дополнительных" возможностей, а также способы конфигурации нескольких популярных программных клиентов. На этом наше знакомство с Asterisk не заканчивается. Как вы могли видеть, процесс конфигурации не является очень простым для непосвященного пользователя. Именно это мы постараемся исправить в следующий раз, рассмотрев несколько веб-интерфейсов, значительно упрощающих настройку Asterisk. Кроме того, постараемся более детально изучить "аппаратную" часть телефонных систем на основе Asterisk, а также расширить функциональность созданной сегодня системы.
Приложение
Описание конфигурационных файлов Asterisk
musiconhold.conf |
Настройка параметров "музыки при удержании" MusicOnHold |
cdr_mysql.conf |
Настройка хранения записей о звонках в MySQL |
manager.conf |
Настройка интерфейса Manager |
meetme.conf |
Настройка конференций (meetme) |
mgcp.conf |
Настройка параметров MGCP-устройств |
parking.conf |
Параметры "парковки" вызовов "Call parking" |
voicemail.conf |
Параметры голосовой почты (VoiceMail) |
agents.conf |
Агенты Asterisk |
extensions.conf |
Номерной план Asterisk |
iax.conf |
Настройка IAX-устройств |
modem.conf |
Настройка ISDN с использованием ISDN4Linux |
phone.conf |
Настройка интерфейса телефонии Linux |
vpb.conf |
Настройка аппаратуры Voicetronix |
alsa.conf |
Настройки звукового драйвера ALSA для консольного пользователя |
festival.conf |
Параметры работы с синтезатором речи festival |
modules.conf |
Настройка модулей Asterisk |
zapata.conf |
Настройка аналоговых устройств телефонии digium |
asterisk.conf |
Определение расположения каталогов Asterisk |
indications.conf |
Настройка параметров аналоговых АТС различных стран |
rpt.conf |
Параметры протокола rtp |
logger.conf |
Параметры журналирования Asterisk |
Литература и ссылки:
2. http://www.asterisk.org/index.php?menu=features.
3. http://www.automated.it/asterisk.
4. Шергин Д. Установка IMAP4-сервера на базе Cyrus-imapd + sendmail. - Журнал "Системный администратор", N10, октябрь, 2003 г. - 10-14 c.
5. Бешков А. Архитектура Postfix. - Журнал "Системный администратор", N6, июнь, 2004 г. - 4-8 c.
6. Стахов В. Почтовая система на базе MTA Exim. - Журнал "Системный администратор", N7, июль, 2004 г. - 6-13 c.
9. http://www.asterisk-support.ru.
11. Платов М. Что важно знать об IP-телефонии. - Журнал "Системный администратор", N5, май, 2005 г. - 20-25 c.
[1] Доступно с использованием бесплатной внешней библиотеки.
[2] Здесь приводится субъективная оценка автора.
[3] Поддержка расширенной функциональности доступна в коммерческой версии.
[4] Символ t отсутствует в стандартной конфигурации. Если мы хотим использовать передачу звонков, его необходимо добавить.
[5] IP-адрес или DNS-имя машины с Asterisk.
[6] Если такого пути нет, его необходимо создать. CorpPC2Phone имеет тип DWORD.
[7] Если вам нужно просто включить возможность перехвата для всех абонентов Asterisk, вместо модификации номерного плана можно просто раскомментировать строчку pickupexten в файле features.conf.
[8] О том, как это сделать, вы сможете прочитать на официальном сайте [7].
[9] Предполагается, что подключение к провайдеру производится с компьютера, имеющего реальный интернет-адрес (без NAT).
Asterisk и Linux: миссия IP-телефония
Действие 2
Михаил Платов
В прошлой статье [1] мы познакомились с основными возможностями Asterisk PBX, настроив небольшую мини-АТС, работающую по протоколу SIP. Сегодня мы значительно расширим ее функциональность, добавив поддержку протокола H323 и обеспечив связь с городской сетью.
Альтернативный межгород
В прошлый раз мы предоставили нашим пользователям возможности дешевой междугородной связи. Для этого мы подключили наш сервер к сети одного из провайдеров по "родному" для Asterisk протоколу SIP. Однако, как показывает практика, провайдеры в большинстве своем не спешат переходить на SIP и при предоставлении своих услуг продолжают использовать более традиционный H323. Сильно расстраиваться по этому поводу не стоит - рано или поздно все равно все перейдут. А пока этого не произошло, решим эту проблему со своей стороны - установим H323-модуль Asterisk. На данный момент мне известно о существования четырех различных H323-драйверов (см. таблицу 1) для Asterisk:
n chan_oh323 - исторически первый H323-драйвер для Asterisk. При работе использует RTP-стек библиотеки OpenH323, со всеми вытекающими отсюда последствиями (поддерживаемые кодеки, стабильность, совместимость). Поддерживается компанией inAccess Networks [2].
n chan_h323 - отличительной особенностью данного драйвера является более тесная интеграция с Asterisk (используется Asterisk-реализация протокола RTP), что позволяет достичь большей производительности по сравнению с chan_oh323. Платой же за это является несколько меньшая функциональность. Так, например, chan_h323 не имеет собственного буфера дрожания (jitter buffer) [3], а также не поддерживает некоторые кодеки.
n chan_ooh323c - драйвер компании Objective Systems Inc [4], основанный на их открытом H323 стеке - Objective Open H.323 for C. И хотя количество поддерживаемых кодеков и H323-настроек несколько меньше, чем у конкурентов, драйвер вполне можно использовать. На данный момент статус драйвера - "beta", но со слов разработчиков, модуль в скором времени должен войдет в состав официальной версии Asterisk.
n chan_woomera - драйвер, позволяющий связать Asterisk с сервером Woomera. На данный момент через woomera можно совершать только H323-звонки, хотя в будущем разработчики обещают обеспечить поддержку универсального уровня абстракции OPAL.
Таблица 1. Сравнение H323-драйверов для Asterisk
Драйвер |
Версия |
Входит в поставку Asterisk |
H323-стек |
Характерные минусы |
Характерные плюсы |
|
STABLE |
HEAD |
|||||
chanoh323 |
+ |
+ |
- |
OpenH323 |
Производительность |
Совместимость, поддержка STABLE |
chan_h323 |
+ |
+ |
+ |
OpenH323 |
Проблемы со сборкой, функциональность |
Производительность, поддержка STABLE |
chan_ooh323c |
- |
+ |
- |
OOH323 |
Бета-версия, поддерживаются меньше кодеков |
Производительность |
chan_woomera |
- |
+ |
- |
OpenH323/OPAL |
Бета-версия, необходим сервер Woomera |
Поддержка woomera, большой потенциал функциональности |
Что же выбрать? Ответ на этот вопрос нужно искать исходя из конкретных задач.
Если вы используете STABLE-версию Asterisk, то варианты ограничиваются первыми двумя представителями. При этом, если планируемое количество одновременных звонков, совершаемых через H323, достаточно велико, то более предпочтительным будет chan_h323, если желательна более "качественная" реализация H323, то лучше использовать chan_oh323.
Драйверы chan_ooh323 и chan_woomera можно рекомендовать к использованию разработчикам и "очень продвинутым пользователям", желающим заглянуть в завтрашний день (H323 и SIP поверх IPv6 и т. д.). Для наших же задач возможностей chan_h323 или chan_oh323 будет более чем достаточно. Определенности ради будем считать, что мы выбрали chan_oh323, хотя приведенные ниже настройки с небольшими изменениями будут работать и с chan_h323.
Устанавливаем chan_oh323
Для канальных драйверов Asterisk отсутствуют готовые бинарные пакеты, поэтому воспользуемся единственно возможным способом установки - компиляцией из исходного кода.
При этом будем использовать машину следующей конфигурации:
n CPU AthlonXP 1500+
n MB Epox 8KHA+ (VIA KT266A)
n 512 Мб RAM
n HDD 40 Гб IDE Samsung
n Gentoo Linux Linux 2005.0 (ядро 2.6.12, gcc 3.4.3 и glibc 2.3.4)
Нам понадобятся следующие версии программ и библиотек:
n pwlib 1.6.6
n openh323 1.13.5
n chan_oh323 0.6.6
n Asterisk 1.0.9
Очень большое количество проблем при установке канальных драйверов H323 возникает именно из-за использования других версий pwlib и openh323. Кроме того, у некоторых людей наблюдались трудности при использовании готовых бинарных пакетов, входящих в состав у некоторых дистрибутивов.
Взять нужные версии лучше всего с сайта inAccessNetworks (к сожалению, у меня не получилось собрать openh323 с сайта inAccessNetworks, поэтому я взял эту же версию библиотеки из репозитория исходных кодов Gentoo) [5, 6, 7]. Итак, загружаем чуть меньше 4 Мб исходных кодов в /root/src/oh323 и переходим к установке. Начинать необходимо с pwlib.
# cd /root/src/oh323
# tar xfz ./pwlib-Janus_patch4-src-tar.gz
# cd pwlib
# ./configure
# make opt
# make install
Оптимизированная версия pwlib установлена, переходим к openh323.
# cd ..
# tar xfz ./openh323-v1_13_5-src.tar.gz
# cd openh323
# ./configure
# make opt
# make install
Библиотека OpenH323 собирается достаточно долго (в моем случае на это ушло чуть больше часа). Кроме того, во время компиляции вам понадобятся около 150 Мб дискового пространства и 300 Мб swap.
Теперь перейдем к канальному драйверу chan_oh323:
# cd ..
# tar xfz ./asterisk-oh323-0.6.6.tar.gz
# cd ./asterisk-oh323-0.6.6
# make
# make install
Драйвер установлен. Запустим Asterisk с режимом консоли (asterisk -cvvvvv) и выполним команду:
* CLI> show modules
Модуль chan_oh323 должен присутствовать в списке загруженных модулей (см. рис. 1).
Рисунок 1. Список загруженных модулей Asterisk
Настраиваем chan_oh323
Прежде чем приступить к использованию chan_h323 в Asterisk, нам необходимо предварительно произвести настройку, а также внести соответствующие изменения в номерной план.
Параметры chan_oh323 хранятся в файле /etc/asterisk/oh323.conf. Итак, в контексте [general] определим следующие параметры (для остальных оставим значения по умолчанию):
[general]
listenAddress=IP_адрес_интерфейса
fastStart=yes
inBandDTMF=yes
gatekeeper=IP_адрес_GateKeeper
gatekeeperPassword=secret
context=generic-inc
Здесь мы указали:
n IP-адрес, который chan_oh323 будет использовать для работы с H323-устройствами (очень полезно, если у Linux-машины имеется несколько адресов в различных сетях);
n IP-адрес GateKeeper, пароль, с которым мы будем регистрироваться;
n контекст Asterisk, в который будут попадать все звонки, приходящие со стороны H323;
n включили режим faststart для более быстрой установки H323-соединений;
n сообщили серверу, что тоновые сигналы (DTMF) необходимо передавать внутри RTP-пакетов (inBandDTMF=yes).
Заметим, что приведенные значения параметров не являются "лучшими для всех случаев жизни", просто в моей ситуации именно этот набор вызывает наименьшее количество проблем.
Если провайдер предоставляет нам телефонные номера для входящих звонков, запишем их в секцию [register]:
[register]
context=generic_inc
alias=телефонный_номер_1_от_провайдера
alias=телефонный_номер_2_от_провайдера
Звонки, приходящие на указанные номера, будут попадать в контекст generic_inc (при необходимости звонки на разные номера можно направить в различные контексты).
Для кодеков определим следующие параметры:
[codecs]
codec=G729
frames=6
codec=G711U
frames=20
codec=G729A
frames=6
codec=G729B
frames=6
codec=G729AB
frames=6
codec=GSM0610
frames=4
codec=G7231
frames=4
Данные настройки определяют количество голосовых кадров, упаковываемых в один IP-пакет. Значение по умолчанию ("1") слишком расточительно, поэтому поставим здесь типичные значения для голосового оборудования H323 - "4,6". Заданные параметры будут применены после следующего перезапуска Asterisk (см. "Перезагрузка конфигурации"). Перейдем к изменениям номерного плана. Для входящих звонков (со стороны H323) подойдет контекст, который мы создавали в прошлый раз (ведь по большому счету нам все равно посредством какой технологии до нас дозвонились):
[generic-inc]
exten => s,1,Wait, 1
exten => s, 2, Answer
exten => s,3, BackGround(local-welcomе)
exten => s,4, WaitExten
exten => 200,1, Macro(stdexten,200,SIP/200)
exten => 201,1, Macro(stdexten,201,SIP/201)
exten => 202,1, Macro(stdexten,202,SIP/202)
exten=> 8500,1, VoiceMailMain
exten=> 8500,n, Hangup
А вот для исходящих звонков потребуются некоторые изменения. Добавим в контекст [office] следующую запись:
exten => _6 Dial(OH323/{EXTEN:1},20,rT)
При наборе номера с префиксом "6" звонок будет осуществляться с помощью chan_oh323, т.е. согласно номерному плану провайдера определенному на его GateKeeper.
Если же провайдер не использует Getekeeper (схема терминации на шлюз), то в файле oh323.conf необходимо указать:
gatekeeper=DISABLE
А в номерном плане написать так:
exten => _6 Dial(OH323/prefix{EXTEN:1}@gw_addr,20,rT)
Здесь prefix - служебный номерной префикс провайдера IP-телефонии, а gw_addr - IP-адрес его H323-шлюза.
Выход в город
Как вы могли заметить, на данный момент наша система обладает одним недостатком, несколько затрудняющим ее широкое использование, - отсутствие связи с городской телефонной сетью. Действительно довольно сложно представить себе ситуацию, в которой связь с ТФОП (или c уже существующей мини-АТС) не требовалась. Сейчас мы исправим это недоразумение.
Как вы помните из [3], существуют два основных способа подключения к городской телефонной сети: аналоговый (через стандартный телефонный провод) и цифровой (например, 30 каналов через интерфейс E1). Также нам известно, что "переводом" звонков из телефонной сети в VoIP занимаются шлюзы. Так вот, с Asterisk можно не только использовать обычные шлюзы H323, SIP с портами FXO, FXS, E1, но и специализированные модули выпускаемые специально для Asterisk. Фактически они представляют собой PCI-платы с соответствующими разъемами, необходимой электроникой "на борту", а также драйверами, позволяющими всему этому добру работать с Asterisk.
В город вместе с Digium
Наиболее известным (но не единственным [8]) производителем таких плат является компания Digium [9] - основной спонсор Open Source-проекта Asterisk. Спектр выпускаемых ею плат достаточно велик - от однопортовых FXS и FXO адаптеров, до модулей с четырьмя интерфейсами E1/T1. Платы с аналоговыми портами наиболее привлекательны для малых предприятий (2 платы 4FXO = 8 аналоговых линий (рис. 2)), цифровые модули наиболее интересны средним предприятиям (1 плата 4E1 - 120 цифровых каналов!).
Рисунок 2. Модуль Digum TDM22B (2 FXO + 2 FXS)
С точки зрения стоимости особенно привлекательными являются платы Digium Wildcard X100P/X101P. С ними связана одна интересная история. Первоначально Wildcard X100P/X101P продавалась Digium по цене около 100$. Однако через какое-то время пользователи заметили, что на самом деле эти платы есть ни что иное, как обычные PCI-софт-модемы на широко распространенных чипсетах (Intel 537PU, 537PG, Ambient MD3200, Motorola 62802-51, первые 3 определятся как X101P или generic clone, последний как X100P), продаваемые в обычном компьютерном магазине за 10-15$. После того как эта информация стала общеизвестной, Digium ничего не оставалось, кроме как свернуть продажи линейки X100P/X101P (в последствии ее место занял внешний модуль IAXy). Впрочем, это не означает, что остальные поступили также. Наоборот, во многих online-магазинах эту плату (X100P, X101P или их клоны) по-прежнему можно купить по цене 10-15$. К сожалению, в России софт-модемы на нужных чипсетах не продаются в широкой рознице (у нас более популярны модемы на микросхемах Conexant и Lucent, а не Intel и Motorola), поэтому я заказал эту плату (X101P) через Интернет [10, 11]. Итак, вставим модем в компьютер и настроим его с Asterisk.
Первое, что нам необходимо сделать, - убедиться, что модем определился системой. Для этого выполним команду:
# lspci
Если среди вывода этой утилиты присутствует строчка, похожая на эту:
0000:00:09.0 Network controller: Tiger Jet Network Inc. Intel 537
можете считать, что ядро Linux PCI-плату увидело и можно пробовать загружать ее драйверы:
# modprobe zaptel
# modprobe wcfxo
Если модули загрузились без ошибок, то в /var/log/messages мы увидим следующее:
Found a Wildcard FXO: Generic Clone
Данная строчка является лучшей иллюстрацией того, что с "железом" у нас все в порядке.
Однако прежде чем перейти к настройке Asterisk остановимся на еще одном важном моменте. Дело в том, что платы Digium реализуют "телефонный" интерфейс (FXO, FXS, E1, T1) программно (в zaptel-драйвере), используя для этого вычислительные ресурсы компьютера (в то время как производители других систем телефонии используют специализированные (и более дорогие) сигнальные процессоры - DSP). При этом ввиду специфики задачи (быстрая обработка сигналов) работа с платой ведется в режиме прерываний. Поэтому для нормальной работы очень важно настроить систему так, чтобы платы Digium ни с кем не делили одно прерывание, в противном случае возможны ухудшения качества звука. Посмотрим, как с этим обстоит ситуация у нас:
# cat /proc/interrupts
0: 384085652 XT-PIC timer
1: 287894 XT-PIC i8042
2: 0 XT-PIC cascade
8: 2 XT-PIC rtc
9: 0 XT-PIC acpi
10: 181360 XT-PIC wcfxo
11: 48942244 XT-PIC hci_hcd, uhci_hcd, uhci_hcd, eth0
12: 2690249 XT-PIC i8042
14: 810676 XT-PIC ide0
15: 699164 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
Все нормально, плата монопольно использует прерывание 10. Перейдем к настройке Asterisk. Первым делом отредактируем файл /etc/zatel.conf:
fxsls=1
loadzone=us
defaultzone=us
Первая строчка означает, что для платы 1 необходимо использовать сигнализацию FXS loop-start (в Asterisk для плат FXO используется сигнализация FXS, и, наоборот; если при указанных настройках сервер не будет определять сигнал "занято", попробуйте другие разновидности fxs-сигнализации: fxs_ks, fxs_gs). Если плат в системе несколько (например, две), то в первой строчке нужно написать fxsks=12.
Строки 2 и 3 определяют параметры телефонной сети для используемого оборудования (частоты тоновых сигналов, их длительность и т. д.). К сожалению, в списке доступных стран России нет, поэтому, для того чтобы в вашем конкретном случае все заработало, возможно, придется перебрать несколько стран. Список всех доступных вариантов проще всего посмотреть в исходном тексте - файл zonedata.c библиотеки zaptel.
Следующим шагом при настройке нашего сервера является определение параметров карты в файле /etc/asterisk/zapata.conf. Выбор значения того или иного параметра определяется конкретной АТС, к которой мы подключаем Asterisk. Как известно, в России могут встречаться различные типы АТС. Привести универсальную конфигурацию, подходящую для всех случаев жизни, достаточно сложно, поэтому ограничимся описанием двух наиболее типичных - с импульсным набором (для старых АТС), с тоновым набором (для более-менее новых АТС). Итак, вначале определим общие параметры, подходящие практически для всех АТС:
[channels]
context=[generic-inc]
signalling=fxs_ls
group=1
callgroup=1
pickupgroup=1
busydetect=yes
busycount=5
channel=1
Замечание. Приводимые параметры сгруппированы для более удобного изложения. При фактическом редактировании файла Zapata.conf настоятельно рекомендуется сохранять порядок, принятый в файле.
Итак, мы задали контекст, в который будут попадать все телефонные звонки, приходящие со стороны ТФОП. Определили тип сигнализации, используемой Asterisk при работе с FXO-портом.
Кроме того, мы создали группу каналов (состоящую из одной телефонной линии), включили распознавание сигнала "занято" (параметр busycount определяет количество коротких гудков, необходимое для того, чтобы Asterisk освободил линию), а также разрешили перехват звонков с ТФОП.
Теперь перейдем к параметрам, определяемым в зависимости от возможностей конкретной АТС:
callerid=asreceived
callprogres=yes
usecallerid=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
Первой строкой мы сказали, что сигналы "европейского АОН", приходящие из города, нужно передавать в Asterisk без изменений. Вторая строка включает отслеживание состояния линии (сигналы вызова, ответ, занято) при звонках. (На данный момент эта опция является экспериментальной и может работать некорректно). Следующие 3 строки актуальны, если телефон, подключенный к данной линии, может нормально работать с flash (извещение о входящем вызове, конференц-связь, АОН должны поддерживаться и быть активизированы на АТС). Последние два параметра разрешают парковку и передачу звонков с ТФОП.
Заметим, что приведенные выше настройки актуальны для более-менее современных АТС (электронные, цифровые). Для их престарелых собратьев (координатных, шаговых, декадно-шаговых) вышеперечисленные параметры, скорее всего, придется установить в "no". Кроме того, для активизации импульсного набора нужно будет добавить следующую строчку:
pulsedial=yes
В независимости от АТС нам, скорее всего, понадобится включить подавление "эха" для zaptel-каналов. Для этого добавим следующие две строчки:
echocancel=yes
echocancelwhenbridging=yes
Если же с помощью этих настроек полностью избавиться от эха не удается, можно дополнительно задействовать следующие:
echotraining=yes
txgain=0.0
rxgain=0.0
Первой строкой мы включаем режим тренировки эхоподавления (полезно, если "эхо" регулярно слышно в начале разговора), а последними двумя задаем усиление для входного и выходного сигналов. Для определения конкретных значений последних можно воспользоваться утилитой ztmonitor, входящей в модуль zaptel.
Перейдем к настройке номерного плана. В качестве префикса для выхода в город будем использовать цифру "5". В уже знакомый нам контекст [office] добавим следующую строку:
exten=> _5.,1,Dial(ZAP/g1/EXTEN:1,20,rT)
Этим мы указали Asterisk, что если все номера, начинающиеся с цифры 6, должны передаваться на группу каналов 1 zaptel-интерфейса. Первая цифра набранного номера будет отбрасываться сервером Asterisk.
Необходимо заметить, что способ маршрутизации звонков с использованием префиксов не является единственным. Так ничто не мешает использовать нам следующую конструкцию:
[pstn-dialout]
exten => s,1,Wait, 1
exten => s,2, Answer
exten => s,3, BackGround(pstn-announce)
exten => s,4, Read(ext)
exten => s,5, Dial(ZAP/g1/${ext:1},20,rT)
[office]
exten => 101,1,Goto(pstn-dialout,s,1)
Таким образом, при наборе номера 101 Asterisk перейдет в контекст pstn-dialout, зачитает приветствие pstn-announce (которое необходимо предварительно записать), после чего совершит звонок в город по введенному нами номеру. Подобную схему можно с успехом использовать и для других технологий (H323, SIP).
Выход через SIP-шлюз
К сожалению, далеко не всегда имеется возможность использования оборудования Digium. Например, в ввиду физических ограничений иногда бывает несколько затруднительно установить PCI-платы в стандартные стоечные серверы (1U, 2U). Кроме того, рынок оборудования IP-телефонии в России все еще находится в состоянии, близком к зачаточному, и найти в продаже платы Digium по разумным ценам может быть несколько проблематичным.
Для решения этих проблем рассмотрим альтернативный вариант сопряжения Asterisk с городской сетью - c помощью "внешних" голосовых шлюзов. Теоретически совместно с Asterisk можно использовать любые из шлюзов, поддерживающих протоколы SIP/H323/SCCP, однако, по моему мнению, на практике совместно с Asterisk лучше использовать шлюзы c протоколом SIP. Наиболее известными производителями таких устройств (совместимых с Asterisk) являются - Cisco, Mediatrix, Quintum, AddPac, VegaStream и D-Link.
В качестве примера рассмотрим сопряжение Asterisk с городской сетью с использованием шлюза AddPac AP200D. Данный шлюз представляет собой отдельное устройство, имеющее 2 порта FXO (рис. 3).
Рисунок 3. Шлюз IP-телефонии AddPac AP200D (2FXO)
Устройство поддерживает все наиболее популярные способы конфигурации (console, telnet, web, EMS), а его командный интерфейс очень сильно похож на интерфейс устройств Cisco (таким образом, с некоторыми поправками приведенное ниже применимо и к голосовому оборудованию Cisco). Для базовой конфигурации устройства необходимо определить сетевые и голосовые параметры. И если с первыми все достаточно просто (нужно всего лишь определить стандартные настройки - IP-адрес, маску подсети и маршрут по умолчанию), то со вторыми могут возникнуть затруднения. Остановимся на них более подробно.
При описании голосовых параметров ключевым является понятие dial-peer - точка, участвующая в голосовом соединении. Существует два типа dial-peer (см. рис. 4):
n POTSdial-peer - описывает параметры соединения с традиционной телефонной сетью. POTS dial-peer "привязываются" к аппаратным портам (FXO, FXS) шлюза.
n VOIPdial-peer - описывает параметры соединения с VoIP-сетью. Для простоты понимания VOIP dial-peer можно ассоциировать с Ethernet-разъемом шлюза.
Для минимальной настройки нам понадобится сконфигурировать два dial-peer (по одному каждого типа), а также определить правила маршрутизации между ними внутри нашего шлюза. POTS dial-peer "привяжем" к FXO-линии, а VOIP dial-peer "настроим" на Asterisk. Звонок из ТФОП на наш сервер будут делаться с помощью донабора внутреннего номера. При наборе городских номеров из Asterisk будем добавлять префикс "9" перед исходным номером.
Для конфигурирования воспользуемся telnet-интерфейсом шлюза. Для этого подключимся к устройству и перейдем в интерфейс конфигурирования с помощью команды conf:
AP200# conf
Enter configuration commands, one per line. End with CNTL/Z
AP200(config)#
Создадим POTS-dial-peer с номером 0 (для второго порта нужно произвести аналогичные действия):
AP200(config)# dial-peer voice 0 pots
AP200(config-dialpeer-pots-0)#
Определим для него следующие параметры:
dial-peer voice 0 pots
destination-pattern 9T
port 0/0
user-name 100
user-password potsfxopwd1
Только что мы сказали, что все звонки, приходящие на шлюз и начинающиеся с номера "9", должны уходить на первый порт FXO, ассоциированный с dial-peer 0. При звонках из ТФОП на указанный FXO-порт шлюз будет аутентифицироваться на Asterisk с использованием указанных имени пользователя и пароля. Правда, для этого устройству предварительно необходимо указать, где именно находится Asterisk, которому будут передаваться звонки из ТФОП. Опишем VOIP dial-peer:
AP200(config)# dial-peer voice 1000 voip
AP200(config-dialpeer-voip-1000)#
Определим следующие параметры:
dial-peer voice 1000 voip
destination-pattern T
session target sip-server
session protocol sip
dtmf-relay rtp-2833
no vad
Перейдем в контекст определения настроек sip user-agent:
AP200(config)# sip-ua
AP200(config-sip-ua)#
Зададим следующие параметры:
sip-ua
user-register
sip-server 192.168.0.20
register e164
Этим мы сказали шлюзу, что SIP-сервер находится по адресу 192.168.0.20. и при регистрации на нем необходимо использовать e164-номер (международный стандарт, определяющий правила нумерации абонентов в телефонных сетях) и пароль, указанными для POTS dial-peer. Теперь разберемся со "служебным" префиксом "9". Очевидно, что передавать его в ТФОП нельзя, поэтому его необходимо отбрасывать. Делать это можно как на Asterisk (см. выше примеры для межгорода и плат Digium), так и непосредственно на шлюзе. Воспользуемся вторым способом. Для этого создадим translation-rule и применим его к POTS dial-peer:
AP200(config)# translation-rule 0
AP200(config-translation-rule#0)# rule 0 9T T
AP200(config-translation-rule#0)# exit
AP200(config)# dial-peer voice 0
AP200(config-dialpeer-pots-0)# translate-outgoing called-number 0
Теперь при наборе номера через первый голосовой порт FXO префикс "9" будет отбрасываться.
Рисунок 4. POTS и VOIP dial-peer
Итак, с настройками шлюза мы закончили. Применим конфигурацию и перейдем к настройке Asterisk:
AP200(config)# write
Do you want to WRITE configuration ? [y|n] y
Writing configuration....done
AP200(config)# reboot
System Reboot...
Для того чтобы использовать шлюз из Asterisk, нам понадобится создать для него учетную запись SIP, а также внести необходимые изменения в номерной план. Добавим в файл /etc/asterisk/sip.conf следующие строки:
[100] ;AP200
type=friend
host=dynamic
username=100
secret= potsfxopwd1
dtmfmode=rfc2833
context=generic-inc
Звонки из ТФОП будем направлять в наш стандартный контекст для входящих звонков - generic_inc.
Для исходящих звонков добавим в контекст [office] следующую строчку:
exten => _9,Dial(SIP/EXTEN@100,20,rT)
Перезапустим Asterisk.Через некоторое время шлюз зарегистрируется на сервере, о чем можно будет узнать, выполнив на нем следующую команду:
AP200# show sip
Proxyserver Registration Information
proxyserver registration option = e164
Proxyserver list :
---------------------------------------------------------------
Server address Port Priority Status
---------------------------------------------------------------
192.168.0.20 5060 128 Registered(E.164)
Proxyserver registration status :
------------------------------------------------
UserName Regist Status
------------------------------------------------
100 yes Registered
Теперь мы можем звонить не только нашим соседям по офису, но и любым абонентам городской телефонной сети!
Заключение
Оглядываясь на проделанное, можно смело сказать - теперь у нас есть полноценная (по функциональности) мини-АТС. Изучение Asterisk на этом не заканчивается! В следующий раз мы более подробно остановимся на способах облегчения управления сервером, рассмотрев установку различных веб-интерфейсов.
До встречи!
Приложение
Полезные советы
Запись звуков
При создании голосовых меню часто возникает необходимость использования собственных файлов озвучки. Звуковые файлы, используемые в Asterisk, хранятся в формате gsm. Наиболее просто и быстро записать такие файлы можно с помощью самого Asterisk. Для этого в номерном плане можно создать специальный контекст со следующим содержанием:
[gsm-record]
exten => 150,1,Wait(2)
exten => 150,2,Record(testrecord:gsm)
exten => 150,3,Wait(2)
exten => 150,4,Hangup
exten => 151,1,Playback(testrecord2)
exten => 151,2,Wait(2)
exten => 151,3,Hangup
Позвонив на номер 150, мы сможем наговорить необходимый текст, который будет сохранен в стандартной папке звуков Asterisk (/var/lib/asterisk/sound) в файле ivrrecording.gsm. Прослушать содержимое этого файла можно, позвонив по номеру 151.
Помимо записи с помощью Asterisk можно использовать специальные утилиты конвертации форматов, например sox [12]:
# sox inputfile.wav -r 8000 -c 1 outputfile.gsm resample -ql
Перезагрузка конфигурации
Как вы могли заметить, после редактирования конфигурационных файлов мы всегда перезапускали сервер. Действительно для некоторых модулей (например, zaptel и oh323) такая операция обязательна. Однако при незначительных изменениях (добавление нового устройства, изменение номерного плана и т. д.) полного перезапуска сервера можно избежать. Для этого в консоли asterisk достаточно выполнить следующую команду:
*CLI > reload
Ежедневная перезагрузка
Некоторые пользователи [13] отмечали проблемы с утечками памяти при очень интенсивном использовании Asterisk. Эта проблема в той или иной степени присуща всем продуктам и вызвана ошибками в исходном коде. Безусловно, самым правильным способом ее решения является исправление исходного кода. Однако в качестве временной меры (до тех пор пока ошибки в коде не будут исправлены разработчиками) можно предложить регулярно (для профилактики) перезапускать сервер с Asterisk в свободное время, например, ночью. Для этого можно добавить в файл /etc/crontab строку следующего содержания:
0 0 * * * root /etc/init/asterisk restart> /dev/nu
Восстановление после сбоев
Не исключено, что во время работы процесс Asterisk "совершит недопустимую операцию и будет закрыт". (И хотя такая ситуация для STABLE-версии является из ряда вон выходящей, не учитывать ее появление для "боевой" системы все же нельзя.) Как это отразится на пользователях?
Думаю, что не нужно быть пророком, чтобы понимать, что в этом случае связи не будет. Возможным решением этой проблемы может быть сокращение общего времени простоя сервиса путем его быстрого перезапуска. Для Asterisk эта возможность является практически стандартной - достаточно просто для запуска использовать файл asterisk_safe (вместо asterisk). Теперь при "авариях" сервис будет перезапускаться автоматически. В принципе аналогичного результата можно добиться и с помощью простого shell-скрипта, выполняемого по cron.
Литература и ссылки:
1. Платов М.В. Asterisk и Linux: миссия IP-телефония. - Журнал "Системный администратор", N6, 2005 г. - 12-19 c.
2. http://www.inaccessnetworks.com/projects/asterisk-oh323.
3. Платов М. Что важно знать об IP-телефонии. - Журнал "Системный администратор", N5, 2005 г. - 20-25 c.
4. http://obj-sys.com/open/index.shtml.
5. http://www.inaccessnetworks.com/ian/projects/asterisk-oh323/Libraries/pwlib-Janus_patch4-src-tar.gz.
6. ftp://ftp.gtlib.cc.gatech.edu/pub/gentoo/distfiles/openh323-v1_13_5-src.tar.gz.
7. http://www.inaccessnetworks.com/projects/asterisk-oh323/download/asterisk-oh323-0.6.6.tar.gz.
8. http://www.voipsupply.com/index.php?cPath=99.
10. http://www.goods2world.com.
13. http://sox.sourceforge.net.
14. http://www.voip-info.org/tiki-index.php?page=Asterisk+administration.
Asterisk и Linux: миссия IP-телефония
Действие 3
Михаил Платов
Соединив нашу мини-АТС с "городом" [1], мы уже получили привлекательное решение, способное обеспечить связью сотрудников небольшого офиса. Но не будем останавливаться на достигнутом - рассмотрим несколько веб-интерфейсов, значительно облегчающих работу как пользователей, так и администраторов Asterisk.
Послушаем почту?
Как вы помните, для проверки голосовой почты в нашем номерном плане есть специальный номер - 8500. Позвонив на него и введя личный пароль, наши пользователи могли прослушать оставленные им сообщения. Правда, иногда такой способ доступа бывает несколько неудобен (например, вы находитесь в другом городе или просто под рукой нет телефона). Для решения этой проблемы можно отсылать записанные сообщения на e-mail (см. [2]) или организовать централизованный доступ через Интернет с использованием безопасного SSL-соединения. Отрадно то, что в состав стандартного дистрибутива Asterisk веб-интерфейс для работы с голосовой почтой уже входит, просто в целях безопасности автоматически он не устанавливается. Что, впрочем, не мешает нам сделать это самостоятельно. Для работы данного интерфейса необходим веб-сервер apache с пакетом perl-suid. Краткости ради будем считать, что эти пакеты у нас уже установлены и работают, а веб-сервер сконфигурирован так, что cgi-bin расположен в /var/www/cgi-bin, и cgi-скрипты, входящие в стандартную поставку, выполняются без проблем. Итак, перейдем в каталог /usr/src/asterisk и выполним команду make webvmail. Программа make скопирует все необходимые файлы и выдаст следующее предупреждение:
+--------- Asterisk Web Voicemail ----------+
+ +
+ Asterisk Web Voicemail is installed in +
+ your cgi-bin directory. IT USES A SETUID +
+ ROOT PERL SCRIPT, SO IF YOU DON'T LIKE +
+ THAT, UNINSTALL IT! +
+ +
+-------------------------------------------+
Если использование setuid вас устраивает, проигнорируйте это сообщение и перейдите к следующему шагу. В противном случае вы можете воспользоваться специальным патчем для Asterisk, описанным в [3].
Отредактируем файл скрипта vmail.cgi, определив следующее значение для контекста по умолчанию:
context="office"
Откроем ваш любимый браузер и введем URL только что установленного интерфейса (в моем случае это будет http://ast-test/cgi-bin/vmail.cgi). Если все было сделано правильно, то мы увидим следующее (см. рис. 1).
Рисунок 1. Окно входа веб-интерфейса системы голосовой почты
Введя имя пользователя (номер телефона) и пароль, мы попадем в папку "Входящие" нашего ящика (см. рис. 2).
Рисунок 2. "Входящие" сообщения голосовой почты
Пользователей linux-систем придется немного расстроить - воспроизведение в браузере через плагин (кнопка play) скорее всего не заработает, и для прослушивания сообщений придется загружать файлы на компьютер (кнопка download), а вот с Windows все нормально (см. рис. 3).
Рисунок 3. Прослушивание сообщения голосовой почты
При организации работы из Интернета рекомендуется ограничить доступ к странице средствами веб-сервера, а также настроить использование SSL (https://) для безопасной передачи паролей.
Виртуальный "круглый стол"
Возможности современных систем телефонии не ограничиваются ведением разговоров между двумя абонентами. С помощью специального режима - конференц-связь - возможно организовать одновременное общение нескольких человек. Системы разного "калибра" отличаются максимально допустимым количеством конференций, а также числом участников в них. И если в недорогих офисных мини-АТС количество собеседников, как правило, невелико (не больше 8-10 человек), то в Asterisk их максимальное число ограничивается лишь аппаратными возможностями используемого сервера. Существует как минимум 3 известных модуля, предоставляющих возможности конференций для Asterisk:
n MeetMe
n Conference
n MeetMe2
MeetMe является исторически первым приложением, предоставившим возможности конференций. Модуль является достаточно функциональным и позволяет решать широкий класс задач. Несмотря на то что MeetMe входит в стандартную поставку Asterisk, для его работы необходимы высокоточные таймеры, присутствующие в аппаратуре Digium. Модуль conference же, напротив, не требует наличия zaptel-устройств, однако он предоставляет несколько меньшую функциональность. Отличительной особенностью conference является более эффективное использование ресурсов сервера, что позволяет обеспечивать одновременную работу большего числа пользователей. MeetMe2 является переработанной версией MeetMe. Наиболее значимые отличия - хранение конфигурации в СУБД и несколько другие возможности управления.
Все модули имеют схожую схему использования. После звонка по определенному номеру абонент попадает в "виртуальную комнату". Как только в "комнате" окажутся хотя бы два участника, начнется разговор. В конференциях существует 3 типа пользователей: "слушатели", "ораторы" и "администраторы". "Слушатели" лишены права голоса, "ораторы" могут не только слушать, но и разговаривать. На "администраторов" возлагаются обязанности управления - изменение статуса, удаление и добавление пользователей, открытие и закрытие "комнаты" и т. д. Основы работы с конференциями рассмотрим на примере модуля MeetMe.
Как было сказано выше, для работы MeetMe необходимы высокоточные таймеры, присутствующие в оборудовании Digium. Если же никаких плат в машине с Asterisk нет, не расстраивайтесь, есть несколько способов программной эмуляции таймеров! Одним из них мы сейчас и воспользуемся. Этот способ применим для ядер 2.4.x (с модулем usb_uhci) и 2.6.x. Откроем Makefile библиотеки zaptel и уберем комментарий (символ "#") перед ztdummy. Для zaptel 1.0.9 это строка 61. После этого пересоберем библиотеку (make & make install) и попробуем загрузить модуль ztdummy:
# modpobe ztdummy
Убедимся, что у нас это получилось:
# lsmod |grep ztdummy
ztdummy 3620 0
zaptel 225732 1 ztdummy
Настроим автоматическую загрузку модуля, добавив соответствующую запись в стартовые скрипты системы (в случае Gentoo это будет строка в одном из файлов внутри /etc/modules.autoload.d). После этого можно смело приступать к настройке конференций.
Определим "место встречи" (conference room) пользователей. Для этого в файл /etc/asterisk/meetme.conf добавим следующее:
[rooms]
conf=> 400
Этим мы создали "комнату" с номером 400. Теперь сделаем в ней "дверь". Для этого в файл extensions.conf добавим следующие строки:
[confs]
exten => 400 , 1, Meetme, 400
[office]
include=> confs
Перезапустите Asterisk и позвоните на номер 400 со всех телефонов. Пользователи попадут в общую "комнату" N400 и смогут одновременно общаться друг с другом.
Кроме статического описания "комнат" конфереций (пример, который мы только что рассмотрели), MeetMe также может создавать их динамически. В этом случае человек, открывающий "комнату", определяет для нее соответствующий пароль доступа. После этого он сообщает номер комнаты и пароль остальным участникам, и они начинают обсуждение. А любители подслушивать телефонные разговоры в это время злобно грызут ногти и кусают локти.
Реализовать эту возможность на практике можно с помощью следующей конструкции номерного плана:
[confs-dynamic]
exten => 500, 1,MeetMe(|MD)
[office]
include => confs-dynamic
Теперь сделаем еще один шаг в сторону "идеального сервера" и установим веб-интерфейс для управления конференциями. С его помощью можно легко и просто подключать и отключать участников, давать и отбирать "право" голоса, да и вообще - просто наблюдать за тем, что происходит в наших "комнатах". Для работы с интерфейсом нам так же, как и с голосовой почтой, понадобится веб-сервер, только теперь с интерпретатором PHP. Будем считать, что все это у нас имеется, поэтому без промедлений приступим к установке.
Первым делом скачаем с [12] архив с Web-MeetMe и распакуем его в Apache_DocumentRoot/meetme. Зайдем в каталог phpagi и скопируем файл phpagi.example.conf в /etc/asterisk/phpagi.conf. Внесем в этот файл некоторые изменения:
server=127.0.0.1
port=5038
username=webmm
secret=webmmpw
Данное приложение для свой работы использует командный интерфейс управления Asterisk (Asterisk Manager Interface - AMI). В целях безопасности по умолчанию он отключен, нам же потребуется его включить. Для этого отредактируем файл /etc/asterisk/manager.conf:
[general]
enabled = yes
port = 5038
bindaddr = 127.0.0.1
[webmm]
secret = webmmpw
permit=127.0.0.1
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
С конфигурационными файлами теперь все нормально, а вот с самими PHP-скриптами не очень. Дело в том, что web-meetme написан с учетом того, что переменная PHP RegisterGlobals определена как "On". Из соображений безопасности, начиная с PHP-4.2.0, значение по умолчанию для этой переменной - Off. Поэтому, для того чтобы скрипты заработали, необходимо либо поменять значение RegisterGlobals в файле php.ini, либо модифицировать файл conf_control.php, добавив в его начале следующие строки:
getpost_ifset(array('confno'));
getpost_ifset(array('action'));
getpost_ifset(array('user_id'));
Кроме того, для нормальной работы с версией Asterisk 1.0.9 мне пришлось закомментировать строку 113 (вызов break) в файле conf_control.php.
Если интерфейс установился нормально, то в браузере мы увидим следующее (см. рис. 4).
Рисунок 4. Интерфейс управления конференциями
Системный телефон
Неотъемлемым атрибутом любой мини-АТС является системный телефон. С его помощью оператор может полностью контролировать состояние мини-АТС (какие линии в данный момент свободны, какие заняты и т. д.). Более функциональным аналогом системного телефона для Asterisk является Flash Operator Panel. C помощью FOP можно переключать и завершать звонки, просматривать запаркованные вызовы, следить и управлять конференц-комнатами, да и просто наблюдать за тем, что происходит с Asterisk.
С точки зрения администратора, FOP является клиент-серверным приложением. В качестве клиента выступает flash-приложение, выполняемое в любом из популярных браузеров (IE, Opera, Mozilla/Firefox). Серверная часть представлена perl-скриптом, в реальном времени получающим от Asterisk информацию о совершаемых в нем действиях. На момент написания этих строк последняя доступная версия FOP - .22 (см. рис. 5). Домашняя страница проекта - [4].
Рисунок 5. Структура Flash Operator Panel
При работе с Asterisk FOP также использует Asterisk Manager Interface. Таким образом, первое, что нам нужно будет сделать, - добавить в файл manager.conf соответствующую разрешающую запись:
[fop_user]
secret = superfopsecret
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
Теперь перейдем к FOP. Настройки серверной части задаются в файле op_server.cfg. Наиболее значимыми для нас параметрами являются:
manager_host=127.0.0.1
manager_user=fop_user
manager_secret=superfopsecret
Этим мы указали perl-серверу, где и как нужно искать Asterisk. К слову, с помощью FOP можно отслеживать состояние несколько серверов Asterisk. В этом случае надо продублировать эти строки необходимое количество раз, задав в них соответствующие параметры других серверов.
flash_dir=/var/www/html/fop
web_hostname=ast-test
security_code=fop_pwd
poll_voice_mail=1
Первой строкой мы задали местоположение файлов панели. Второй - имя, по которому к серверу будут обращаться клиенты (это необходимо для того чтобы FOP правильно формировал URL в процессе своей работы). Параметр security_code назначает пароль, который необходимо будет вводить для выполнения действий (переключение, завершение звонков). Четвертый параметр говорит серверу о том, что ему следует периодически самостоятельно проверять состояние голосовых ящиков (без использования AMI). Данный параметр необходим в случаях, если для доступа к почте используется веб-интерфейс. Следующие настройки касаются работы с конференциями:
conference_context=confs
barge_rooms=400
barge_muted=1
Первая строка тривиальна - контекст номерного плана, содержащий внутренний номер для доступа к конференции.
А вот на последних двух остановимся более подробно. Дело в том, что с помощью fop можно "собирать" людей в конференции. Третий параметр очень полезен в тех ситуациях, когда оператору необходимо прослушать разговор других абонентов. При значении "1" у пользователей, добавляемых FOP к конференции, будет "отключены микрофоны", таким образом можно незаметно подключать участников к конференции или организовывать прослушивание разговоров оператором. При необходимости "микрофон" можно включить, воспользовавшись все тем же веб-интерфейсом. Строкой barge_rooms мы определяем те номера "комнат", которые будут использоваться для реализации этой возможности. Кроме того, на панели FOP можно группировать кнопки по контекстам. Для этого перед ними необходимо написать имя соответствующего контекста.
Параметры визуализации (клиентская часть) задаются в файле op_buttons. Синтаксис его достаточно прост. Сначала описываются кнопки, отвечающие за абонентов Asterisk:
[SIP/200] ; имя абонента
Position=1 ; номер кнопки на консоли
Label="Vasya" ; надпись на кнопке
Extension=200 ; номер абонента
Context=office ; контекст, в котором определен абонент
Mailbox=200@office ; ящик голосовой почты пользователя
Icon=1 ; номер иконки для данного пользователя (то 1 до 6)
Чтобы не определять настройки для каждого пользователя вручную, можно задать общее описание с использованием регулярного выражения:
[_SIP/.*]
Position=n ; использовать следующий незанятый номер
Label="SIP Users"
Extension=-1 ; на эту кнопку перенаправлять звонки нельзя
Context=generic_inc
Icon=2
Для отображения состояния места парковки воспользуемся следующим:
[PARK701]
Position=n
Icon=3
Extension=700
Label="Park 701"
А вот так опишем "комнату" конференций:
[400]
Position=n
Label="Meetme 400"
Extension=400
Context=confs
Icon=6
Следующие строки покажут нам состояние внешней zaptel-линии:
[Zap/1]
Position=10
Label="External 1"
Extension=-1
Icon=2
Для большего удобства на панели можно нарисовать разделяющие прямоугольники и вспомогательные подписи. Сделать это можно, отредактировав файл, отвечающий за визуальное представление - op_style.cfg.
В качестве последнего штриха настроим автоматический запуск perl-сервера при старте системы. Для этого можно воспользоваться одним из готовых скриптов, входящих в состав дистрибутива (есть скрипты для Debian и Redhat) или просто прописать вызов op_server.pl (или safe_opserver) в стартовых скриптах вашего дистрибутива.
Единый центр управления
Как вы могли заметить, настраивая Asterisk, мы редактировали те или иные конфигурационные файлы. Некоторым такой способ администрирования может показаться несколько неудобным. В таком случае рекомендую посмотреть в сторону Asterisk Management Portal. AMP представляет собой веб-приложение, позволяющее управлять настройками Asterisk с помощью популярного веб-браузера. Для лучшего понимания его работы обратимся к следующей схеме (см. рис. 6).
Рисунок 6. Связь AMP и Asterisk
Управление производится следующим образом: посредством веб-интерфейса администратор редактирует базу данных, задавая в ней необходимые параметры (добавление/удаление пользователя, смена пароля, изменение правил маршрутизации и т. д.). Затем, по информации, хранимой в этой базе, веб-сервер обновляет конфигурационные файлы Asterisk и с помощью AMI сообщает серверу о том, что настройки необходимо применить заново. Кроме того, используя дополнительный модуль (веб-интерфейс, для которого также входит в состав AMP), Asterisk помещает информацию о всех совершенных звонках непосредственно в MySQL, что открывает дополнительные возможности для анализа исходящего голосового трафика организации.
После некоторого практического изучения данного продукта сложилось впечатление, что больше всего AMP подходит для 2 групп пользователей:
n Начинающие пользователи, имеющие лишь общее представление об Asterisk.
n Администраторы, уже имеющие опыт работы с Asterisk, без труда разбирающиеся в его конфигурационных файлах и желающие упростить выполнение некоторых наиболее типичных задач.
Для первой группы пользователей AMP позволит настроить наиболее популярные вещи, не вдаваясь при этом в дебри конфигурационных файлов с их многочисленными и зачастую непонятными параметрами. Для данной категории самым сложным этапом является правильная установка портала. Впрочем, эта проблема легко решается применением специализированных дистрибутивов, уже имеющих в своем составе все необходимое, в том числе и AMP. Наиболее известный из них - Asterisk@Home [5].
Для второй категории пользователей AMP является мощным средством, позволяющим в короткие сроки получить законченное и достаточно функциональное решение на базе Asterisk. Причем здесь AMP выступает не как полный отказ от ручного редактирования конфигурационных файлов (как это было в первом случае), а скорее как удобное дополнение к ним (например, стандартные вещи делаются в портале, а нестандартные - путем custom-команд AMP или непосредственным редактированием конфигурационных файлов).
На этом позвольте закончить описание теоритеское и перейти к практическому рассмотрению AMP. Учитывая характер работы данного приложения, не имеет смысла придерживаться уже созданной нами конфигурации. Поэтому при настройке Asterisk с использованием AMP будем считать, что перед нами вновь лежит "чистый лист". Итак, возьмем клавиатуру в руки и отправимся навстречу к нашей цели!
Устанавливаем AMP
Для установки портала нам понадобятся все компоненты популярной платформы LAMP - Linux, Apache, MySQL и PHP (последний должен быть скомпилирован с поддержкой nls). Кроме того, нам также потребуются PHP-PEAR-DB, интерпретатор perl, а также perl-модули: Net::Telnet, IPC:Signal и Proc:WaitStat.
Первые установим с помощью средств, имеющихся в распоряжении вашего дистрибутива, а для вторых воспользуемся репозитарием CPAN:
# perl -MCPAN -e "install Net::Telnet"
# perl -MCPAN -e "install IPC::Signal"
# perl -MCPAN -e "install Proc::WaitStat"
Помимо этого нам потребуется добавить поддержку perl к самому Asterisk. Для этого установим модуль asterisk-perl, предварительно загрузив его с [6].
На этом подготовительные действия завершены, и мы можем смело приступить к установке самого AMP. По уже сложившейся традиции, воспользуемся последней стабильной версией, доступной на момент написания этих строк - 1.10.008. Загрузим и распакуем tarball с файлами проекта в удобное для нас место. Для определенности пусть это будет /usr/src:
# cd /usr/src
# wget http://citkit.dl.sourceforge.net/sourceforge/amportal/AMP-1.10.008.tar.gz
# tar xfz ./AMP-1.10.008.tar
Создадим две базы данных в MySQL. В первой будет храниться служебная информация AMP, во второй - информация о совершенных пользователями звонках.
# mysqladmin create asterisk -p
Enter password: <пароль root-пользователя MySQL>
# mysql-u root asterisk -p < usr/src/AMP/SQL/newinstall.sql
Первая база создана. Теперь дадим пользователю Asterisk необходимые права доступа:
# mysql -u root -p
Enter password: <пароль root-пользователя MySQL>
mysql> GRANT ALL PRIVILEGES
-> ON asterisk.*
-> TO auser@localhost
-> IDENTIFIED BY 'p0rtalpwd';
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Создадим вторую базу:
# mysqladmin create asteriskcdrdb -p
Enter password: <пароль root-пользователя MySQL>
# mysql -u root asterisk -p < usr/src/AMP/SQL/cdr_mysql_table.sql
Enter password: <пароль root-пользователя MySQL>
mysql> GRANT ALL PRIVILEGES
-> ON asteriskcdrdb.*
-> TO auser@localhost
-> IDENTIFIED BY 'p0rtalpwd';
Query OK, 0 rows affected (0.00 sec)
mysql> \q
Теперь установим модуль регистрации звонков cdr_mysql, входящий в состав пакета asterisk-addons.:
# wget http://www.asterisk.org/html/downloads/asterisk-addons-1.0.9.tar.gz
# tar xfz ./asterisk-addons-1.0.9.tar.gz
# cd ./asterisk-addons-1.0.9
В Makefile добавим следующую запись (строка 21):
CFLAGS+=DMYSQL_LOGUNIQUEID
И завершим инсталляцию модулей, выполнив команды:
# make && make install
Стандартная схема установки AMP предполагает, что Asterisk и веб-сервер должны выполняться одним пользователем:
# groupadd asterisk
# useradd -c "asterisk PBX" -d /var/lib/asterisk -u 5060 -g asterisk asterisk
Настроим запуск веб-сервера от пользователя Asterisk. Для этого в конфигурационном файле apache напишем:
Userasterisk
Groupasterisk
Теперь установим файлы самого AMP. Для этого запустим соответствующий установочный скрипт (учтите, что после его выполнения существующие файлы конфигурации Asterisk будут замещены, поэтому при необходимости не забудьте сделать резервные копии):
# /usr/src/AMP/install_amp
В интерактивном режиме скрипт выведает у нас все необходимые имена, явки и пароли (попутно сохранив их для потомков в /etc/amportal.conf), скопирует все необходимые файлы и проинициализирует базу данных MySQL. Настроим работу asterisk с использованием учетной записи обычного пользователя. Для этого в стартовом скрипте Asterisk используем конструкцию следующего вида:
/usr/sbin/asterisk -U asterisk
Убедимся, что автозапуск op_server.pl настроен и сам сервер запущен. Если все было сделано правильно, то, открыв http://имя_машины, мы увидим следующее (см. рис. 7).
Рисунок 7. Стартовая страница AMP
Настройка AMP
С интерфейсом голосовой почты мы уже знакомы, поэтому без лишних проволочек перейдем в основной раздел управления, щелкнув по ссылке "Asterisk Management Portal".
Перед нами предстанут три раздела меню: настройка (Setup), отчеты (Reports) и панель FOP. Как следует из названия, для конфигурации системы используется Setup. Возможные действия в этом разделе перечислены в меню слева. Первым делом перейдем в подраздел Extensions и создадим несколько учетных записей пользователей (см. рис. 8).
Рисунок 8. Создание абонентов в AMP
При настройках по умолчанию (и с уставленным zaptel-оборудованием) сразу же после добавления пользователей и применения конфигурации уже можно совершать звонки, в том числе и с использованием ZAP-каналов через префикс 7. Правда, скорее всего нам предварительно потребуется немного подправить настройки zaptel для учета специфики отечественных АТС, но, учитывая наш опыт из [1], это вряд ли вызовет у нас какие либо серьезные трудности.
Для настройки междугородней IP-телефонии необходимо создать транки (способ описания точек терминации внешнего по отношению к Asterisk трафика) и добавить соответствующие правила маршрутизации (раздел Outbound Routing). Формат этих правил во многом совпадает с тем, что мы определяли в текстовых файлах, поэтому практическое рассмотрение данной возможности мы оставим для самостоятельного изучения. Благо с использованием контекстных подсказок веб-интерфейса этот процесс не является очень сложным.
В разделе Ring Groups мы несколькими движениями мышки можем объединить абонентов в единую группу вызова. Кроме того, также имеется возможность задать альтернативное поведение системы для случаев, когда ни один из абонентов группы не доступен (см. рис. 9).
Рисунок 9. Группы вызовов абонентов
В Incoming Calls определяются правила обработки звонков, приходящих с ZAP-каналов. Стандартной функциональностью коробочного номерного плана AMP является возможность определения различных правил маршрутизации для рабочего и нерабочего времени. При этом в качестве адресатов могут выступать группы вызова, системы голосовых меню, очереди или обычные абоненты.
Для остальных разделов конфигурации ограничимся кратким описанием их назначения.
n Queues - здесь определяются параметры очередей и агентов. Более подробно эти параметры будут рассмотрены в одном из следующих номеров журнала.
n Digital Receptionist - автосекретать. С помощью этого пункта можно быстро создать голосовое меню. Например, запишем такой текст: "Здравствуйте! Вы позвонили в СамуюЛучшуюКомпанию. Для соединения с коммерческим отделом нажмите 1. Технический отдел - 2. Бухгалтерия - 3 и т. д." Затем с помощью того же мастера создадим правила маршрутизации для этого меню, перенаправляющие пользователей в соответствующие отделы (в общем случае правила могут не соответствовать текстовому сообщению). И, наконец, назначим созданное меню для входящих звонков в подразделе Incoming Calls. Этим самым мы значительно снизим нагрузку на нашего секретаря, освободив его время для более интересной работы.
n DID Routes - маршруты прямого вызова. С помощью данной функции можно напрямую позвонить внутреннему абоненту/агенту/группе вызова Asterisk с использованием механизма DID (при этом DID также должен поддерживаться городской телефонной станцией).
n On Hold Music - в этом подразделе мы можем загрузить на сервер дополнительные мелодии для музыки при ожидании.
n System Recording - с помощью этого пункта меню можно добавлять (или записывать) в Asterisk дополнительные звуковые сообщения, которые впоследствии могут быть использованы в голосовых меню.
n Backup & Restore - как следует из названия, с помощью данного раздела можно резервировать и восстанавливать конфигурацию Asterisk-сервера. Для работы этой функции необходимо добавить в crontab выполнение содержимого /etc/asterisk/backup.conf.
n General Settings - в этом пункте определяются некоторые системные параметры AMP - время дозвона до абонента перед перенаправлением к голосовой почте, параметры работы с каталогом пользователей и настройки обработки входящих факсов.
Более менее разобравшись с имеющимися возможностями настройки, остановимся на модуле отчетов. С его помощью администратор может не только получить детальную информацию за любой интересующий его период времени, но и просмотреть статистическую информацию о загрузке сервера в течение дня или на протяжении месяца. Поддерживается выгрузка отчетных данных в формате pdf и csv (см. рис. 10).
Рисунок 10. Модуль отчетов AMP
Интерфейс панели управления
Третьим разделом интерфейса управления является уже знакомая нам Flash Operator Panel. В состав последней версии AMP входит несколько устаревшая версия FOP (20 против 22 на сайте разработчика). Правда, некоторой компенсацией за это является интеграция AMP и FOP при установке "из коробки".
Так, добавляя нового пользователя в AMP, запись о нем автоматически появляется и в FOP, что избавляет нас от необходимости лишний раз редактировать файлы конфигурации.
Давайте более подробно остановимся на графическом интерфейсе. Как уже говорилось выше, клиентская часть FOP разработана с использованием Macromedia Flash. Это не могло не оставить отпечатка на характере работы с визуальным интерфейсом. Все действия с абонентами производятся либо с помощью двойного щелчка мыши, либо методом "drag and drop". Так, для того чтобы принудительно завершить сеанс пользователя, необходимо нажать на "1" (см. рис. 11), а для того чтобы соединить двух абонентов, - перетащить значок телефона на кнопку вызываемого абонента.
Рисунок 11. Интерфейс Flash Operator Panel
К сожалению, текущая реализация совместной работы FOP и Asterisk не лишена недостатков. Так, в варианте "из коробки" FOP не видит стандартных конференций AMP. Для решения этой проблемы воспользуемся нашими знаниями о структуре конфигурационных файлов. Первым делом в файле op_server.cfg в качестве контекста для конференций укажем ext-meetme, для параметра barge_roooms выберем одно из стандартных для AMP значений, например 8200, и опишем соответствующие кнопки в файле op_buttons_custom.cfg согласно инструкции, приведенной выше для FOP. После этого перезапустим perl-сервер, обновим страницу интерфейса клиента и порадуемся, увидев в нем кнопки, соответствующие MeetMe. Теперь с помощью веб-интерфейса мы можем "собирать" людей в виртуальных "комнатах" для проведения совместных обсуждений (drag-and-drop на картинку конференции), а также подключаться к уже идущим разговорам. (правда, для незаметной работы последнего, возможно, потребуется более тонко настроить работу модуля MeetMe). С отображением состояния парковочных мест можно поступить аналогично.
Заключение
В заключение давайте еще раз кратко рассмотрим сильные и слабые стороны AMP. Итак, преимущества:
n Возможность редактирования параметров Asterisk через веб-интерфейс.
n Возможность получения информации о совершенных звонках.
n Быстрое создание голосовых меню.
n Возможности автосекретаря.
n Использование "транков".
n Определение правил маршрутизации .
n Загрузка мелодий для "музыки при ожидании".
n Определение групп вызова.
Но, как известно, у каждой медали есть и вторая сторона. У AMP она выглядит так:
n Необходимость перезаписи конфигурационных файлов.
n Необходимость функционирования всех ключевых компонент на одном компьютере (как следствие из предыдущего).
n Возможные проблемы с масштабируемостью (как следствие из предыдущего).
n Отсутствие управления параметрами MeetMe через веб-интерфейс.
n Отсутствие встроенной системы безопасности.
n Достаточно сложная структура номерного плана (особенно для начинающих пользователей).
n Шероховатости в интеграции с FOP.
n Отсутствие русского интерфейса меню.
n Проблемы совместимости между номерным планом и аппаратным голосовым оборудованием (некоторые шлюзы не могут корректно набирать символы "#,*" которые очень активно используются в номерном плане).
При всем этом, несмотря на указанные недостатки, Asterisk Management Portal, безусловно, можно считать одним из лучших веб-интерфейсов для Asterisk. Проект очень активно развивается, и вполне возможно, что многие из перечисленных недочетов будут исправлены в следующей версии. При этом не стоит забывать, что AMP полностью открыт и вы сами можете принять непосредственное участие в его дальнейшем развитии. Ну а если разработка веб-приложений вам не близка, а AMP вам просто понравился как пользователю, не забудьте сделать donation на официальном сайте проекта [7].
Приложение
Лирическое отступление о факсах
Как вы могли заметить, один из разделов меню AMP посвящен настройке приема факсов в Asterisk, однако в статье об этой возможности не было сказано ни единого слова. Причиной тому является текущий уровень реализации поддержки работы с факсами в системах IP-телефонии в целом и в Asterisk в частности. Давайте рассмотрим эту проблему более внимательно.
На самом верхнем уровне можно выделить два основных способа передачи факсимильных сообщений в системах IP-телефонии:
n Поверх существующего голосового кодека.
n С использованием протокола T.38.
Первый способ фактически представляет собой обычный факс, подключенный к голосовому шлюзу, например с интерфейсом FXS. При этом, если мы хотим передать факс, мы набираем нужный нам номер, пытаемся установить соединение с аппаратом на другой стороне и т. д. А теперь вопрос на засыпку: "Помните ли вы, как работает модем? А как он работает на очень плохих или "старых" линиях?" Факс, обработанный одним из голосовых кодеков с сильным сжатием (GSM, G723, G729), будет работать еще хуже, вернее, скорее всего он не будет работать вообще. С кодеками, не использующими сильное сжатие с потерями (в Asterisk это G711 в вариантах a-law и u-law), ситуация будет лучше. При этом качество передачи факсов во многом будет зависеть от реального состояния IP-канала (потери, джиттер, задержка) между абонентами (ведь на самом деле мы передаем "голос", следовательно, используем протокол UDP, не предоставляющий гарантий доставки пакетов). Если вдобавок еще и взглянуть на первую строчку таблицы в [8], то мы увидим, что при передаче факса через Интернет нам потребуется канал с реальной пропускной способностью около 80 кБит, что, согласитесь, уже немало. По этим и другим причинам для передачи факсов через голосовые сети все чаще стараются использовать T.38. Данный протокол был разработан организацией ITUT специально для передачи факсов в VoIP-сетях. Механизм работы устройств, поддерживающих данный протокол, следующий - при обнаружении голосовым шлюзом сигналов факса он пытается установить дополнительное соединение с другим шлюзом (благо и H323 и SIP это позволяют), но уже с использованием T.38. Благодаря использованию помехоустойчивого кодирования, а также протокола с гарантией доставки - TCP с использованием T.38 можно получить практически идеальное качество передачи факсов. Правда, и для этой ложки меда имеется своя бочка дегтя - поддержка протокола T.38 в существующих на сегодняшний день устройствах все еще оставляет желать лучшего. Дело в том, что согласно стандартам, на данный момент существует 3 (!) различных способа передачи факсов с использованием T.38:
n Поверх протокола UDP.
n Поверх протокола TCP.
n Передача в RTP-пакетах.
Первые два способа фактически представляют собой специализированные протоколы для передачи факсов (протоколы IFP/udptl и IFP/TCP соответственно), в то время как третий больше похож на использование T.38 вместо обычного кодека (факсовые данные упаковываются в обычные RTP-пакеты). Проще говоря, поддержка в прокси-серверах первых двух протоколов требует дополнительных усилий от разработчиков, в то время как для третьего варианта достаточно поддержки в конечных устройствах. К тому же ситуация усугубляется тем, что зачастую производители голосового оборудования если и реализуют поддержку T.38 в своих устройствах, то ограничиваются лишь одним из вариантов реализации (чаще первым), со всеми вытекающими отсюда несовместимостями и проблемами.
Что же касается Asterisk, то на данный момент он абсолютно точно не поддерживает два первых варианта использования T.38 (заметьте, это вовсе не означает, что такая поддержка невозможна в принципе). С третьим способом ситуация комичнее - до настоящего времени ни одного устройства, использующего T.38 поверх RTP, сообществом разработчиков Asterisk обнаружено не было, поэтому информации о его практической работоспособности нет. Таким образом, реальная поддержка передачи факсимильных сообщений в Asterisk на данный момент возможна только с использованием кодека G711, причем наиболее предпочтительна следующая схема: входящий факс-сервер, работающий поверх G711 c использованием zaptel-устройств Asterisk.
В завершение упомянем и другой взгляд на эту проблему. А нужна ли вообще передача факсов в VoIP-сетях? Если IP-инфраструктура уже существует, то не проще ли в данном случае использовать что-то другое, например e-mail?
AMP мини-FAQ
Страница FOP "зависает" при открытии. В чем может быть причина?
Убедитесь, что серверный perl-скрипт запущен.
При работе с веб-интерфейсом выдаются сообщения об ошибках записи.
Возможно, установлены неверные права доступа к файлам конфигурации Asterisk. Для автоматического исправления запустите скрипт apply_conf.sh из дистрибутива AMP.
При работе с интерфейсом выдается сообщение об ошибке соединения с manager.
Неверно сконфигурирован (или отключен) интерфейс управления Asterisk. Проверьте содержимое файлов /etc/asterisk.manager.conf и /etc/amportal.conf.
Asterisk начинает запускаться, но, дойдя до загрузки zap-устройств, процесс внезапно завершается.
Проверьте, что модули ядра zaptel и wcfxo загружены и устройства проинициализировались без ошибок (lsmod, dmesg). Или проверьте, что файл /etc/asterisk/zaptel.conf существует и в нем правильно заданы параметры устройств.
Не показываются (или показываются неверно) сообщения голосовой почты через веб-интерфейс.
Убедитесь, что пользователь веб-сервера имеет доступ к файлам голосовой почты (/var/spool/asterisk/voicemail).
Добавил пользователей, но в FOP они не появились. В чем может быть дело?
Необходимо перезапустить op_server.pl
Литература, ссылки:
1. Платов М. Asterisk и Linux - миссия IP-телефония. Действие 2. - Журнал "Системный администратор", N7, 2005 г. - 32-38 c.
2. Платов М. Asterisk и Linux - миссия IP-телефония. - Журнал "Системный администратор", N6, 2005 г. - 1219 c.
3. http://www.voip-info.org/tiki-index.php?page=Asterisk+gui+vmail.cgi.
5. http://asteriskathome.sourceforge.net.
6. http://asterisk.gnuinter.net.
7. http://sourceforge.net/projects/amportal.
8. Платов М. Что важно знать об IP-телефонии. - Журнал "Системный администратор", N5, 2005 г. - 20-25 c.