Создание Skype - SIP гейта

Добавил admin
Для ITDoc

1 звезда2 звезд3 звезд4 звезд5 звезд (3 голосов, средний: 2.33 из 5)
Загрузка ... Загрузка ...
2,503 Просмотров!

Издано: мая 6, 2009

Задача

Одним  из наиболее популярных приложений для голосового общения в сети
является  Skype. Для этого есть и объективные предпосылки - достаточно
развитые  возможности  клиента и протокола, неплохая работа в условиях
NAT   (и   даже   возможность   работы   через   прокси),   интеграция
(коммерческая)   с  телефонными  сетями,  мультиплатформенный  клиент.
Основной  недостаток  -  закрытость  протокола  и  клиента,  сложность
интеграции  с  другими chat/voice сервисами, замкнутость технологии на
одной  компании.  Тем не менее - реалии таковы что на сегодняшний день
это  наиболее  популярное  средство  для  общения  и,  на  мой взгляд,
альтернатив,  особенно  открытых,  немного.  В  этой  заметке  я решил
описать создание гейта skype <-> SIP с использованием IP АТС Asterisk.
Данное  решение  позволит  преобразовать  skype трафик в стандартный и
открытый  SIP,  с  которым потом уже средствами Asterisk (и не только)
можно делать все что угодно.

Выбор ПО

Редкий  тролль  не  любит  рассказов об ужасах, скрывающихся в BLOB`ах
закрытых  продуктов  (особенно забавна история когда обнаружили чтение
skype`ом /etc/passwd и стали трубить о том что скайп “ворует пароли”),
которые чаще всего не подкреплены какими либо доказательствами. Тем не
менее - в данной задаче, на мой взгляд, и в самом деле удобнее создать
изолированное  окружения,  как  по  соображениям  безопасности так и с
точки  зрения  удобства  поддержки.  В  качестве  виртуальной машины я
выбрал   linux-kvm   (также   успешно   протестирована   работа  в
VirtualBox), в качестве гостевой среды - debian 5 (который как раз
только   что   вышел).   Выбор   основан   исключительно   на   личных
предпочтениях, думаю что должно работать на любом другом дистрибутиве,
и  скорее  всего, даже на BSD (в линуксяторе). В дальнейшем я планирую
перенести  гейт на XEN, так что в данном случае нормальная поддержка в
debian  работы  в domU тоже плюс. Единственным найденным мной открытым
решением  для  *nix  стал  Skypiax,  так  что  тут  и  выбирать не
пришлось.

Принцип работы

Как  уже  упоминалось  -  скайп  закрытое  приложение,  и его протокол
достаточно   неплохо  защищен  от  сторонних  разработчиков.  Так  что
единственным  доступным клиентом протокола в настоящий момент является
сам  skype.  Но  для интеграции своего ПО со сторонними разработчиками
(как железа, так и ПО) skype клиент позволяет работать с ним используя
документированное API. В linux версии для транспорта используется DBUS
и  X11.  API  достаточно  обширно, но тем не менее о полноценном embed
клиенте  говорить не приходится, так что нам все равно потребуется X11
и запущенный клиент. Skypiax позволяет Asterisk общаться с запущенными
skype клиентами и совершать или принимать skype звонки.

Установка ПО

Для  начала  установим  ОС.  Для  нашей задачи будет вполне достаточно
диска  на  2Gb  (думаю,  что  хватило  бы  и  сильно  меньшего  но это
потребовало  бы пересборки пакетов без ненужных зависимостей). Ставить
дистрибутив  x86_64 лишено смысла, так как клиент все равно i386, да и
памяти меньше израсходуем.

qemu-img create ~/images/skype 2G
kvm -hda ~/images/skype -cdrom ~/dists/debian-500-i386-CD-1.iso

Выбираем   вариант   установки   без   десктоп   окружения  и  прочего
непотребства,  все что нужно мы позже установим из пакетов. После того
как  установка  завершена - перезагружаем гостя и устанавливаем нужные
пакеты:

Asterisk, заголовки и куча преимущественно ненужных нам зависимостей

skype:~# apt-get install asterisk-dev

Skype client

skype:~# wget http://skype.com/go/getskype-linux-deb
skype:~# dpkg -i skype-debian_2.0.0.71-1_i386.deb
skype:~# apt-get -f install
skype:~# dpkg -i skype-debian_2.0.0.71-1_i386.deb

Subversion (потребуется для скачивания исходников skypiax)

skype:~# apt-get install subversion

