Недавно на Хабре была статья про «необычные» DEF-номера. Под необычностью скрывалась «многоканальность» — возможность принимать на номер несколько параллельных звонков (а разговаривать по ним будут операторы колл-центра). Целых пять одновременных разговоров и восклицательный знак в конце фразы! Под катом я расскажу про многоканальность не с маркетинговой, а с технической точки зрения. Как операторы «принимают» звонки, чем «необычный DEF-номер» отличается от «обычного ABC-номера», и много это или мало — целых пять параллельных звонков? Кстати, почему именно пять, а не двадцать или сто?

Кишки телефонии: E1, PRI, SS7, SIP


Телеком-оператор обслуживает входящие звонки на номер. Это центральная концепция телефонии, из которой растет все остальное. Условный оператор «Рога и Копыта» анонсирует, что будет обслуживать входящие звонки на номер "+1234567890" и брать за это 10 копеек в минуту. Теперь, если вы наберете на своем мобильном указанную строку, то ваш телеком-оператор каким-то образом уведомит «Рога», что есть входящий звонок и неплохо бы с ним что-нибудь сделать. Например, сигнализировать обратно «звонок принят» и начать принимать голосовой поток. Или, не принимая звонка, отправить свой голосовой поток «абонент временно не абонент».

Физически телеком-операторы в разных странах используют разное. Чаще всего это «Primary Rate Interface»: физический интерфейс с гарантированной доставкой пакетов и выделенными каналами по 64 килобита. В точке стыка операторы ставят коробочки вроде этой, которые соединяются между собой забавными SCSI-подобными кабелями. Одна коробочка обычно обслуживает от 4 до 16 E1-подключений, каждое из которых по 32 канала для голоса, несильно сжатого g.711 и сигнализации. Итого больше 500 параллельных звонков на коробочку.

На почетном втором месте SIP со стыком через обычную ethernet-сеть или даже интернет. Здесь никаких «каналов» нет, все упирается в софт, ширину канала и мощность компов. И порядочность интернет-провайдеров, которые иногда настраивают QoS (но чаще – нет).

Номер — это текстовая строка


На самом деле не всегда, у SS7-ISUP есть много разных вариантов представить «кому звоним», но в общем случае можно ожидать именно текстовую строку. Что там будет написано: «84951234567», "+79261234567" или что еще — это уже как договорятся операторы и регуляторы в конкретной стране и регионе. И да, единого стандарта «на весь мир» у нас нету.

Разделение на «городской номер», «ABC географически определенный номер», «мобильный номер», «DEF географически неопределенный номер» — оно условное. Не более чем договоренности операторов о формате и кто кому сколько будет платить за обслуживание данного конкретного номера, плюс нюансы вроде открытой и закрытой нумерации или что в рамках одного города можно звонить без префикса этого города. При условии что все операторы смогли об этом договориться и правильно настроить у себя софт.

И что же с многоканальностью?


Итак, имеем 2 факта:

  1. Оператор обслуживает номер и может принимать запросы на входящий звонок. За деньги.
  2. Номер — это текстовая строка. Разные номера отличаются только договоренностью операторов как принимать на них звонки и сколько за это брать денег.

Как видите, ничего не предвещает ограничения «только один звонок на номер». И такого ограничения действительно нет! У любого номера «врожденная» многоканальность. Ограничения могут быть только на стороне оборудования (недостаточно физических подключений E1) или логические (это номер сотового. Абонент сейчас уже говорит по телефону. Куда девать еще 10 входящих на этот же номер?).

На практике можно ожидать корректную работу до 100 параллельных вызовов на один номер. При очень большом числе вызовов у оператора, инициирующего звонок (например, это сотовый оператор) не получится распределить его на принимающего оператора, и обратно мы услышим редкоземельную ошибку «извините, все линии заняты».

Как это делаем мы в Voximplant


На каждый входящий звонок у нас создается отдельная JavaScript-сессия, где выполняется загруженный вами код. И уже он решает, что делать с этим звонком. Например, если это номер ритейлера, то можно сделать HTTP-запрос на бэкенд, узнать состояние заказа по номеру и если у звонящего клиента есть заказ — синтезировать это голосом и предложить что-нибудь сделать, например перенести время.

