Как менеджер мини-АТС с GSM и записями разговоров делал

сделай сам

Alexcr

Сегодня, в эру высоких технологий и безупречного клиентского сервиса, всем хочется быть на уровне. Многие компании в независимости от ранга и размера постоянно стараются сделать общение с клиентом удобнее и приятнее. В нашем интерне-агентстве, руководителем, которого я и являюсь, одной из таких «приятностей» стало введение в эксплуатацию небольшой мини-АТС на базе Openvox и Asterisk, собранной своими руками. Но давайте по-порядку:
 

Проблема


Телефон — является одним из основных каналов связи с клиентами в нашей работе. За день поступает множество звонков, которые нужно обработать. От использования аналоговой линии мы отказались сразу, ввиду алчности и ненадежности местных провайдеров. Да и устарели нынче аналоговые технологии. Решение использовать GSM-связь было единогласным и непоколебимым. В первые несколько лет работы за прием звонков отвечал вот такой вот не убиваемый аппарат:
 
Nokia C2-00


Изначально звонки принимал я и мой партнер по-очереди, находясь в разных углах одного офиса. Когда клиент звонил и прослушав несколько сигналов бездушного зуммера просил с кем-нибудь соединить, то с большой вероятностью он мог услышать свист ветра, который создавал сей финский девайс, пролетая из одного угла офиса в другой. «Многоканальность» была реализована за счет наличия в данном телефоне двух слотов для сим-карт. О записи разговоров речи не было, голосовое приветствие и меню отсутствовали, метод трансфера звонков от одного специалиста к другому был описан выше. Сплошные минусы, в общем, и самое главное, что звонивший к нам человек с первых минут мог подумать, что звонит очередную шарашкину контору из полутора фрилансеров. Что было достаточно обидно, ведь свою работу мы делали хорошо, с гарантиями и душой.

Вдоволь намучившись, одним прекрасным днем я сказал громкое «Хватит!» и не менее громкое «Нужно что-то предпринять!»

Задача


Необходимо сделать такую «штуку», которая решит все наши проблемы которая заменит старенькую нокию. Эта «штука» должна уметь следующее:
 
  • Как минимум 3 GSM линии;
  • Головосое приветствие;
  • Музыка вместо гудков;
  • Удержание вызова;
  • Трансфер вызова;
  • Не менее трех независимых трубок, с возможностью расширения;
  • Гибкую настройку переадресации вызова;
  • Запись разговоров;
  • АОН;
  • Список контактов;
  • Минимум проводов;
  • Компактные размеры оборудования.
 

Подбор решения


Для решения задачи был выделен бюджет ни много ни мало 40 000 рублей Российской Федерации. Первым делом я выбрал самый тривиальный способ, а именно: обзвонил все компании в городе, которые могли установить и настроить мини-АТС. Компаний оказалось «великое множество», а именно одна (ох уж эти регионы), которая сказала, что если я умножу наш бюджет на 4, то получится сумма, которой будет достаточно, что бы они все наши «хотелки» сделали. На 4 умножать мне не хотелось, поэтому переходим к плану «Б» — облачная АТС. Благо, сейчас множество подобных сервисов с любым функционалом и на любой кошелек. Но смущает одно — полная зависимость связи от сервиса: нет интернета — нет связи, на сервисе тех. работы — нет связи, не вовремя заплатили абон. плату — нет связи. Да и сервис может в любой момент увеличить стоимость своих услуг или не вернуть данные (записи разговоров, к примеру). Такой вариант, так же меня не устроил. Оставался третий вариант — «костыльно-велосипедный». Что ж, геморроя больше, за то интересно. На нем и остановился.
 

Выбор и покупка оборудования и софта


Поскольку бюджет небольшой, да и любитель я всяких линуксов да опенсорсов. Поэтому с софтом определился сразу — Asterisk в качестве сервера телефонии. В качестве ОС использовал Ubuntu. С аппаратурой все не так просто, немного поразмыслив и переведя кучу бумаги, состряпал такую схему:

