PBX

Вначале были контейнеры

Контейнеры имеют очень длинную историю. В отличие от виртуализации, когда на одной физической машине мы можем запускать несколько независимых виртуальных машин, контейнеры существуют поверх операционной системы. Данный подход позволяет более гибко использовать ресурсы основной машины, но, в то же время, накладывает определенные ограничения. К примеру, мы можем легко запустить CentOS Linux поверх Ubuntu, но мы не сможем запустить Windows поверх Ubuntu.

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

Но, как управлять этими контейнерами? Как взаимодействовать между ними? Обычный подход виртуальных машин тут уже неуместен, необходимо что-то новое. И этим новым стал Docker.

Сегодня добавили новую фичу в библиотеку webitel для bpmonline — уведомления браузера. Для начала необходимо разрешить для сайта (на demo стенде уже можно опробовать):

allow

Теперь можем свернуть браузер и работать в другом приложение. При входящем вызове мы получим такое вот окошечко:

incoming call

А если звонок пропустили, тогда:

missed call

Работает в браузере Chrome, Opera и должно работать в FireFox (не проверял еще).

Бесплатные звонки — звучит как рекламный лозунг! Нет, это не реклама (хотя…).

Рады представить сообществу Terrasoft новый продукт Webitel Community, который позволяет бесплатно совершать видео и аудио звонки между пользователями bpmonline 7 с использованием технологии WebRTC. Каждой компании, которая оставит заявку на сайте, будут предоставлены 5 лицензий Webitel Community.

Что предлагает Webitel Community?

  • Бесплатные звонки между пользователями
  • Видеозвонки
  • Определение статусов сотрудников
  • Перевод звонка и удержание

Если Вас у Вас есть пожелания — пишите в комментариях.

PS: небольшое видео, как это все работает: https://vimeo.com/97131875

PPS: если Вы установите на свой bpmonline 7 пакет Webitel Community и в другой компании сделано то же самое, то Вы сможете позвонить им тоже бесплатно. Вот оно — Community!

На этой неделе начали тестировать Webitel CTI — небольшая web-панель, которая позволит совершать звонки с любого веб-решения. Первая версия выйдет под bpmonline и вот что мы уже сейчас имеем:

С помощью набора JavaScript библиотек, мы подключаем нашу панель:

main

Сегодня состоялась внутренняя презентация нового поколения Webitel для работы с CRM системой bpmonline. Продукт был переписан с «0», что и заняло достаточно много времени для его запуска. Серверная часть теперь только Linux и да, мы работаем с WebRTC (голос и видео). Используются современные адаптивные кодеки OPUS и VP8, что позволяет передавать голос в CD качестве.

Выглядит это так:
Знімок екрана 2014-04-03 о 17.37.57

На текущий момент аудио и видео (WebRTC) работает в следующих браузерах (проверял лично):

  • Chrome 33
  • Firefox 28
  • Opera 20

Попробовать и Вы можете! Для этого достаточно перейти по ссылке Demo стенда Webitel и сделать несколько звонков (Demo — логин и пароль).

Тестируем!

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

Нам понадобится утилита convert.exe из пакета ImageMagick. Утилиту забрасываем в папку CallManager\ (с ее помощью будим конвертировать TIF в PDF для отправки на Email). Так же, создадим папку CallManager\htdocs\storage\FAX — тут будут хранится оригиналы полученных факсов в TIF формате. Не забываем про настройки SMTP клиента, иначе ничего никуда не отправится!

Собственно Lua-скрипт довольно простой:

t38 = "false";
CallerID = session:getVariable("caller_id_number");
FaxDir = session:getVariable("storage_dir").."/FAX/";
FaxFile = FaxDir..os.date("%Y").."_"..os.date("%m").."_"..os.date("%d").."_"..os.date("%H").."-"..os.date("%M").."_"..CallerID..".tif";

session:answer();
session:sleep(1000);
session:execute("playback", "users/auto_fax.wav");
session:execute("playback", "users/press_start_to_receive_a_fax.wav");
session:execute("set", "fax_enable_t38_request="..t38);
session:execute("set", "fax_enable_t38="..t38);
session:execute("playback", "silence_stream://2000");
session:execute("rxfax", FaxFile);

freeswitch.email("to@webitel.ua",
	"from@webitel.ua",
	"subject: FAX from "..CallerID.."\n",
	"Приветствую!\n\nВам отправили FAX, который я прикрепил во вложение.\n\n--\nВаш, Webitel",
	FaxFile,
	"convert.exe",
	"pdf");

session:hangup();

Осталось назначить внутренний номер для этого скрипта и все факсы будут сохранятся на сервере:

Принятые Факсы
Принятые Факсы

А так же, приходят на Email:

Факс на Email
Факс на Email

Для IP-телефонии критичны задержки пакетов в сети, хотя технология обладает некоей толерантностью (устойчивостью) к потерям отдельных пакетов. Так, потеря до 5 % пакетов не приводит к ухудшению разборчивости речи. Максимальное отклонение между последовательной передачей пакетов в сети Интернет не должны превышать 50 мс. Максимальный процент потерь при передачи пакетов в сети Интернет – не более 3%.

