written on Monday, September 24, 2012
Батька Столлман разом з фондом екстреміського-програмування FSF літ сто назад обіцяв виділити грант на альтернативу скайпу і чото бажаючих нема. Дивно.
При всій зайобливості SIP-телефонії, нормальних софтфонів майже нема. І бібліотек, на яких їх робити — теж. Сам сигнальний протокол не набагато складніший за HTTP, але зібрати весь пазл з SIP+SDP+RTP+кодеки+шифрування, та ще й не забути про протикалки ната, типу STUN та ICE, враппери для сотні звукових систем — це пиздець.
pjsip — крута ліба, на ній зроблений 3CX dialer і tlphn.app, там зібраний взагалі весь стек технологій від сигналізації до кодеків і виводу звуку на айфоні, але під GPL. В самих додатках кудись загубили шифрування для сигналізації (TLS) і для потоку (a=key AES), хоча в коді якісь натяки є і srtp валяється в 3rdparty. Кода багато, але писали не під грибами і розібратися там можна.
На ній нічого робити не пробував.
Нокієвська ліба. Тут тільки сигналізація і offer/answer, при чому список кодеків передається лібі строкою, а далі — як хочете. RTP самі, кодеки і звук самі. Назовні стирчить досить простий апі, на сайті тонна документації, але ліба дуже наркоманська — рівень абстракції захотіли зробити крутий, а писали на сішечці. Звідси всякий пиздець, на кшталт іменованих параметрів функцій через макроси, виділення пам'яті в ерланг-стилі (не глобально, а під процес) і якийсь дивний меседж-пассінг.
Коли трапляється «ой» і доводиться лазити по нутрощах ліби, відстежити політ думки і шлях, по якому повідомлення проходить з мережі в парсер, а з парсера в мій колбек — повний анріл. Якщо упоротий проксі десь по дорозі захуярив ось такий ад:
Via: SIP/2.0/UDP 118.73.25.12:11583:63857;rport=11569;branch=z9hG4bK83Hm93NrgeDKp
То повідомлення по-тихому відкидається і в логах видно тільки спрацювання таймауту, бо нормального ніхто не прислав (я не бачив серверів, які спочатку шлють криву відповідь, а потім вирішують одуматись і присилають нормальну).
Якщо бути дуже розумним (як я) і не дуже скромним, а догадатися полізти дивитися tcpdump, то повідомлення таки знаходиться і руки вже тягнуться до підвищення рівня флуда в логах. В дебажному лозі чесно признаються, що повідомлення було, але в ньому фатал еррор, а далі як хочете. Дуже весело, але —6 годин на розплутування кишок, по яких воно все бродило.
Коли я поліз включати TLS для сигналізації, виявилося, що він наче є, але підло валить процес з SIGPIPE, якщо бачить закритий порт і не осилює послати INVITE по зашифрованому каналу. Знову ж таки мовчки. В логах видно, що транспорту пнули текстовий пакет, а tcpdump ніякої активності не бачить.
В libre все дуже дерев'яне. Реалізовані транспорти, як абстракції, реалізована сигналізація і парсер sdp. Ще десь поряд лежить rtp і все.
API тупий, зате все просте і зрозуміле, ніхто не намагається стрибнути вище того місця, де в сішечки голова. Функції з 10 параметрами — це некрасиво, але краще ніж функції з 10 іменованими параметрами через макроси.
А ще воно під BSD. Так що нокієвську лібу я викидаю і замінюю на libre.
Крім клієнта ще є сервер-сайд. sofia-sip використовується в фрісвічі, але фрісвіч взагалі написаний дуже сильно жопою, тому його нічо б не зіпсувало. Що використовується в астеріску я дізнаватися боюся, бо астеріска я боюся взагалі. Фрісвіч йому протиставляється, як нормально написаний PBX і бачити ще більший пиздець мені не хочеться.
Більш-менш вменяємим мені здався Yate. Там від сіпа тільки парсер повідомлень, а кінцевий автомат і потік подій — загальні для всього сервера, тому нема розлогих шматків коду під кожен channel. Тут месседж-пассінг, при чому в нього можна влізти, під'єднавшись до сервера на льоту і вбудувати свою логіку в обробку дзвінків.
Правда документації ніхуя і як ця шайтан-машина працює, можна зрозуміти тільки по коду. А код приймає рішення на основі конфігів, в яких регекспи і sql запити.
Ще мені не подобається, що yate стартує купу процесів на кожне чхання. Процеси на плюсішечці — це пам'ять і локи, тому в перформансі сервера в мене сумніви.
Мабуть візьму дуже простий парсер протоколу і на евентлетах зроблю дурного демона, який зберігає діалоги в якомусь мемкеші і працює в режимі драйвера — всі дані і рішення стягує по мережі у іншого куска, який вже дивиться в базу і розуміє, що тут відбувається на більш високому рівні.