Как работают многоканальные телефонные номера

u_rl9gg4twjv980jyabtqr6aem4.jpeg


Недавно на Хабре была статья про «необычные» 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 — это сила.

© Habrahabr.ru