Причины задержек в передаче голосовых данных по сети IP в большой степени связаны с особенностями транспорта пакетов. Протокол TCP обеспечивает контроль доставки пакетов, однако достаточно медленный и потому не используется для передачи голоса. UDP быстро отправляет пакеты, однако восстановление потерянных данных не гарантируется, что приводит к потерянным частям разговора при восстановлении (обратном преобразовании) звука. Немалые проблемы приносит джиттер (отклонения в периоде поступления-приёмки пакетов), появляющийся при передаче через большое число узлов в нагруженной IP-сети. Недостаточно высокая пропускная способность сети (например при одновременной нагрузке несколькими пользователями), серьёзно влияет не только на задержки (то есть рост джиттера), но и приводит к большим потерям пакетов.

Между конечными точками пользователей и серверами IP-телефонии, а также между серверами IP-телефонии и оборудованием оператора связи (поставщика VoIP) программных или аппаратных устройств, канал должен отвечать описанным выше требованиям.

Проверить пропускную способность каналов можно с помощью простой утилиты iperf-2.0.5. Предположим, что мы хотим гарантировать 10 одновременных разговоров с использованием G.711 кодека. Рекомендуемое требование к каналу составляет 1 Мбит/с.

На сервере запускаем iperf с параметрами (ожидать на стандартном порте 5001 входящие UDP запросы):
iperf -u -s

На клиенте запускаем тестирование UDP c длиной 160 байт со скоростью 1 Мбит/с в течение 180 секунд на сервер 10.10.10.119:
iperf -u -c 10.10.10.119 -l 160 -b 1M -t 180

Получаем результат:

Канал пригоден для 10 одновременных соединений.

Icons_39x39_RoutingВ разделе [Маршрутизация] мы можем указать префикс для набранного направления либо несколько префиксов через разделитель «|». К примеру, что бы указать выбор направлений на оператора Life, можем задать: 063|093. Но, что делать, если наши пользователи не придерживаются стандарта? А могут набрать номер того же Life в несколько способов: +38063 , 38063, 8063 или 063.

«Можно создать сразу 4 маршрута», — скажите Вы.
«Достаточно создать только 1 маршрут», — отвечу я 🙂

Для этого воспользуемся регулярными выражениями. В системных настройках Terrasoft, активируйте ключ «WebitelConfigExpertMode»:

WebitelConfigExpertMode

Перезапустите Terrasoft. Теперь в настройках Маршрутизации мы можем использовать регулярные выражения. Все наши 4 варианта можно прописать одной строкой:

Life_RegExp

Обратите внимание! Теперь в направлениях у Вас будет открыт доступ к управлению того, что надо отдавать на шлюз. Здесь достаточно указать сколько последних цифр из выражения отправлять. Если нам не нужны с Life «+38», тогда поставим просто 10 — десять последних знаков в строке. Выглядит это так:

Dialplan

В переменной ${destination_number} храниться то, что набрал пользователь. Из этой переменной я вырезаю 10 последних цифр: (\d{10})$ и результат возвращаю в первую переменную канала (то, что пойдет к оператору): %1

VoiceMailПродолжаю рассказ о новых функциях Terrasoft Webitel 1.3. В этой заметке речь пойдет о голосовой почте.

В новой версии работать с голосовой почтой так же удобно, как и с обычными Email. Все сообщения хранятся в новом разделе и доступны пользователям Terrasoft Webitel. Каждый может видеть сообщения адресованные только ему, а администратор системы — все:

Vmail_Grid

Из интерфейса Вы можете сохранить голосовое сообщения на локальный диск (скачать себе), либо прослушать из системы:

VMail_Save

Как и в почте, доступно меню с пометками:

VMail_Mark

Удаление сообщений происходит через «Корзину», с которой Вы можете восстановить либо полностью удалить:

Vmail_Restore

Если SIP-телефон поддерживает MWI, то он Вас проинформирует о новом сообщении:

VMail_on_Yealink

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

Ну и конечно, если в настройках пользователя Вы указали свой Email, то ждите сообщение в формате MP3 и там:

VMail2EMail

А Вы уже используете голосовую почту?

До официального релиза Webitel 1.3 осталось еще не много, а я уже сейчас хочу начать рассказывать о всех тех новых фишках, что мы в него добавили. Первая на очереди небольшая функция «Маршрут звонка».

Нас часто спрашивали: а как узнать где уже был звонок? Либо: а можно оператору сразу в карточке показать, что абонент был в IVR, потом поговорил с другим оператором, потом его переключили опять на IVR, а с него он попал на другого оператора?

Теперь это все возможно! В карточке звонка оператора доступна новая вкладка «Маршрут», а в разделе [Статистика] — кнопка, нажав на которую, Вы увидите историю прохождения звонка:

Roadmap

На снимке экрана видно, как абонент позвонил на пользователя, который переключил абонента на IVR-меню, после он попал на входящую очередь КЦ, где его обслужил оператор КЦ.

Как Вы думаете: насколько будет полезной эта функция?