Если телеком-оператор связи себя уважает, то он поддерживает SIP и точка. Процесс «абонент А звонит абоненту Б» проще реализовать, если телефония/asterisk/freeswitch взаимодействуют единообразно, по стандарту. Для полноты картины вспомним и про «железные» телефоны, которые – сюрприз – еще не канули в Лету, потому что их использует энтерпрайз. Однако работа с этим протоколом – не самое простое, что есть в телефонии. Сегодня я расскажу, как в нашей платформе реализован SIP и какие нюансы ждут разработчиков; даже если вы не телеком-разработчик, под катом вы узнаете, как взаимодействуют платформы вроде сотовых операторов или нашего Voximplant.

Подключение к Voximplant


Капитан Очевидность напоминает, что протокол SIP – это про сигнализацию, а не про передачу голоса/данных, поэтому первое, что делает SIP-устройство (далее – абонентское устройство) – подключается к серверу и говорит свое «имя»: alice@server.com. В случае Voximplant, имя подключенного устройства будет иметь вид:
alice@application-name.account-name.voximplant.com
Важный момент: облачная телефония воспринимает каждое подключенное устройство как «SIP-телефон».

Подключенное устройство может звонить на сотовые телефоны, Web/Mobile SDK и другие подключенные SIP (используя их имена, например: sip:bob@application-name.account-name.voximplant.com). Типовой звонок с абонентского устройства Voximplant::

  • звонок поступает в облако. Не сразу второму абоненту, а в облако, Карл!
  • в облаке этот звонок обрабатывает JS-сценарий, который направит звонок на второе устройство и свяжет абонентов друг с другом.

Если звонить на другое устройство/клиент, также подключенный к Voximplant, то в сценарии достаточно использовать метод callUser.

А если звонить на SIP-телефон, подключенный к другому оператору, условному «Гигафону»? Для этого две телефонии – Voximplant и «Гигафон» – должны «подружиться»…

Мир, дружба, SIP


«Дружба» между телефониями обычно заключается в том, что серверы Voximplant и «Гигафон» прокидывают между собой сигнализацию по SIP, чтобы в итоге абонентские устройства узнавали друг о друге. Такие серверы называются SIP Proxy (прокси). Когда связь налажена и звонок считается установленным, абонентские устройства начинают обмениваться данными (голос и/или видеопоток) по RTP. Но сперва прокси Voximplant должен разрешить прокси «Гигафона» делать сигнализацию.

Главный способ: trunk


– У меня есть армия..!
– А у нас есть trunk.
© Неназванный фантастический фильм
Trunk – это возможность для других операторов звонить на абонентские устройства Voximplant. Чтобы Voximplant дал доступ к своим устройствам, trunk использует whitelist IP-адресов.

После добавления IP (или подсети) «Гигафона» в whitelist, его SIP-устройства смогут достучаться до наших без процедуры регистрации. Здорово и удобно, но что насчет обратного trunk? Могут ли другие операторы делать trunk на Voximplant, то есть вносить нас в белый список?

Если оператор умеет в trunk, то он может узнать наши явки-пароли-адреса, сделав запрос api.voximplant.com/getMediaResources?with_mediaservers&with_sbcs. В ответ придет JSON с именами и IP актуальных медиасерверов, которые «Гигафон» пропишет у себя.

Но если оператор «Гигафон» не умеет делать trunk на других операторов, то есть вспомогательная функциональность:

SIP-регистрация


В панели управления Voximplant есть раздел SIP регистрации: эта функциональность позволяет зарегистрировать нашу платформу как SIP-устройство в другой телефонии. Представлять огромную облачную телефонию в виде одного SIP-телефона не самое правильное решение, но может быть использовано в качестве «костыля», если другие способы не работают.

SIP – всему голова


Есть мнение, что SIP – плохо стандартизированная область телекоммуникаций, этому вопросу посвящены отдельные статьи на Хабре и не утихают холивары.

Но все же SIP давно стал привычным и (при правильном подходе) удобным «клеем» для телеком-операторов, поэтому trunk – распространенная функциональность, благодаря которой связаны лоскуты на полотне телекоммуникаций. Желаем успехов в обуздании SIP-настроек; если возникнут вопросы – комменты открыты.

Комментарии (5)


  1. vesper-bot
    11.09.2018 17:16

    Как-то ни о чем. Я ожидал, что тут будет поподробнее про то, какой путь проходит сигнал SIP от Алисы на астериске до Боба на проводном МГТС (или хотя бы на линии Гигафона, понятно, что в PSTN никакой сип не ходит). А увидел полторы строки про SIP и один урл с серверами.


    1. nvpushkarskiy2 Автор
      11.09.2018 17:31

      Вы правы, статья скорее популистская, в ней действительно немного технических подробностей. У нас была цель — показать общение телефоний «на верхнем уровне», т.е. объяснить саму концепцию и упомянуть пару нюансов. Как считаете, справилась ли статья с такой задачей?


      1. Arty_Fact
        11.09.2018 17:57

        Не очень получилось, на мой взгляд. Почему регистрация — это только для абонентских устройств, а транк — только для межоператорских стыков? Ведь многие абонентские устройства умеют работать без регистрации, а операторы умеют работать с регистрацией. Как я понимаю, регистрация — это всего лишь способ показать, что устройство находится в сети и готово принимать звонки. А является это устройство обычным софт-фоном или гигантской АТС — не суть.
        PS шутку про армию не понял.


      1. vesper-bot
        12.09.2018 07:40

        Нет, не справилась. Во-первых, хорошо если известен полный адрес абонента (sip:bob@somewhere-sip.com), а если (как бывает НАМНОГО чаще) есть только номер, а абонент к тому же свободно мигрирует между Гигафоном, Осолайном и Большими Яйцами? Как определить, где его искать? Во-вторых, а что это за адреса такие? Как их набирать на обычном SIP-телефоне? Который железный, с кнопками? В-третьих, зачем в популистской статье «метод callUser»? Его ЦА никогда напрямую вызывать не станет. И «Карл» вообще не к месту, и так понятно, что телефон только известной ему второй стороне (а это облако, блин, Карл!) может отослать звонок, ему остальная информация попросту недоступна.

        Лучше бы рассказали, откуда берутся пиры для RTP при разговоре через Voximplant. А то был у меня прецедент с другим оператором: звонки ходят, но голос в одну сторону рвется спустя 15 минут. Выяснил с помощью tcpdump, что один конкретный пир с конкретным IP-адресом, относящимся к провайдеру «Хрен-с-горы» (четвертая сторона, «Карл»), не отдает мне пакеты RTCP, хотя астериск их туда исправно посылает. Хотел пнуть того провайдера, они меня послали на открытым текстом — они в своём праве, мы им никто. Послал логи нашему провайдеру, вначале тоже послали, таки настоял и убедил, видать по своим каналам что-то сделали, стал отдавать RTCP снова и звонки стали идти до разрыва, как положено.


        1. aylarov
          12.09.2018 09:45

          Спасибо за идею для еще одной статьи :) Обязательно напишем про это