Многие из нас уже хорошо знакомы с технологиями голосовой связи с использованием IP сетей. Кто-то просто использует софтофоны для совершения звонков (например знаменитый Skype), а кто-то строит на этом свой бизнес или использует для решения своих технических задач. Про достоинства и недостатки VoIP написано горы статей, в том числе много материалов об использовании готовых решений (IP-телефоны, шлюзы, АТС и т. п.). Но что делать, если необходимо внедрить VoIP в разрабатываемое вами приложение или просто написать свой IP-телефон?
Да, в сети можно найти все необходимые RFC, спецификации стандартов и прочие очень нужные и ненужные документы, но реализовать все с чистого листа в приемлемые сроки просто неподъемная задача.
К счастью, великое сообщество OpenSource не стоит на месте. Открытые разработки есть в том числе и в области IP-телефонии. Я открыл для себя подходящее решение — библиотеку OPAL для С++, которая умеет все необходимое для реализации моей задачи. Поставляется совместно с библиотекой PTLib, которая используется как прослойка между OPAL и железом с системой, что делает этот инструмент универсальным и кроссплатформенным (можно писать для *nix, Windows, WinCE, MacOS). Недостаток в том, что вся документация OPAL представляет собой просто Class Reference, автоматически сгенерированный doxygen-ом, плюс несколько примеров, включая простой софтофон под названием OpenPhone.
Итак, что нам дает OPAL:
Цель статьи — продемонстрировать, как можно быстро и удобно реализовать VoIP в своем приложении на базе библиотеки OPAL. Весь материал в одну статью не поместится, поэтому начну со сборки необходимого инструментария и настройки среды для работы с OPAL.
Для начала работы нужно скачать исходные коды библиотек и скомпилировать их. Я использовал MS Visual Studio 2008, поэтому все рекомендации будут для этого инструмента.
Качаем исходники:
OPAL-3.8.2
PTLib-2.8.2
Там же можно скачать архивы с документацией:
OPAL-htmldoc
PTLib-htmldoc
Кроме этого нужно скачать GNU Bison, он потребуется при сборке.
В OPAL есть поддержка OpenSSL, DirectX, Ruby, OpenLDAP, SDL, Expat и при сборке библиотеки они должны подключиться автоматически, если установлены пакеты разработки.
Сначала создадим папку C:\Tools и закинем туда Bison. Потом открываем студию и прописываем путь к этой папке. Заходим Tools – Options – Project and Solutions – VC++ Directories, выбираем Win32 – Executable files и добавляем строчку C:\Tools

Распаковываем архивы с исходниками например в папки c:\voip\ptlib-2.8.2 и c:\voip\opal-3.8.2. Открываем с помощью студии файл c:\voip\ptlib-2.8.2\ptlib_2008.sln и видим дерево проектов:

Теперь нужно прописать пути к OPAL и PTLib. Открываем тот же диалог Tools – Options – Project and Solutions – VC++ Directories и в разделы Win32 – Include files добавляем папки c:\voip\opal-3.8.2\include и c:\voip\ptlib-2.8.2\include.

В раздел Win32 – Library files добавляем папки c:\voip\opal-3.8.2\lib и c:\voip\ptlib-2.8.2\lib (если папки lib отсутствуют, то их нужно предварительно создать).

Теперь можно запускать сборку проекта PTLib DLL (в моем случае мне нужна динамически загружаемая библиотека). Выбираем конфигурацию Release и начинаем сборку. Должен запуститься скрипт конфигурации, который будет искать установленные SDK в системе. Необходимо внимательно следить за процессом и проверять правильность найденных путей.
Если у вас установлены также другие компиляторы, то нужно исключить их из путей поиска, иначе могут быть конфликты. Для этого создайте переменную окружения с именем VSNET2008_PTLIB_CONFIGURE_EXCLUDE_DIRS и укажите значением переменной список папок через точку с запятой (у себя я отключил использование Ruby и OpenSSL путем добавления их папок в исключения, также добавил туда установленный GCC).

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

