1. Основы VoIP и протоколы SIP с PJSIP
Традиционная телефония десятилетиями опиралась на выделенные медные линии. Когда вы звонили в другой город, телефонная станция физически замыкала цепь между вашим аппаратом и аппаратом собеседника. Эта технология надежна, но крайне неэффективна: пока вы молчите, линия все равно занята, а прокладка кабелей стоит огромных денег.
IP-телефония (или VoIP — Voice over Internet Protocol) решает эту проблему, превращая человеческий голос в цифровые данные. Вместо удержания выделенной линии, голос сжимается, нарезается на мелкие кусочки (пакеты) и отправляется через интернет точно так же, как электронные письма или веб-страницы.
Представьте, что вы отправляете книгу по почте. В традиционной телефонии вам пришлось бы арендовать целый поезд, чтобы отвезти одну книгу. В IP-телефонии вы разрываете книгу на страницы, кладете каждую в отдельный конверт и отправляете обычной почтой. На стороне получателя страницы снова собираются в книгу. Если пара конвертов придет с задержкой, получатель все равно поймет смысл.
Такой подход кардинально снижает стоимость связи. Для расчета объема передаваемых данных в VoIP используется простая формула:
Где — итоговый объем данных в килобайтах, — скорость потока данных выбранного кодека (например, около 10 килобайт в секунду для стандартного кодека G.711), а — время разговора в секундах.
При таких параметрах минута непрерывного разговора потребует всего около 600 килобайт трафика. Это позволяет компаниям совершать тысячи одновременных звонков через стандартное интернет-подключение, экономя колоссальные бюджеты на междугородней и международной связи.
Разделение труда: протоколы SIP и RTP
Чтобы два устройства могли поговорить через интернет, им нужно договориться о правилах. В VoIP эти правила разделены на две независимые части: управление вызовом и передача самого голоса.
SIP (Session Initiation Protocol) — это протокол установления сеанса. Он не передает звук. Его единственная задача — найти абонента, сообщить ему о звонке, договориться о том, как именно будет передаваться голос, и завершить звонок, когда кто-то положит трубку.
RTP (Real-Time Transport Protocol) — это транспортный протокол реального времени. Именно он переносит пакеты с вашим голосом от одного устройства к другому после того, как SIP выполнил свою работу.
> SIP — это администратор в ресторане. Он встречает вас, проверяет бронь, провожает к столику и уходит. Он не готовит еду и не кормит вас. Еда, которую вам приносят официанты — это RTP. > > tools.ietf.org
!Схема взаимодействия протоколов SIP и RTP при телефонном звонке
Программная АТС Asterisk и драйвер PJSIP
Чтобы управлять десятками или тысячами звонков, маршрутизировать их, записывать разговоры и создавать голосовые меню, нужен центральный мозг. Таким мозгом выступает Asterisk — самая популярная в мире программная АТС (Private Branch Exchange, PBX) с открытым исходным кодом.
Исторически в Asterisk использовался модуль chan_sip для работы с протоколом SIP. Однако со временем протокол усложнялся, и старый модуль перестал справляться с современными требованиями. Ему на смену пришел PJSIP — современный, модульный и высокопроизводительный стек.
Главное отличие PJSIP от предшественника заключается в его архитектуре. Если раньше все настройки абонента сваливались в одну кучу, то PJSIP разделяет конфигурацию на логические блоки:
Endpoint* (Конечная точка) — базовый профиль устройства (кодеки, таймеры, функции) Auth* (Авторизация) — логин и пароль для подключения AOR (Address of Record*) — адресная книга, которая знает, какой IP-адрес сейчас у устройства
| Характеристика | Старый chan_sip | Новый PJSIP | | :--- | :--- | :--- | | Архитектура | Монолитная (все в одном файле) | Модульная (разделение на Endpoint, Auth, AOR) | | Поддержка устройств | Одно устройство на один аккаунт | Несколько устройств на один аккаунт (например, телефон на столе и приложение в смартфоне) | | Статус | Устарел (Deprecated) | Активно развивается и поддерживается |
Подготовка сервера Ubuntu 22.04
Любая надежная система IP-телефонии начинается с правильно подготовленного фундамента. Мы будем использовать операционную систему Ubuntu 22.04 LTS.
Перед установкой Asterisk необходимо обновить систему и установить инструменты для сборки программ из исходного кода, а также библиотеки, необходимые для работы с криптографией, базами данных и медиа-форматами.
Откройте терминал вашего сервера и выполните команду обновления:
После завершения обновления установите базовые зависимости. Этот процесс может занять несколько минут:
Каждая из этих библиотек выполняет свою роль. Например, libssl-dev нужна для шифрования звонков, а libjansson-dev позволяет Asterisk работать с форматом данных JSON, который активно используется в современных веб-интеграциях.
Установка Asterisk из исходного кода
Хотя Asterisk можно установить из стандартных репозиториев Ubuntu одной командой, в профессиональной среде его всегда собирают из исходного кода. Это дает полный контроль над тем, какие модули будут включены в систему, и позволяет использовать самую свежую стабильную версию.
Перейдите в директорию для загрузки исходников и скачайте архив с 20-й версией Asterisk (текущая LTS-версия):
Распакуйте скачанный архив и перейдите в созданную папку:
Перед компиляцией Asterisk должен проверить вашу систему и убедиться, что все необходимые компоненты присутствуют. Для этого в комплекте идет специальный скрипт, который автоматически скачает недостающие библиотеки для работы с MP3 и другими форматами:
Теперь запустите конфигуратор:
Если конфигурация прошла успешно, вы увидите на экране логотип Asterisk, нарисованный символами ASCII. Это значит, что система готова к сборке.
Запустите процесс компиляции. Команда make переведет исходный код на языке C в исполняемые бинарные файлы. Это самая ресурсоемкая часть установки:
После успешной компиляции установите программу в систему:
Чтобы не писать конфигурационные файлы с абсолютно чистого листа, установите базовые примеры конфигураций. Они послужат отличным шаблоном для дальнейшей настройки:
Наконец, создайте скрипты инициализации, чтобы Asterisk автоматически запускался при перезагрузке сервера:
Запустите службу Asterisk и проверьте ее статус:
Если в выводе последней команды вы видите зеленую надпись active (running), значит, ядро вашей будущей IP-АТС успешно установлено и работает.