OpenSSH  server  (для  управления в будущем и первоначальной настройки
Skype)

skype:~# apt-get install openssh-server

Заголовки Xlib потребуются нам позже

skype:~# apt-get install libx11-dev

Теперь загрузим и скомпилируем skypiax:

skype:~# svn co http://www.celliax.org:8081/svn/celliax/trunk celliax
skype:~# cd celliax/skypiax_stuff/build/
skype:~/celliax/skypiax_stuff/build# vi Makefile

Заменяем путь

AST_INCLUDE_DIR=/home/user/devel/asterisk-1.4.23.1/include          на
AST_INCLUDE_DIR=/usr/include,   компилируем  и  копируем  результат  в
нужную нам папку.

skype:~/celliax/skypiax_stuff/build# make
skype:~/celliax/skypiax_stuff/build# cp chan_skypiax.so /usr/lib/asterisk/modules/ &amp;&amp; cp skypiax.conf /etc/asterisk/

На  этом  установка завершена, можно переходить к более увлекательному
этапу настройки.

Настраиваем skype клиента

Для  запуска  skype  я  использован возможность X11 forwarding openssh
сервера  и клиента, присоединившись с десктоп машины на skype сервер с
параметром -X:

ssh -X root@skypeserver.local

Для  своей  работы  скайп захочет звуковую карту, для подобных целей в
alsa предусмотрен драйвер snd-dummy, загрузим его:

modprobe snd-dummy

После этого запускаем в терминале скайп, и если все работает правильно
-  он  должен  показать  лицензионное  соглашение  и свой интерфейс на
рабочем столе. Скайп позволяет использовать одно и тоже подключение из
нескольких  мест  (чем,  кстати, выгодно отличается от SIP), но тем не
менее  я рекомендую завести отдельную запись, как минимум для удобства
тестирования.  Запустив  скайп соглашаемся с лицензией и вводим данные
учетной   записи.   Если   все  настроено  правильно  -  skype  должен
зарегистрироваться  в  сети. Перейдя в настройки отключаем уведомления
(Notifications  -> Enable Event). Теперь самое важное - в пункте Sound
Devices указываем устройство Dummy (hw:Dummy,0). В меню Advanced стоит
отключить  проверку  обновлений,  а  в  меню Video Devices - поддержку
видео.  После  этого  skype  клиент  должен  без проблем совершать или
принимать  звонки,  правда  слышно  ничего  не  будет,  так  как карта
виртуальная.   Не  закрываем  клиент  (он  нам  скоро  потребуется)  и
переходим к настройке Asterisk.

Настраиваем Asterisk

1. Подключаемся к серверу с включенным X11 forwarding

Desktop:~$ ssh -X root@skypeserver.local

2. Для того, чтобы астериск смог взаимодействовать с запущенным skype
клиентом нам потребуется значение переменной DISPLAY

skype:~# echo $DISPLAY

В моем случае это localhost:11.0
3. Параметры    skype   транков   (их   может   много)   задаются   в
/etc/asterisk/skypiax.conf.  По умолчанию там уже заданы 2 транка,
закомментируем их. Параметры для моего транка выглядят так:

[skypeclient]
language=en ; default
context=default ; incoming context
extension=600 ; forward calls to default asterisk echo test
skype=yes ; legacy setting
X11_display=localhost:11.0 ; value from $DISPLAY
tcp_cli_port=11234 ; 2 random pots
tcp_srv_port=11235 ;
skype_user=skypet123 ; skype nickname
playback_boost=0 ; volume boost for playback
capture_boost=0 ; ... and recording

В  данной конфигурации я указал X11_display из пункта 2, для того,
чтобы   asterisk   смог   соединиться   с   запущенным   клиентом.
Extension=600    обозночает    что   входящие   звонки   в   будут
перенаправлены   в   extension  600,  который  по  умолчанию  (см.
extensions.conf)   перенаправляется  на  эхо  тест  задержки.  Это
позволит  нам  убедиться  что  все  работает  правильно  и  заодно
определить на слух задержу сигнала.

4. Запускаем астериск в режиме консоли

skype:~# /etc/init.d/asterisk stop; asterisk -c -vvv -ddd

Если  все настроено верно - скайп должен показать уведомление о
том,   что   другая   программа   пытается  к  нему  подключиться.
Обязательно  отмечаем  галку “Remember this selection” и разрешаем
подключение.