Можно отправить звонок в колл-центр, облако может звонить в PSTN (телефонную сеть общего пользования) и на SIP. А можно собрать колл-центр самому — есть готовые «батарейки» для очереди сообщений и SDK, чтобы принимать звонки в веб-браузерах и мобильных приложениях.

Вообще, JavaScript «рядом» со звонком, выполняемый в реальном времени, позволяет делать много интересных штук еще до того, как «мультиканальность» упрется в живых людей колл-центра, техподдержки или телемедицины. К примеру, можно HTTP-запросом получить загруженность колл-центра (или прямо из JS, если очереди сообщений наши), и, если там «оператор ответит более чем через десять минут» — предложить самим перезвонить клиенту. JavaScript-сессия может спокойно продолжить свою работу после того, как звонящий повесил трубку. Получив у пользователя согласие на перезвон (например, распознав утвердительный ответ или попросив ввести цифру с клавиатуры телефона) сессия отправляет запрос в очередь ожидания или колл-центр, ждет сколько надо, а после соединения с оператором синтезирует ему что сейчас произойдет, звонит обратно по запомненному номеру телефона, синтезирует что это за звонок и, наконец, соединяет оператора с человеком. JavaScript — это сила.

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


  1. Methos
    31.01.2018 00:06

    Что за бред?


    1. eyeofhell Автор
      31.01.2018 09:24

      Что не понравилось?


      1. Debug_all
        31.01.2018 12:34
        +2

        По порядку и, по возможности, более конструктивно, чем оратор выше:

        «Primary Rate Interface»: физический интерфейс с гарантированной доставкой пакетов и выделенными каналами по 64 килобита.
        Поток E1/T1 — это коммутация каналов, а не пакетов. И никаких механизмов гарантированной доставки там нет.
        от 4 до 16 E1-подключений, каждое из которых по 32 канала для голоса, несильно сжатого g.711 и сигнализации.
        Во фрейме E1 30 тайм-слотов под голос, один под сигнализацию (16-й) и один под тактовую синхронизацию (0-й).
        На почетном втором месте SIP со стыком через обычную ethernet-сеть или даже интернет.
        И опять: «обычную Ethernet-сеть» нужно читать как «выделенный канал». В противовес публичному Интернет-каналу. На уровне L2/L1 доступ может предоставляться как угодно, лишь бы была IP-связность поверх. На то он и VoIP.
        порядочность интернет-провайдеров, которые иногда настраивают QoS (но чаще – нет).
        Интернет по своей природе не имеет никаких гарантий передачи данных и параметров качества обслуживания. Любой публичный трафик идет как best effort. Сетевой нейтралитет и все дела (его отмена местами — отдельная тема для разговора).
        это номер сотового. Абонент сейчас уже говорит по телефону. Куда девать еще 10 входящих на этот же номер?
        Внезапно, отправить на этот же сотовый второй линией или поставить в ожидание. Как Вы заметили, это логическое ограничение.
        На практике можно ожидать корректную работу до 100 параллельных вызовов на один номер.
        Только стоит обозначить, что это именно ваша практика. Колл-центры федерального масштаба могут иметь в разы больший поток вызов и количество линий для них.
        Разделение на «городской номер», «ABC географически определенный номер», «мобильный номер», «DEF географически неопределенный номер» — оно условное. Не более чем договоренности операторов о формате и кто кому сколько будет платить за обслуживание данного конкретного номера
        Есть в РФ такое Министерство Информационных Технологий и Связи, и все «не более чем договоренности» регулируются на уровне Приказов и Федеральных Законов, за нарушение которых провайдер может остаться слегка без лицензии. Географически определяемые номера законодательно привязаны к региону (отсюда и название), провайдер из Москвы не может дать номер в ABC-коде 495 абоненту из Владивостока. На DEF подобное ограничение не распространяется.
        Что там будет написано: «84951234567», "+79261234567" или что еще — это уже как договорятся операторы и регуляторы в конкретной стране и регионе. И да, единого стандарта «на весь мир» у нас нету.
        E.164 от ITU-T?


        1. eyeofhell Автор
          31.01.2018 12:37

          Хабр — торт. От себя добавлю, что 100 одновременных — это то, что можно ожидать «из коробки». У некоторых наших клиентов намного больше, но такие объемы уже лучше предварительно согласовывать, чтобы проверить интерконнекты и все прочее, что может стать бутылочным горлышком.


          1. Debug_all
            31.01.2018 13:38
            +1

            И я выше сам оговорился: синхронизация в нулевом тайм-слоте в Е1, конечно же, цикловая.

            И что же с многоканальностью?
            Итак, имеем 2 факта:
            Здесь по-моему нужно выделить несколько другие моменты:
            1. Вызов на какой-то номер — это абстракция. Грубо говоря, это выглядит как «вызываемый номер Б -> маршрутизировать туда».
            2. Реализация накладывается на физические (производительность оборудования, пропускная способность или емкость каналов связи и т.п.) и логические (количество линий по договору, возможности оборудования и ПО, логика маршрутизации и т.п.) ограничения операторских сетей и абонентских стыков.
            «Туда» может быть как одной линией (физической или виртуальной), так и несколькими. А может быть и вовсе другим номером, если включена переадресация (безусловная или при занятости/переполнении).

            К слову, абонентских стыков под один и тот же номер может быть энное количество по разным технологиям. Например, в сначала вызовы приходят в Е1, затем — в SIP-транк, а если первые два варианта недоступны — по старому медному многопарнику на FXO-порты. Как-то так обычно делается (гео)резервирование и отказоустойчивость.


            1. eyeofhell Автор
              31.01.2018 15:29

              Да, я не стал излишне усложнять описание. Не для телекомщиков очень много терминов, а телекомщики и так знают как эта магия работает.


        1. vazir
          31.01.2018 13:09
          +1

          Во фрейме E1 30 тайм-слотов под голос, один под сигнализацию (16-й) и один под тактовую синхронизацию (0-й).

          16 — это только в PRI принято, для SS7 сигнализация может быть, и довольно часто либо в отдельных слотах в конкретном потоке (для экономии того самого таймслота ибо сигнализации так много не надо), либо вообще по IP (ибо ее наоборот может быть очень много и совершенно не связанной с голосом).
          Кстати автор это заметил по ходу не углубляясь в детали — ибо у каждой технологии своя специфика


          1. eyeofhell Автор
            31.01.2018 15:30

            Раньше было 30А + 2Б, но сейчас там действильно все довольно гибко.


      1. Methos
        31.01.2018 12:49
        +1

        Писк-восторг по отношению к javascript так смешно читать.

        Как-будто бы плотник начал рассказывать — «а вот мой молоточек, мои гвоздички»


        1. eyeofhell Автор
          31.01.2018 12:50

          Так все остальное у всех плюс-минус одинаковое. А JavaScript мы любим. Это удобно. Компании могут делать телефонную автоматику силами своих веб разработчиков. Это круто.

          P.S. Если ты продаешь молотки, то вполне логично рассказывать, какие они клевые :)


          1. Methos
            31.01.2018 15:06
            +1

            плотник не продаёт молотки

            он делает мебель

            и клиенту пофиг, какие молотки и гвоздики у плотника

            ему важно качество мебели


            1. eyeofhell Автор
              31.01.2018 15:32

              Но мы-то не плотники. Мы производители молотков :) А нашу платформу уже используют и те, кому нужна телефония для себя (ритейл, такси, банки) и те, кто ее добавляет в свои продукты (CRM, телемедицина, хелпдеск)


  1. pixelcube
    31.01.2018 00:12

    eyeofhell Все хотел спросить, на каком движке работает VoxEngine? Находится ли под капотом V8 или что-то похитрее?


    1. aylarov
      31.01.2018 02:58

      Похитрее :)


    1. eyeofhell Автор
      31.01.2018 09:26

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


  1. LeonidY
    31.01.2018 04:05

    Со времен начала наводнения фальшивых звонков в пожарные службы в России хотел узнать — вызывающего абонента определяют по CID или ANI?


    1. eyeofhell Автор
      31.01.2018 09:23

      По CID. ANI — это внутренняя штука для биллинга номеров вроде 8-800


  1. achekalin
    31.01.2018 11:13
    +1

    Если так почитать, то, получается, ваша уникальность — всего лишь в использовнаии JavaScript? Вряд ли так просто, потому что иначе то же (или более-менее то же, и более-менее теми же руками) делается и не только на JS.
    У вас, конечно, вроде как все из коробки, но к вам же и привязано, и игра идет по вашим ценам за все.


    1. eyeofhell Автор
      31.01.2018 11:18

      Строго говоря, мы единственные, кто позволяет управлять звонками в реальном времени. JavaScript мы выполняем параллельно со звонком, и задержки между командами и тем, что происходит с голосом и видео, минимальные.

      Но мы стараемся делать не «уникальные фишки», а удобное управление телефонией для разработчиков. У нас большая телеком экспертиза (более 10 лет), много телекомщиков в команде, мы это любим и умеем. С помощью Voximplant можно собрать автоответ, уведомление о доставке или видеомост за полчаса. И оно будет просто работать. Причем сделать это может обычный веб разработчик, знания Asterisk не требуются :)

      При этом мы хорошо масштабируемся — на нашей платформе собиаются очень разные штуки, от простых демок на хакатонах до огромных телефоний вроде Битрикс24


      1. stxoce
        31.01.2018 12:33

        Строго говоря, мы единственные, кто позволяет управлять звонками в реальном времени.

        Это не так: Twillio, Plivo, Nexmo позволяют делать тоже самое. Яндекс.Телефония вроде как тоже двигается в эту сторону.
        Уверен что помимо перечисленных провайдеров, также существуют десятки других, со схожей функциональностью, просто эти мне сразу пришли на ум, так как с ними приходилось иметь дело.


        1. eyeofhell Автор
          31.01.2018 12:34

          У всех перечисленных клиент-серверное взаимодействие, это не Realtime.


          1. stxoce
            31.01.2018 13:27

            Прошу прощения, возможно я что-то не так понял. Не могли бы вы объяснить, чем отличается ваш WebSDK от того же Plivo или twilio-js и в чем заключается его Realtime-овость?


            1. eyeofhell Автор
              31.01.2018 15:33

              Web SDK — это чтобы веб страница могла звонить и принимать звонки. Секретный соус в VoxEngine — это JavaScript, который выполняется у нас в облаке в ответ на любой входящий или исходящий звонок: с сотового, Web SDK, мобильного SDK, SIP железки… Можно делать решения вообще без SDK, только на телефонных номерах и облачном JavaScript, который рулит звонками.


  1. Litlman
    31.01.2018 12:33

    Спасибо за труды, в целов реклама прошла успешно…


  1. Gansterito
    31.01.2018 13:50

    у SS7-ISUP есть много разных вариантов представить «кому звоним», но в общем случае можно ожидать именно текстовую строку.
    Параметры ISUP Called Party Number и Calling Party Number, исходя из своего названия, передают номер, то есть число. Каждая цифра этого номера кодируется четырьмя битами (комбинация 1111 — окончание номера, 1001-1110 — свободные). Это не считая индикаторов Numbering plan, Nature of address, Screening, Address Presentation, которые идут отдельными полями суммарной длиной в 16 бит.

    О других способах передачи номеров вызывающих/вызываемых абонентов, которые реально используются на телефонных сетях общего пользования, я не слышал. Вы пишите про «много разных вариантов». Можете привести пример?


    1. eyeofhell Автор
      31.01.2018 15:38

      В length indicator и nature of address можно много всего записать интересного. Но скажу честно — таки да, я умышленно привел их к общему знаменателю чтобы сделать понятную статью. На практике в тех wireshark логах что я видел у коллег там только цифры. Но Хабр же не только торт, но и научпоп? Если писать все как есть, то кроме узких спецов никто не поймет о чем это. Кошелек Миллера, все дела.