схема телефонии

Основными элементами тут приходятся:
 
  • сервер, на котором установлен Asterisk;
  • GSM-шлюз;
  • база беспроводных телефонных трубок;
  • роутер, как связывающие звено;
  • телефонные трубки.

Все работает следующим образом: На шлюз поступает звонок, он этот звонок принимает и отдает на сервер посредством витой пары и роутера. Сервер «берет трубку», играет приветствие, кидает звонок в режим ожидания и связывается с базой трубок. База выбирает нужную трубку и заставляет ее звонить. Когда менеджер принимает звонок, сервер соединяет клиента и менеджера.

Иду в ближайший интернет-магазин и кладу в корзину следующие товары:
 
  • GSM Шлюз OpenVox VoxStack VS-GW1202-4G — 16 932 рублей;
  • База и 1 трубка Yealink W52P — 4 828 рублей;
  • Две дополнительные трубки Yealink W52H — 3 175 рублей.

Вычеркиваю три пункта из списка оборудования, оставшиеся два спокойно можно достать в любом компьютерном магазине нашего городка. Да и хороший повод немного прогуляться:
 
  • В качестве сервера: Неттоп DNS Porto 0166749 [Intel i5-3337U, 2x1800 МГц, 4096 Мб, HDD 500 Гб] — 11 500 рублей;
  • Бытовой роутер Zyxel Keenetic 4G II — 1 500 рублей.

Итого: 37921 рубль
Что ж, очень даже хорошо, еще и на мороженое осталось.
Прим. авт.: Дело было осенью 2014, поэтому цены несколько ниже, чем сейчас.
 

Получение и сборка оборудования


Прошли две недели мучительного ожидания и замыленный курьер вручил мне долгожданную посылку. Содержимое:
 
OpenVox VoxStack VS-GW1202-4G

Шлюз представляет собой небольшой блок (размером со стандартный DVD-привод) и плату, которая помещается внутрь. Данная модель шлюза поддерживает 4 сим-карты, но может быть расширена до восьми путем покупки еще одной платы, которая вставляется рядом. Шлюз подключается в локальную сеть обычной витой парой и в электрическую при помощи адаптера питания.

GSM-шлюз OpenVox VoxStack VS-GW1202-4G
 
База и трубки Yealink W52P

Компактная беспроводная база и три трубки. Каждая трубка оборудована зарядной станцией, имеет цветной дисплей и крепление на пояс. Выглядит все достаточно аккуратно. База рассчитана максимум на 5 телефонов. В случае дальнейшего расширения просто докупается еще одна база. Сигнал мощный, хороший прием через кирпичную стену. На качество связи так же жаловаться не приходится.
 
База и трубки Yealink W52P

Неттоп DNS Porto 0166749

Компактный компьютер выступает в качестве сервера. Размером девайс сопоставим с вышеупомянутым OpenVox. Характеристики достаточны для бесперебойной работы телефонии и хранения записей разговоров на несколько месяцев. И зовут его, к стати, Артем.

Неттоп DNS Porto 0166749

Собираем все воедино в соответствии утвержденной схемой и устанавливаем ОС Ubuntu:

Сбока мини-АТС

Теперь все готово для перехода к самому интересному шагу: настройке нашего сервера.
 

Установка и настройка



Первоначально установим сам Asterisk и GUI к нему. Пошаговый мануал, как этого добиться:http://wiki.enchtex.info/howto/asterisk/asterisk-ubuntu-10.04. Почему не freePBX? На вкус и цвет все фломастеры разные, статья ориентирована на новичков, а мне показалось, что GUI от Digium проще в установке и эксплуатации, в прочем, это сугубо мое мнение.

Теперь нужно «подружить» OpenVox и Asterisk. Сделать это достаточно просто. Сначала войдем в веб-GUI Asterisk (по-умолчанию:localhost:8088), введем логин и пароль указанный при установке. Не долго думая идем по пути: Trunks -> VOIP Trunks -> New SIP/IAX Trunk и указываем следующие настройки:

Type: sip
Context Naming: Based on Username
Provider Name: openvox
Hostname: адрес openvox (по-умолчанию: 172.16.99.1)
Username: придумываем имя пользователя
Password: придумываем пароль
 
Trunks -> VOIP Trunks -> New SIP/IAX Trunkmage


Далее следуем по адресу openvox (по-умолчанию: 172.16.99.1, дефолтный логин и пароль admin:admin) и видим панель управления. Кликаем SIP -> SIP endpoints -> Add New SIp Endpoint:

Name — придумаем имя
User Name — имя пользователя, которое придумали ранее
Password — пароль, который придумали ранее
Registration – This gateway registers with the endpoint

SIP -> SIP endpoints -> Add New SIp Endpoint

Идем в ADVANCED -> Asterisk CLI и пишем sip show registry, при удачном стечении обстоятельств увидим «1 SIP registrations», что означает, что все работает.

Теперь настроим правила для входящих и исходящих звонков в ROUTING -> Call Routing Rules -> New Call Routing Rule.

Исходящие:

Routing Name — имя роута (пусть будет «out-route»)
Call Comes in From — выбираем транк
Send Call Through — выбираем порт openvox'a

Для входящих вызовов все настраивается аналогично, единственный пункт который может вызвать затруднения — это параметр «Forward Number» для правил, тут нужно написать Extension на стороне asterisk на который будет идти звонок.

Продолжим настройку Asterisk GUI, создадим пользователей и правила для звонков, вот небольшой мануал, как это сделать:http://invoip.net/2011/11/vvedenie-v-asterisk-gui/

После того, как произведена начальная настройка Asterisk и Openvox нужно настроить базу трубок, она так же имеет веб-интерфейс, а настройка сводится к сопоставлению пользователей Asterisk и телефонных аппаратов. Теперь можно совершать и принимать звонки. Настало время сделать что-то поинтереснее.
 

Прикручиваем различного рода «свистелки»


Один из самых интересных файлов Asterisk — это «extensions.conf», в нем производится основная масса настроек. Через GUI создадим голосовое меню и сделаем перевод всех входящих вызовов на него, назовем его «voicemenu-custom-1». После этого можно задавать различные параметры того меню используя либо встроенный редактор GUI, либо открыв файл «extensions.conf» в любом текстовом редакторе.
 
Голосовое приветствие

Первоначально задумывалось, что клиент, позвонив к нам слышит голосовое приветствие, в котором сообщается куда он попал. Саму запись приветствия можно осуществить, как самостоятельно, так и обратившись в специализированную компанию, где профессиональный диктор запишет его своим голосом, наложит музыку и прочие звуковые эффекты. Вбиваем в гугл «запись голосового приветствия» и выбираем, то что понравилось. В среднем одна запись стоит от 1000 до 5000 рублей. Запись вы получите в формате mp3, который не очень охотно работает с Asterisk без плясок с бубном. Преобразуем файл в удобный для Asterisk формат:
 
sudo apt-get install sox lame
lame --decode musicfile.mp3 musicfile.wav
sox -V musicfile.wav -r 8000 -c 1 -t ul hello.ulaw


Полученный файл, положим в папку «asterisk/sounds» и вернемся к редактированию меню. Первоначально нам нужно взять трубку и проиграть приветствие, после этого соединить с нужным пользователем:
 
exten=s,1,Answer()
exten=s,2,Background(/var/lib/asterisk/sounds/hello)
exten=s,3,Dial(SIP/500,30,tm)


В «Background» переедаем путь до файла приветствия (только имя файла, без расширения). В «Dial» передаем идентификатор пользователя Asterisk, время в секундах, которое нужно для того, что бы проиграть приветствие и два параметра «t» (разрешает ответившему пользователю перевести звонок) и «m» (проигрывать музыку ожидания). Об остальных параметрах «Dial» можно узнатьтут.
 