После  этого пробуем позвонить на эту скайп запись. Если все настроено
верно  -  вы  должны слышать эхо-тест астериска. Кстати, распознавание
DTMF  прекрасно  работает, что позволяет создавать IVR на базе данного
решения.

Запуск скайп в виртуальном X сервере

Для  того,  чтобы  skype работал в виртуальном X11 окружении установим
xvfb - Virtual Framebuffer ‘fake’ X server.

skype:~# apt-get install xvfb

Данный  сервер  позволяет работать X11 приложением локально, не требуя
видео  карты  и  потребляя  сравнительно немного ресурсов. Для запуска
скайпа создадим скрипт skypestart.sh:

#!/bin/sh

# loading sound driver
/sbin/modprobe snd_dummy
# setting DISPLAY
export DISPLAY=:1
# starting virtual framebuffer X-Server
nohup /usr/bin/Xvfb ${DISPLAY} -screen scrn 300x600x8 &gt;/dev/null &amp;
echo &lt;skypenick&gt; &lt;password&gt;|/usr/bin/skype --pipelogin &amp;
# restarting asterisk
sleep 5
/etc/init.d/asterisk restart

заменив  <skypenick>  <password>  на  данные skype записи. Этот скрипт
загружает   snd_dummy,   запускает   X-server   и   загружает   скайп.
Перезагрузка  астериска требуется для того, чтобы он установил связь с
клиентом.

Скрипт можно добавить в крон, например так:

@reboot /root/skypestart.sh

Или  сделать на его основе полноценный init.d сценарий. Также возможна
запуска  более  чем  одной  копии  Skype.  Для  этого надо скопировать
$HOME/.Skype/  в соответствующие поддиректории, и переопределив HOME и
DISPLAY  запустить  для  каждой  из  копий свой xvfb сервер и клиента,
добавив соответствующие записи в конфигурацию asterisk.

Redirect звонков skype на SIP phone

Для  тестирования  работы  skype  c  SIP  телефоном  я использовал ATA
adapter  Linksys  (подойдет  и  любой  sofpthone,  например  - Ekiga),
подключив   его   к  Asterisk.  Для  этого  создадим  запись  в  файле
/etc/asterisk/sip.conf

; linksys ata adapter, skype testing
[sipphone]
context=default
type=friend ; ATA login
secret=f.ck ; ATA password
host=dynamic ; allow to register

Перезапустим  Asterisk  и  настроем  АТА  адаптер используя Asterisk в
качестве сервера. Для проверки наберем на SIP телефоне 600#, вы должны
услышать эхо тест.

Если   все   работаем   -   настроим   перенаправление.  Для  этого  в
/etc/asterisk/skypiax.conf  заменим строчку extension=600 на, например
extensions=555.    В   файле   /etc/asterisk/extensions.conf   (секция
[default]) добавим

exten =&gt; 555,1,Dial(SIP/sipphone);

Перезапустим  Asterisk  и  попробуем  вызвать  наш тествовый SkypeID -
звонок  должен быть перенаправлен на sipphone. Единственный неприятный
момент  -  скайп  берет трубку сразу после поступления вызова, так что
корректную сигнализацию, вероятно, обеспечить не удастся.

Вызов skype абонентов

Для  того,  чтобы  с  sipphone  вызывать skype пользователей - добавим
соответствующие   записи   в   /etc/asterisk/extensions.conf   (секция
default), например

[default]
exten =&gt; 555,1,Dial(SIP/sipphone);
exten =&gt; 556,1,Dial(Skypiax/skypeclient/echo123);
exten =&gt; 557,1,Dial(Skypiax/skypeclient/drugdiler);
exten =&gt; 558,1,Dial(Skypiax/skypeclient/advokat);

и  в  консоли  Asterisk  наберем  dialplan  reload.  Теперь  набрав на
sipphone 556 asterisk соединет нас с Skype call testing service. Что и
требовалось )

Заключение

Для  использования  решения  в production желательно сделать некоторые
доработки,   так   я  планирую  сделать  скрипты  для  пуска/остановки
клиентов,  создать  rootless  окружение для всего этого, интегрировать
все это хозяйство с monit и перенести все в Xen domU. Тем не менее
уже  сейчас  понятно  что решение работоспособно и работает достаточно
неплохо. Я буду рад дельным замечаниям и комментариям на эту тему.

Оригинал: samm.kiev.ua/articles:skype

Популярность: 84% [!]

Tagged with: , , ,


Спонсор



 WPSN comments




Да человек я, человек! =)

ITDoc самый Последний