Антон Борисов
Телефония для эпохи Web 2.0
Как часто вы находились в ситуации, когда было проще один раз сказать словами, нежели несколько раз объяснять, например, в окне ICQ-мессенджера? Давайте попробуем разобраться, как создать комфортные для работы условия, а именно – рассмотрим тот инструментарий, что поможет донести наш голос до удаленного собеседника.
Сейчас, наверное, уже трудно кого-то удивить такими терминами, как: VoIP-соединение, SIP-телефония, сервер телефонии Asterisk и т. п. И это отрадно, так как означает, что, во-первых, создана и используется транспортная инфраструктура для цифрового обмена информацией (интернет-каналы) и, во-вторых, создано позитивное общественное мнение на такой вид коммуникаций. В общем-то, это должно означать, что люди представляют себе механизм общения посредством софтовых телефонов и более того – немалую часть времени проводят в разговорах через IP-среду.
Единственное, что может огорчать, так это привязка звонящего человека к своему рабочему месту – приходится устанавливать и настраивать SIP-телефонию каждый раз, когда человек меняет свое местоположение. Что не всегда кажется удобным и правильным решением, ибо для того, чтобы звонить, достаточно будет перенести только гарнитуры.
Предполагается, что Asterisk у вас уже настроен (подробно рассмотрено в более ранних номерах журнала [1-4]), учетные записи пользователей созданы и вы можете позвонить своему коллеге с помощью SIP-телефона. Отлично, следующий шаг – сделать так, чтобы вы могли осуществить звонок и с любого другого места.
Предварительно убедимся, что Asterisk у нас работоспособен хотя бы в минимальной конфигурации. Если он в вашей сетевой инфраструктуре никогда не разворачивался ранее, то ничего страшного. Установка тривиальна (приводится пример для FreeBSD 6.2 и Аsterisk версии 1.4.21):
# cd /usr/ports/net/asterisk/
# make config
В появившемся диалоге выбираете нужные опции. По умолчанию можете выбрать все.
+--------------------------------------------------------------------+
| Options for asterisk 1.4.21.2_3 |
| +----------------------------------------------------------------+ |
| | [X] OGGVORBIS Enable Ogg Vorbis support | |
| | [X] ODBC Enable ODBC support | |
| | [X] POSTGRES Enable PostgreSQL support | |
| | [X] RADIUS Enable RADIUS accounting support | |
| | [X] SNMP Enable SNMP support | |
| | [X] H323 Enable H.323 support | |
| | [X] FREETDS Enable FreeTDS support | |
| | [X] JABBER Enable Jabber and Gtalk support | |
| | [X] SQLITE Enable SQLITE support | |
| | [X] CODEC_PATCH Apply codec negotiation patch | |
| | [X] ILBC Enable iLBC codec | |
| | [X] MISC_PATCHES Apply additional patches | |
| | [X] ZAPTEL Enable Zaptel support | |
| | | |
| | | |
+-+----------------------------------------------------------------+-+
| [ OK ] Cancel | |
Далее:
# make && make install && make clean
Сервер телефонии теперь установлен. Организуем запуск Asterisk при старте системы, для этого в файл /etc/rc.conf добавим строку:
asterisk_enable="YES"
Файлы конфигурации могут быть иными, в зависимости от выбранной вами платформы или дистрибутива.
Добавим учетные записи первых пользователей, от имени которых будут произведены звонки. Вносим следующие строки в файл sip.conf:
[200]
type=friend
host=dynamic
username=200
secret=mypasswd
nat=y
context=default
callerid="Anton" <200>
allow=gsm
allow=ulaw
allow=alaw
[1200]
type=friend
host=dynamic
username=1200
secret=mypasswd
nat=no
context=default
callerid="Anton" <1200>
allow=gsm
allow=ulaw
allow=alaw
И заведем теперь планы дозвона указанным пользователям – указанные строки вносятся в файл extensions.conf:
exten => 1200,1, Macro(stdexten,1200,SIP/1200)
exten => user1, 1, Goto(1200|1)
exten => 200,1, Macro(stdexten,200,SIP/200)
exten => user3, 1, Goto(200|1)
Делаем рестарт Asterisk:
/usr/local/etc/rc.d/asterisk restart
Дело остается за малым. Установить SIP-клиента и проверить, что базовые настройки правильные и звонок с абонента 200 проходит на абонента 1200.
При выборе софтового телефона ставка делалась на следующие критерии:
- мультиплатформенность;
- эстетичность.
Поэтому при всем богатстве выбора, а выбиралось между Ekiga, Twingle, SJPhone, Linphone, внимание привлек X-Lite от компании CounterPath [6]. Несмотря на закрытость – телефон распространяется только в бинарной форме – поддержка Windows/Mac/Linux свидетельствует о том, что больше 95% пользователей смогут свободно пообщаться.
Итак, пользовательские настройки сделаны. Абонент 200 звонит своему коллеге – абоненту 1200. Связь идеальная.
Теперь приступаем к той идее, название которой было озвучено в самом начале. А именно, сделать место звонящего по-настоящему мобильным. Конечно, полностью мобильным сделать не получится, так как вряд ли у вас для каждого сотрудника выделен ноутбук.
Будем ориентироваться на обычного пользователя, который периодически бороздит просторы Сети, т.е. на рабочем столе присутсутвует браузер и для этого браузера установлены дополнительные плагины.
Звонок с помощью средств Java
Первое решение полагается в своей работе на те средства, что развиты в современной Java и разработаны в рамках клиента IAX [8]. А именно, обработка звуковых потоков в формате WAV, GSM (и некоторых других) самой JVM и плюс к этому – обработка сигнализации IAX (Inter Asterisk eXchange). В итоге получился апплет, который физически размещается на том же сервере, что и сам Asterisk, а пользователь просто-напросто вводит номер абонента, которому нужно позвонить (см. рис. 1).
Рисунок 1. Звонок абоненту 1200 через JIAXClient
И при успешном соединении можно начинать говорить через гарнитуру.
Плюсы у данного решения:
- не требуется установка SIP-телефона;
- звонок (кодек и сигнализация) обрабатывается через Java-плагин браузера;
- мультиплатформенность.
Минусами являются:
- необходимость использовать JVM;
- получение данных с микрофона происходит через JNI-интерфейс, что требует установки библиотеки libjiaxc.so (UNIX) или jiaxc.dll (Windows) на клиентскую машину.
Открытость кодов JIAX Client подразумевает, что собрать апплет можно под любую платформу, где может работать JVM.
Как происходит установка клиента JIAX на практике?
У меня установлен nginx в качестве веб-сервера, что однако не означает, что любой другой не подойдет. Вовсе нет. Просто так получилось, что требовался быстрый и легковесный веб-сервер.
Итак, настройки nginx не отличаются от стандартных, произведем изменения только в секции server файла nginx.conf:
1 server {
2 listen 8811;
3 server_name localhost;
4 location / {
5 root /usr/local/www/nginx;
6 index index.html index.htm;
7 auth_basic "Ask yourself!";
8 auth_basic_user_file /usr/local/etc/nginx/htpasswd;
9 }
В строке 2 указываем, чтобы nginx работал на высоком порту 8811. В строке 5 указываем, где хранятся документы для веб-сервера. И на время тестового периода я решил ограничить доступ лиц, которые могут пользоваться услугами телефонии – строки 7 и 8. Для вашего случая, их можно закомментировать.
Копируем содержимое jiaxclient-0.0.6 в директорию /usr/local/www/nginx/sip/ и с рабочей машины пользователя заходим браузером по адресу – http://mgwe:8811/sip/jiaxtest.html, где mgwe – адрес вашего Asterisk или nginx-сервера в интранет, либо в интернет-сети (см. рис. 2).
Рисунок 2. Авторизация на доступ к ресурам веб-сервера
Вводим пароль для доступа к HTML-страницам сервера nginx (вспомните про строки 7 и 8 файла конфигурации nginx). И утвердительно отвечаем, что мы доверяем JVM исполнить апплет jiaxclient (см. рис. 3).
Рисунок 3. Доверить запуск апплета на выполнение
Затем делаем звонок другу (см. рис. 1) и общаемся, пока не закончится последний IP-пакет.
Звонок вызова на стороне вашего коллеги будет происходить от имени пользователя Guest IAX User (см. рис. 4).
Рисунок 4. Входящий звонок от «фантомного» пользователя Guest IAX User
На что стоит обратить внимание при использовании клиента JIAX? На принадлежность пользователей одному контексту, а именно default. Специально прописывать настройки для пользователя Guest IAX User не надо. Asterisk сам подставляет название этого пользователя при установке соединения. Если хотите особо выделить, что звонок происходит с веб-сайта, например, как соединение от пользователя WebSite Client, то лучший способ – это обратиться к документации на Asterisk. В том случае, когда вы заводите пользователей в соответствии с названием подразделения или функциональной принадлежности, например, office, то следует помнить, что звонок от пользователя SIP1@default будет невозможен своему коллеге SIP2@Office2. Из-за разных контекстов – default и Office2. Придется всех заносить в контекст default, либо дорабатывать сам JIAX-клиент.
Да, и не забудьте поставить драйверы к аудио-системе на клиентской машине, иначе получите ошибку приложения (cм. рис. 5).
Рисунок 5. Типичная ошибка, когда не удается инициализировать аудио-подсистему
Позвоним с помощью add-on для браузера
Столь замечательный подход использовать взаимодействие с помощью IAX-сигнализации не мог оставить в стороне идею позвонить не через Java-плагин, а напрямую, из браузера. Правда объективности ради, следует уточнить, что из семейства Mozilla [10].
Устанавливаем add-on с названием MozIAX. Выставляем нужные параметры в разделах Network и Codecs. Обращаю ваше внимание, что необходимо будет добавить новых, IAX-пользователей. Указанные для примера пользователи 200 и 1200 были, если можно так выразиться, немного другого формата, а именно SIP (см. рис. 6).
Рисунок 6. MozPhone плагин установлен и правильно настроен
Добавим пользователя marko2 в файл iax.conf.
[marko2]
type=friend
host=dynamic
regexten=1234
secret=moofoo
context=default
permit=0.0.0.0/0.0.0.0
Не забудем добавить также нужный номер extension этого пользователя. И самое главное, нам потребуется еще внести изменения в Manager Interface – файл manager.conf:
[tony]
secret = mypass
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
Теперь ждите разгоряченных признаний от поклонниц, звонящих вам из браузера Mozilla Firefox (см. рис. 7). Но вы в безопасности, так как VoIP-пакеты безопасны для организма.
Рисунок 7. Звонок «приходит» с идентификатором MozPhone
Какие могут быть «подводные грабли»? Необходимость открывать наружу порт 5038 от Asterisk Manager Interface – изменения в секции [general] опции bindaddr. Неспособность принять звонок, если звонящий пользователь находится за NAT.
Текущая версия MozIAX поддерживает версии Mozilla только на платформах Windows и Linux. «Яблочные» пользователи, по всей видимости, остаются все еще не у дел.
«Встречный звонок»
Использование Asterisk Manager Interface на самом деле не такая уж и плохая идея. В свете того, что сам Asterisk и веб-сервер запущены и работают на одной машине – не придется открывать лишние порты, да и само взаимодействие происходит в рамках localhost. Мы можем подготовить скрипт, параметрами к которому являются номера соединяемых абонентов.
Как это выглядит на практике? Представим себе следующую ситуацию (см. рис. 8). Абонент A находится в своем кабинете, при этом у него на рабочем столе запущен и авторизован SIP-телефон. Абонент B, находящийся в другом филиале, но фактически в той же локальной сети, решил позвонить. Благо перед глазами у него аппаратный SIP-телефон, который подключен к Asterisk-серверу. Абонент B заходит на корпоративный сайт, вводит в форму номер своего телефона и нажимает на кнопку «Соединить с самым главным». В итоге скрипт производит соединение с самим вызывающим абонентом (B), а затем дозванивается до «самого главного» (абонент A).
Рисунок 8. Схема взаимодействия абонентов с 2 разными типами телефонов
Во что выльется практическое примение данного решения на том или ином предприятии, сказать заранее достаточно сложно. Следует, однако, помнить, что как только у вас разрастается телефонная инфраструктура и междугородние звонки через SIP-оператора становятся обыденностью, то возникает желание быть на связи с конкретным человеком вне зависимости от того, где географически он в данный момент расположен. И звонить ему со служебного портала всегда по одному номеру, например 1200.
В качестве скрипта, который делает всю закулисную работу, выступает TACI-скрипт [11], написанный на Perl. Разместим его на веб-сервере, организуем обработку вызовов скриптов на Perl и попробуем позвонить. Но предварительно не забудьте добавить параметр priority в вызове через Manager Interface – строка 177. Новая должна выглядеть как:
$tn->print("Action: originate\nExten: $exten\nContext: $context\nPriority: $priority\nChannel: $phonetype/$account\nPriority:1\nCallerid: $callerid\n\n");
Подсоединяем гарнитуру, заносим нужные телефоны в поля: Number to call, Your Extension, контекст – default, и нажимаем на кнопку «Make call!». Прозвонит сначала телефон с номером 1200, а затем зазвонит у нужного нам абонента, в данном случае с номером 200. Соединение состоялось.
Рисунок 9. Perl-скрипт выполняет всю закулисную работу
Звонок в стиле Flash!
Сегодняшнее повествование было бы неполным, оставь мы без внимания набирающие всё большую популярность и распространенность Flash-технологии. Тем более учитывая тот факт, что сама компания Adobe очень ответственно подошла к теме P2P- и SIP-коммуникаций и на текущий момент данные технологии представлены в проектах Pacifica и в самом FlashPlayer. То есть фактически на столе у каждого пользователя находится движок, с помощью которого можно произвести звонок. Давайте рассмотрим схему, по которой работает данное решение (см. рис. 10).
Рисунок 10. Сигнализация и передача данных при использовании Flash-технологий
На стороне веб-сервера дополнительно запущен Red5-сервер. Он представляет собой сервер коммуникаций, написанный на Java. В свое время Adobe Systems придумала протокол RTMP (Real Time Messaging Protocol [12]) для обмена потоковыми сообщениями между flash-плеером (веб-браузер на стороне клиента) и Adobe Flash Media Server. Протокол проприетарный, но благодаря реверс-инжинирингу он был переписан на Java, и получился Red5. Фактически он может работать там же, где работает и Java 5/Java 6.
Красным цветом показана сигнализация – передача контрольных сообщений, индикация звонка и т. п. Синим отмечено прохождение сигнала от удаленного абонента через SIP-сервер, а затем через Red5-сервер. Зеленый цвет – передача голоса с микрофона, через приложение на стороне браузера и далее аналогичным путем, что и сигнал от удаленного абонента.
Что у нас получается? Пользователь заходит на страницу сервера и запускает на ней Flex-приложение (по сути flash-приложение) (см. рис. 11). Указывает свои параметры для Asterisk-сервера и, авторизовавшись, получает окошко с SIP-телефоном (см. рис. 12).
Рисунок 11. Пользовательские данные введены
Рисунок 12. Абонент авторизован, и можно произвести звонок
Теперь, набрав заветный номер, он может провести классическую английскую беседу о чае и погоде со своим далеким визави (см. рис. 13).
Рисунок 13. Трубка на удаленном конце поднята – соединение осуществлено
Как это будет выглядеть на стороне сервера? Во-первых, потребуется Java версии 6. Хотя может использоваться и предыдущая, 5-я, версия, но разработчики рекомендуют все-таки переходить на более новую. На странице [13] забираете tarball версии 0.7.0final сервера Red5, затем ja-файл red5.jar (детальная инструкция расположена на сайте [14]) и сам архив SIP-телефона. Его следует разместить в директории webapps, на стороне сервера. Затем, запустив скрипт red5.sh, вы получите работающий Red5-сервер, готовый принимать звонки. В целях разграничения функций вы можете разместить Red5 на другой машине, нежели сам Asterisk.
В качестве эпилога
У каждого рассмотренного решения есть свои сильные и слабые стороны. Но ясно одно, что телефония, а по большому счету видео- и аудиоконференции, находит все большее применение в повседней жизни, будь то совещание рабочей группы в транснациональной компании либо уточнение требований технического задания в маленькой фирме. Как говорил один политический деятель в прошлом веке: «В решении какой-либо важной задачи непременно должны быть взяты телефон, телеграф, станции». И если под станциями рассматривать шлюзы для выхода в Интернет, а под телеграфом подразумевать сервер электронной почты, то как «взять» телефон для нужд конечного пользователя, мы рассмотрели сегодня.
- Платов М. Что важно знать об IP-телефонии? //«Системный администратор», №5, 2005 г. – С. 20-25.
- Платов М. Asterisk и Linux: миссия IP-телефония. //«Системный администратор», №6, 2005 г. – С. 12-19.
- Платов М. Asterisk и Linux: миссия IP-телефония. Действие 2. //«Системный администратор», №7, 2005 г. – С. 32-38.
- Платов М. Asterisk и Linux: миссия IP-телефония. Действие 3. //«Системный администратор», №8, 2005 г. – С. 10-19.
- http://www.asteriskguru.com/tutorials/sip_nat_oneway_or_no_audio_asterisk.html.
- http://www.counterpath.com.
- http://www.hem.za.org/jiaxclient.
- http://iaxclient.wiki.sourceforge.net.
- http://www.voip-info.org/wiki-IAXClient.
- http://moziax.mozdev.org.
- http://www.azxws.com/asterisk.
- http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol.
- http://osflash.org/red5/070final.
- http://code.google.com/p/red5phone.