Запись разговора

После того, как заработало голосовое приветствие и редактирование «extensions.conf» не вызывает затруднений, прикрутим запись разговоров. Пусть все записи складываются в директории разбитые по годам, месяцам и дням, а в названии файла записи присутствует дата, время и номер звонившего. Звучит сложно? А делается просто:
 
...
exten=s,n,Set(fname=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}_${CALLERID(number)}_in)
exten=s,n,MixMonitor(путь до директории с записями/${STRFTIME(${EPOCH},,%Y)}/${STRFTIME(${EPOCH},,%m)}
....

Многоканальность и переадресация

В ovenvox я вставил три сим-карты, к двум из них привязаны номера, на которые можно совершить звонок, третья карточка — резервная. На уровне оператора настроил переадресацию с первой на вторую, со второй на третью с третьей обратно на первую. Таким образом получилось три полноценных линии для звонка. Хочу сделать акцент на том, что поток звонков в моей компании большой, но не настолько, что бы позвонило одновременно три человека, поэтому такая схема для меня приемлема. Если поток станет больше, можно увеличить количество сим-карт до 8 и настроить очередь звонков. 

Теперь выстроим логику таким образом: звонит первый клиент, менеджер берет телефон №1, тут же происходит второй входящий звонок, должен зазвонить телефон №2, которым воспользуется второй менеджер. Третий клиент будет соединен с третьим менеджером. Что бы это реализовать можно использовать условие «GotoIf»:
 
...
exten=s,n,Dial(SIP/500,30,tm)
exten=s,n,GotoIf($[${DIALSTATUS}=BUSY]?ZANAT,1)
exten=ZANAT,1,Dial(SIP/501,30,tm)
exten=ZANAT,2,GotoIf($[${DIALSTATUS}=BUSY]?ZANAT1,1)
exten=ZANAT1,1,Dial(SIP/502,30,tm)
exten=ZANAT1,2,GotoIf($[${DIALSTATUS}=BUSY]?ZANAT2,1)
exten=ZANAT2,1,Dial(SIP/500,30,tm)
...

Но что будет, если трубку никто не возьмет? Допустим, все ушли на обед или звонок поступил в выходной день. Выход банален: выбираем самого ответственного менеджера и записываем номер его мобильного телефона. Правим «extensions.conf» таким образом:
 
...
exten=s,n,Dial(SIP/500,30,tm)
exten=s,n,GotoIf($[${DIALSTATUS}=BUSY]?ZANAT,1)
exten=s,n,Dial(SIP/8914XXXXXXX@openvox,20,tm)
...

Теперь, если трубку никто не взял в течении 20 секунд, вызов будет переведен на указанный мобильный телефон. Со стороны клиента это будет выглядеть, как незначительно увеличенное время ожидания ответа. Можно пойти дальше и сделать переадресацию в нерабочее время без ожидания, но этот случай я рассматривать не буду.
 
Трансфер, АОН, список контактов

Все эти функции поддерживаются по-умолчанию и работают достаточно хорошо, что бы удовлетворить потребности моей компании, но если есть желание, их всегда можно улучшить. Например, список контактов можно подгружать в xml-файле из CRM-системы.
 

Завершение работ


Все собрав, настроив и проверив, я вдоволь насладился проделанной работой. Осталось все эти коробки и провода, аккуратно убрать куда-нибудь с глаз долой, например в большой железный ящик:

Монтаж мини-АТС

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

Выводы


С момента описанных событий прошло около 4 месяцев. За это время незначительные недоделки были устранены и все работает четко и без сбоев. Без учета времени доставки железок на все работу ушло около 5 дней времени. В итоге клиенты и менеджеры довольны, звонки пишутся, голосовые приветствия проигрываются, музыка в трубках звучит, уровень сервиса растет. Всем спасибо за внимание, надеюсь, что мое повествование было полезным и интересным.