Если в таких файлах объявлены макросы с использованием переноса строки (символ \), то нужно убрать пустые строки, иначе не скомпилируется.

После успешной сборки, в папке c:\voip\ptlib-2.8.2\lib вы найдете ptlib.dll и ptlib.lib, или ptlibd.dll и ptlibd.lib если вы компилировали Debug версию.
Теперь можно приступить к сборке самой библиотеки OPAL. Заходим в папку c:\voip\opal-3.8.2 и открываем файл opal_2008.sln. В процессе загрузки проектов студия может выдать сообщения об ошибках, что некоторые проекты не найдены, игнорируем их.

Выбираем конфигурацию Release и запускаем сборку проекта OPAL_dll. По аналогии с PTLib, сначала скомпилируется OPAL_Static, потом OPAL_dll. По идее, сборка должна пройти без проблем, за исключением некоторых файлов с неправильным символом конца строки:
Для исправления действуем аналогично предыдущему случаю.
В результате имеем файлы opal.dll и opal.lib в папке c:\voip\opal-3.8.2\lib.
На этом этапе сборка библиотеки завершена и можно пока почитать документацию и установить OpenPhone для экспериментов. В следующей части приступим непосредственно к написанию кода.
Сайт OPAL http://www.opalvoip.org/
Компиляция под Windows http://www.opalvoip.org/wiki/index.php?n=Main.BuildingPTLib
Онлайн Reference http://www.opalvoip.org/wiki/index.php?n=Main.APIDocumentation
Файлы для скачивания http://sourceforge.net/projects/opalvoip/files/
Статья в Wiki http://ru.wikipedia.org/wiki/OpenH323
Да, в сети можно найти все необходимые RFC, спецификации стандартов и прочие очень нужные и ненужные документы, но реализовать все с чистого листа в приемлемые сроки просто неподъемная задача.
К счастью, великое сообщество OpenSource не стоит на месте. Открытые разработки есть в том числе и в области IP-телефонии. Я открыл для себя подходящее решение — библиотеку OPAL для С++, которая умеет все необходимое для реализации моей задачи. Поставляется совместно с библиотекой PTLib, которая используется как прослойка между OPAL и железом с системой, что делает этот инструмент универсальным и кроссплатформенным (можно писать для *nix, Windows, WinCE, MacOS). Недостаток в том, что вся документация OPAL представляет собой просто Class Reference, автоматически сгенерированный doxygen-ом, плюс несколько примеров, включая простой софтофон под названием OpenPhone.
Итак, что нам дает OPAL:
- поддержка SIP и H.323, включая возможность авторизации, регистрации и прокси
- поддержка основных звуковых и видео кодеков, плюс возможность писать\подключать плагины для коммерческих алгоритмов сжатия
- поддержка переадресации вызовов, в том числе внутренняя переадресация между EndPoint-ами.
- набор переносимых классов библиотеки PTLib, которая включает поддержку многопоточности, интеллектуальные указатели, строки, работу со звуковыми устройствами, с видео устройствами и еще много всяких полезностей.
Цель статьи — продемонстрировать, как можно быстро и удобно реализовать VoIP в своем приложении на базе библиотеки OPAL. Весь материал в одну статью не поместится, поэтому начну со сборки необходимого инструментария и настройки среды для работы с OPAL.
Для начала работы нужно скачать исходные коды библиотек и скомпилировать их. Я использовал MS Visual Studio 2008, поэтому все рекомендации будут для этого инструмента.
Качаем исходники:
OPAL-3.8.2
PTLib-2.8.2
Там же можно скачать архивы с документацией:
OPAL-htmldoc
PTLib-htmldoc
Кроме этого нужно скачать GNU Bison, он потребуется при сборке.
В OPAL есть поддержка OpenSSL, DirectX, Ruby, OpenLDAP, SDL, Expat и при сборке библиотеки они должны подключиться автоматически, если установлены пакеты разработки.
Сначала создадим папку C:\Tools и закинем туда Bison. Потом открываем студию и прописываем путь к этой папке. Заходим Tools – Options – Project and Solutions – VC++ Directories, выбираем Win32 – Executable files и добавляем строчку C:\Tools

