Доброе время суток %username%.
Хочется за ранее предупредить, всех кто в принципе будет прав, данная система этот как стрельба по воробьям из пушки, но хотелось чего то этакого. Так же некоторые элементы в данной схеме не поднимались с нуля, они уже были и использовались в решении других задач, и их архитектуру рассматривать не будем ( сервер баз данных и HTTP сервера ), возьмем за факт, что эти сервисы зарезервированы должным образом.
На одной из моих работ была поставлена задача, перевод внешних линий с gsm шлюзов ( около 30 ) и наземных линий pri ( 100 линий ) на IP. Также в связи с невозможностью дальнейшего развития АТС Samsung ids-500 ( 2 станции ) установка IP телефонов. На АТС уже было около 600 рабочих телефонов. В текущий момент внешних линий 190.
Основные требования:
- Использование IP телефонов с обычными аналоговыми
- Максимальное резервирование выхода с АТС на IP и обратно.
- Масштабирование, стабильность, управляемость, гибкость
- Управление IP телефонами
Кратко по используемому ПО:
FreeSWITCH — маршрутизация звонков, регистрация абонентов, факсы, в общем все функции PBX
OpenSIPS — балансировка регистраций, звонков на сервера FreeSWITCH, так же при перехвате звонка определяет сервер на который принят звонок и отправляет запрос пользователя на него.
Asterisk — DAHDI карты, логики 0.1%, проброс звонков с АТС на FreeSWITCH и обратно.
Django — раздача конфигураций на сервера ( mod_xml_curl ), конфигураций телефонов, и управление всем этим хозяйством.
Рисовать схемы у меня плохо получается, по этому постараюсь описать схему так (писать, как оказалось, у меня тоже не очень получается ). Если будет интересны более подробные детали, отвечу дополнительно.
Оборудование:
2 — физических сервера, в каждом стоит две платы DAHDI с которыми работает Asterisk ( для sip`a используется порт 6060 ). Также на этих же машинах установлен FreeSWITCH. АТС стоят в разных серверных, сервера так же разнесены по этим серверным. Назовем их sip1 и sip2.
1 — виртуалка, через него идет связь с операторами, установлен FreeSWITCH, назовем его sip0
1 — виртуалка, OpenSIPS наш балансировщик.
Логика:
Каждый сервер подключен в каждую АТС по pri, что обеспечивает нам резервирование. При звонке с АТС Asterisk пытается отправить звонок на FreeSWITCH запущенный на данной машине, в случае ошибки отправляем звонок на второй сервер.
Звонки на АТС в принципе идут по подобной логике, с единственным исключением, сначала звонок идет на сервер который стоит рядом с АТС, на которую идет звонок. Т.е если звонок пришел на sip1 а к АТС2 ближе sip2, то звонок сначала отправляем на него.
Все номера АТС у которых есть привязка внешнего номера прописаны в системе, при выходе звонка с sip0 подставляется соответствующий caller id, в случае отсутствия привязки подставляется пилотный номер. Релизовано это в виде переменной прописанной для пользователей out_number и проверкой в диалплане ${user_data(${caller_id_number}@${domain} var out_number)}
Для VOIP номеров логика та же.
При внутренних звонках caller name получаем через http запрос mod_cidlookup. Соответствие номер телефона фамилия сотрудника, отдельная история об AD и 1С.
VOIP телефоны — Dlink dph-105, dph-400, grandstream gxp-1405, gxp-2120. Конфигурация на них раздается через http, все параметры настройки берем с базы и на лету формируем необходимый файл конфигурации.
В админке реализован пока минимальный функционал, конфигурация аппаратов — пользователей, cdr, перезагрузка аппаратов, управления диалпланом, небольшая статистика за сутки входящие/исходящие успешные звонки и так же по ошибкам, текущее количество зарегистрированных пользователей и количество активных звонков в разрезе серверов.
sip1 и sip2 используют одну базу для регистрации пользователей, голосовой почты, активных звонков, cdr, хранение переменных.
О маштабируемости и резервировании FreeSWITCH`а можно почитать Enterprise deployment
На данный момент зарегистрированных SIP пользователей — 300, пользователей на АТС — 600. Максимальное количество одновременных звонков на внешние направления 40.
Понимаю данный поток текста не полон и не описывает картину полностью, однако так как постоянно откладывал написание, решил лучше уж написать как могу и если данная тема интересна буду расширять и дополнять.
Автор: chusov