[Из песочницы] Как менеджер мини-АТС с GSM и записями разговоров делал
Сегодня, в эру высоких технологий и безупречного клиентского сервиса, всем хочется быть на уровне. Многие компании в независимости от ранга и размера постоянно стараются сделать общение с клиентом удобнее и приятнее. В нашем интерне-агентстве, руководителем, которого я и являюсь, одной из таких «приятностей» стало введение в эксплуатацию небольшой мини-АТС на базе Openvox и Asterisk, собранной своими руками. Но давайте по-порядку: ПроблемаТелефон — является одним из основных каналов связи с клиентами в нашей работе. За день поступает множество звонков, которые нужно обработать. От использования аналоговой линии мы отказались сразу, ввиду алчности и ненадежности местных провайдеров. Да и устарели нынче аналоговые технологии. Решение использовать GSM-связь было единогласным и непоколебимым. В первые несколько лет работы за прием звонков отвечал вот такой вот не убиваемый аппарат:
Изначально звонки принимал я и мой партнер по-очереди, находясь в разных углах одного офиса. Когда клиент звонил и прослушав несколько сигналов бездушного зуммера просил с кем-нибудь соединить, то с большой вероятностью он мог услышать свист ветра, который создавал сей финский девайс, пролетая из одного угла офиса в другой. «Многоканальность» была реализована за счет наличия в данном телефоне двух слотов для сим-карт. О записи разговоров речи не было, голосовое приветствие и меню отсутствовали, метод трансфера звонков от одного специалиста к другому был описан выше. Сплошные минусы, в общем, и самое главное, что звонивший к нам человек с первых минут мог подумать, что звонит очередную шарашкину контору из полутора фрилансеров. Что было достаточно обидно, ведь свою работу мы делали хорошо, с гарантиями и душой.
Вдоволь намучившись, одним прекрасным днем было сказано громкое «Хватит!» и не менее громкое «Нужно, что-то предпринять!»
Задача
Необходимо сделать такую «штуку», которая решит все наши проблемы которая заменит старенькую нокию. Эта «штука» должна уметь следующее: Как минимум 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, 2×1800 МГц, 4096 Мб, HDD 500 Гб] — 11 500 рублей;
Бытовой роутер Zyxel Keenetic 4G II — 1 500 рублей.
Итого: 37921 рубльЧто ж, очень даже хорошо, еще и на мороженое осталось.Прим. авт.: Дело было осенью 2014, поэтому цены несколько ниже, чем сейчас.Получение и сборка оборудования
Прошли две недели мучительного ожидания и замыленный курьер вручил мне долгожданную посылку. Содержимое: OpenVox VoxStack VS-GW1202–4G
Шлюз представляет собой небольшой блок (размером со стандартный DVD-привод) и плату, которая помещается внутрь. Данная модель шлюза поддерживает 4 сим-карты, но может быть расширена до восьми путем покупки еще одной платы, которая вставляется рядом. Шлюз подключается в локальную сеть обычной витой парой и в электрическую при помощи адаптера питания.
База и трубки Yealink W52P
Компактная беспроводная база и три трубки. Каждая трубка оборудована зарядной станцией, имеет цветной дисплей и крепление на пояс. Выглядит все достаточно аккуратно. База рассчитана максимум на 5 телефонов. В случае дальнейшего расширения просто докупается еще одна база. Сигнал мощный, хороший прием через кирпичную стену. На качество связи так же жаловаться не приходится.
Неттоп DNS Porto 0166749
Компактный компьютер выступает в качестве сервера. Размером девайс сопоставим с вышеупомянутым OpenVox. Характеристики достаточны для бесперебойной работы телефонии и хранения записей разговоров на несколько месяцев. И зовут его, к стати, Артем.
Собираем все воедино в соответствии утвержденной схемой и устанавливаем ОС 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: sipContext Naming: Based on UsernameProvider Name: openvoxHostname: адрес openvox (по-умолчанию: 172.16.99.1)Username: придумываем имя пользователяPassword: придумываем пароль
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 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 дней времени. В итоге клиенты и менеджеры довольны, звонки пишутся, голосовые приветствия проигрываются, музыка в трубках звучит, уровень сервиса растет. Всем спасибо за внимание, надеюсь, что мое повествование было полезным и интересным.
