Про софтфоны

written on Monday, September 24, 2012

Батька Столлман вместе с фондон экстремисского-программирования FSF лет сто назад обещал выделить грант на альтернативу скайпа и чото желающих нет. Странно.

При всей замечательности SIP-телефонии, нормальных софтфонов почти нет. И библиотек, на которых их делать - тоже. Сам сигнальный протокол не особо сложнее HTTP, но собрать весь пазл из SIP+SDP+RTP+кодеки+шифрование, да еще не забыть про протыкивалки ната, типа STUN и ICE, врапперы для сотни звуковых систем - это ад.

pjsip

pjsip - крутая либа, на ней сделан 3CX dialer и tlphn.app, там собран вообще весь стек технологий от сигнализации до кодеков и вывода звука на айфоне, но под GPL. В самих приложениях куда-то потеряли шифрование для сигнализации (TLS) и для потока (a=key AES), хотя в коде какие-то намеки есть и srtp валяется в 3rdparty. Кода много, но писали не под грибами и разобраться там можно.

На ней делать ничего не пробовал.

sofia-sip

Нокиевская либа. Тут только сигнализация и offfer/answer, при чем список кодеков тыкается либу строкой, а дальше - как хотите. RTP сами, кодеки и звук сами. Наружу торчит достаточно простой апи, на сайте тонна документации, но либа очень наркоманская - уровень абстракции захотели сделать крутой, а писали на сишечке. Отсюда всякий ад, вроде именованных параметров функций через макросы, выделение памяти в ерланг-стиле (не глобально, а под процесс) и какой-то странный месседж-пассинг.

Когда происходит "ой" и приходится лазить по внутренностям либы, отследить полет мысли и путь, по которому сообщение проходит из сети в парсер, а из парсера в мой коллбек - полнейший анрил. Если упоротый прокси где-то по дороге захуярил вот такой ад:

::
Via: SIP/2.0/UDP 118.73.25.12:11583:63857;rport=11569;branch=z9hG4bK83Hm93NrgeDKp

То сообщение по-тихому отбрасывается и в логах видно только срабатывание таймаута, так как нормального никто не прислал (я не видел серверов, которые сначала шлют кривой ответ, а потом решают одуматься и присылают нормалный).

Если быть очень умным (как я) и не очень скромным, а догадаться полезть смотреть tcpdump, то сообщение таки находится и руки уже тянутся к повышению уровня флуда в логах. В дебажном логе честно признаются, что собщение было, но в нем фатал ирор, а дальше как хотите. Очень весело, но -6 часов на распутывание кишков, по которым оно все бродило.

Когда я полез включать TLS для сигнализации, оказалось, что он вроде бы есть, но подло валит процесс с SIGPIPE, если видит закрытый порт и не осиливает послать INVITE по шифрованному каналу. Опять же молча. В логах видно, что транспорту пнули текстовый пакет, а tcpdump никакого активности не видит.

libre

В libre все очень деревянное. Реализованы транспорты, как абстракции, реализована сигнализация и парсер sdp. Еще где-то рядом лежит rtp и все.

API тупой, зато все простое и понятное, нкито не пытается прыгнуть выше того места, где у сишечки голова. Функции с 10 параметрами - это некрасиво, но лучше чем функции с 10 именованными параметрами через макросы.

А еще оно под BSD. Так что нокиевскую либу я выкидываю и заменяю на libre.

Сервер-сайд

Кроме клиента еще есть сервер-сайд. sofia-sip используется в фрисвиче, но фрисвич вообще написан очень сильно жопой, поэтому его ничего бы не испоритило. Что используется в астериске я узнавать боюсь, потомучто астериска я боюсь вообще. Фрисвич ему противопоставляется, как нормально написанный PBX и видеть еще больший пиздец мне не хочется.

Более-менее вменяемым мне показался Yate. Там от сипа только парсер сообщений, а конечный автомат и поток событий - общие для всего сервера, поэтому нет развесистых кусков кода под каждый channel. Тут мессадж пассинг, при чем в него можно влезть, подключившись к серверу на лету и встроить свою логику в обработку звонков.

Правда документации нифига и как эта шайтан-машина работает, можно понять только по коду. А код принимает решение на основе конфигов, в которых регекспы и sql запросы.

Еще мне не нравится, что yate стартует кучу процессов на каждый чих. Процессы на плюсишечке - это память и локи, поэтому в перформансе сервера у меня сомнения.

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

This entry was tagged code and voip