Распаковываем архивы с исходниками например в папки c:\voip\ptlib-2.8.2 и c:\voip\opal-3.8.2. Открываем с помощью студии файл c:\voip\ptlib-2.8.2\ptlib_2008.sln и видим дерево проектов:

Теперь нужно прописать пути к OPAL и PTLib. Открываем тот же диалог Tools – Options – Project and Solutions – VC++ Directories и в разделы Win32 – Include files добавляем папки c:\voip\opal-3.8.2\include и c:\voip\ptlib-2.8.2\include.

В раздел Win32 – Library files добавляем папки c:\voip\opal-3.8.2\lib и c:\voip\ptlib-2.8.2\lib (если папки lib отсутствуют, то их нужно предварительно создать).

Теперь можно запускать сборку проекта PTLib DLL (в моем случае мне нужна динамически загружаемая библиотека). Выбираем конфигурацию Release и начинаем сборку. Должен запуститься скрипт конфигурации, который будет искать установленные SDK в системе. Необходимо внимательно следить за процессом и проверять правильность найденных путей.
Если у вас установлены также другие компиляторы, то нужно исключить их из путей поиска, иначе могут быть конфликты. Для этого создайте переменную окружения с именем VSNET2008_PTLIB_CONFIGURE_EXCLUDE_DIRS и укажите значением переменной список папок через точку с запятой (у себя я отключил использование Ruby и OpenSSL путем добавления их папок в исключения, также добавил туда установленный GCC).

Если скрипт конфигурации успешно отработал, начнется сборка библиотеки. Обратите внимание, даже если вы выбрали собирать DLL, сначала будет скомпилирован проект PTLib Static, а потом запустится MergeSym и будет собрана DLL.
В процессе компиляции студия может выдавать ошибки неправильных символов конца строки для некоторых файлов:
1>c:\voip\ptlib-2.8.2\include\ptlib/syslog.h : error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format
В этом случае нужно щелкнуть на строке ошибки и студия выведет диалог с выбором вариантов конца строки, просто жмем ОК, сохраняем файл, запускаем компиляцию снова.

Если в таких файлах объявлены макросы с использованием переноса строки (символ \), то нужно убрать пустые строки, иначе не скомпилируется.

После успешной сборки, в папке c:\voip\ptlib-2.8.2\lib вы найдете ptlib.dll и ptlib.lib, или ptlibd.dll и ptlibd.lib если вы компилировали Debug версию.
Теперь можно приступить к сборке самой библиотеки OPAL. Заходим в папку c:\voip\opal-3.8.2 и открываем файл opal_2008.sln. В процессе загрузки проектов студия может выдать сообщения об ошибках, что некоторые проекты не найдены, игнорируем их.

Выбираем конфигурацию Release и запускаем сборку проекта OPAL_dll. По аналогии с PTLib, сначала скомпилируется OPAL_Static, потом OPAL_dll. По идее, сборка должна пройти без проблем, за исключением некоторых файлов с неправильным символом конца строки:
1>c:\voip\opal-2.8.2\src\opal\recording.cxx : error C4335: Mac file format detected: please convert the source file to either DOS or UNIX format
Для исправления действуем аналогично предыдущему случаю.
В результате имеем файлы opal.dll и opal.lib в папке c:\voip\opal-3.8.2\lib.
На этом этапе сборка библиотеки завершена и можно пока почитать документацию и установить OpenPhone для экспериментов. В следующей части приступим непосредственно к написанию кода.
Полезные ссылки:
Сайт OPAL http://www.opalvoip.org/
Компиляция под Windows http://www.opalvoip.org/wiki/index.php?n=Main.BuildingPTLib
Онлайн Reference http://www.opalvoip.org/wiki/index.php?n=Main.APIDocumentation
Файлы для скачивания http://sourceforge.net/projects/opalvoip/files/
Статья в Wiki http://ru.wikipedia.org/wiki/OpenH323