Интеграция АТС на базе Asterisk с внешними системами
В статье делается обзор способов и интерфейсов интеграции Asterisk с приложениями разных типов.
Введение
Время, когда АТС представляла собой самостоятельную и изолированную от других элементов IT инфраструктуры систему, прошло. Наступила эра конвергенции, объединения сетей связи и данных в единое целое. Это выражается в таких ключевых понятиях, как мобильность абонентов и индикация присутствия (presense), прозрачное для пользователей объединение всех филиалов в единую сеть (благодаря технологиям VPN) и единый номерной план. Клиенты никогда не услышат занято, и всегда смогут связаться с нужными им сотрудниками, где бы они не были. При поступлении входящего вызова сотрудник видит название компании и имя вызывающего абонента, и все предыдущую историю его обращений, с комментариями коллег и записанными разговорами. Последняя возможность достигается за счет интеграции телефонии с Системой Управления Взаимоотношений с Заказчиками (CRM, Customer Relationship Management). Другими примерами интеграции АТС с внутренним ПО компании будет проговаривание баланса клиента или статуса рассмотрения его вопроса по телефону при самостоятельном выборе специального пункта в главном интерактивном меню компании. В статье рассматриваются возможности Asterisk по интеграции с внешними системами, а также процесс разработки и внедрения таких решений.
Asterisk — открытая система с неограниченными возможностями
Когда говорят об открытости Asterisk, имеют в виду доступность (открытость) исходного кода, а также лицензионные ограничения, а вернее, лицензионную свободу. Это значит, что Asterisk можно самостоятельно скачать с сайта Digium, первоначального автора Asterisk (историю создания Asterisk можно прочесть тут), и использовать в любых целях, включая коммерческие. Если проанализировать исходный код Asterisk по модели оценки стоимости ПО CoCoMo (Constructive Cost Model), можно получить такие данные:
| explorer asterisk-1.4.20.1 # sloccount . ... Total Physical Source Lines of Code (SLOC) = 262,193 Development Effort Estimate, Person-Years (Person-Months) = 69.28 (831.31) (Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05)) Schedule Estimate, Years (Months) = 2.68 (32.17) (Basic COCOMO model, Months = 2.5 * (person-months**0.38)) Estimated Average Number of Developers (Effort/Schedule) = 25.84 Total Estimated Cost to Develop = $ 9,358,231 (average salary = $56,286/year, overhead = 2.40). SLOCCount, Copyright (C) 2001-2004 David A. Wheeler SLOCCount is Open Source Software/Free Software, licensed under the GNU GPL. |
Согласно такой оценке, разработка Asterisk заняла бы 69 человеко-лет, а рыночная стоимость разработки Asterisk с нуля составила бы более 9 млн. долларов. Благодаря новой парадигме разработки ПО — Open Source, это богатство свободно доступно каждому.
Именно доступность исходного кода делает Asterisk системой с поистине безграничными возможностями, так как не существует никаких преград для реализации любой фантазии. У пользователя коммерческого ПО есть только один способ интеграции купленного софта со своей системой — заказать нужные ему возможности в компании-производителе ПО, либо довольствоваться тем интерфейсом (API), который предусмотрел производитель. В этом смысле любое коммерческое ПО (распространяемое без исходного кода), является ограниченным, и этим главным ограничением является производитель этого ПО.
API — интерфейс разработчика Asterisk
Глубокое рассмотрение API выходит за рамки данной статьи. Следует только сказать, что Asterisk имеет модульную архитектуру, и функциональные возможности Asterisk расширяются именно за счет добавления новых модулей, функции которых становятся доступный в других модулях. Желающим разработать новый модуль для Asterisk следует в первую очередь ознакомиться именно с описанием API модулей, которое доступно на сайте Asterisk.
Телефонные примитивы
На сегодняшний день для Asterisk уже разработано большое количество модулей, полно реализующих весь традиционный и расширенный функционал больших промышленных АТС, которые мы называем телефонными примитивами. Если провести аналогию телефонной системы со зданием, то телефонные примитивы — это строительные блоки небольшого размера, выстроенные по определенному алгоритму, или, если говорить в терминах строительства, архитектуру. Комбинация телефонных примитивов и определяет целевое назначение системы. Если в основном использовать функции записи разговоров, то на Asterisk можно стоить решения сквозной и выборочной записи разговоров, встраивая его в другие системы, где таких функций нет или они ограничены. Если расширять штатные функции постановки звонков в очередь и распределения по операторам, то можно говорить о создании центра обработки вызовов на базе Asterisk. Таким образом, создание некой индивидуальной бизнес-логики как раз заключается в реорганизации телефонных примитивов и управлении ими в зависимости от происходящих событий. Более того, в Asterisk уже встроено средство для создания алгоритмов обработки звонков, и называется оно план набора.
План набора (dialplan)
План набора представляет собой описанные в обычном текстовом файле команды и функции Asterisk, доступные из его модулей. Очень часто для реализации индивидуальных запросов наших заказчиков достаточно использовать план набора.
Например, в системе AstPbx, открыто разрабатываемой нашими специалистами, сотрудники компании управляют своим номером переадресации при помощи голосового меню. Позвонив на специальный сервисный номер, они вводят в тональном режиме новый номер, на котором они будут доступны.
В одной компании с особым режимом безопасности существует специальная должность, в функции которой входит управление доступностью сотрудников компании. Когда сотрудник такой компании не доступен на рабочем месте, он обязан проинформировать об этом и сообщить новый номер, на котором он будет доступен. При внедрении AstPbx в этой компании наших специалистов попросили отключить возможность самостоятельного управлениям номером переадресации, и создать возможность управления настройками других пользователей администратором с применением авторизации. Реализация данного требования потребовала внесения небольших изменений в план набора по умолчанию, и заняла 15 минут, а также ничего не стоила Заказчику (такие задачи как раз и являются «адаптацией под индивидуальные требования». Очень часто общение с клиентом для сбора требований и их анализ занимают намного больше времени, чем их реализация!
План набора позволяет использовать мощную команду System, вызывающую внешний скрипт, написанный на любом языке программирования. Например, если оператор не принимает вызов в определенное время, система может уведомлять по ICQ супервизора, вызывая из плана набора консольный icq клиент с нужными параметрами. И таких примеров может быть бесконечное множество.
Полный перечень доступных команд и функций можно получить на сайте voip-info.org:
| функции |
AGI — Application Gateway Interface
Что делать, когда бизнес-логика слишком сложна и изменчива, чтобы использовать план набора? Ответ есть — это AGI, или Application/Asterisk Gateway Interface.
Многие помнят, каким статичным и некрасивым был WEB до изобретения CGI — Common Gateway Interface. CGI стал стандартом, описывающим вызов внешних приложений-скриптов при выполнении HTTP запроса. Такими приложениями стали базы данных и другие системы. CGI осуществлял взаимодействие с ними и преобразование полученных результатов в формат, понятный броузеру пользователя. AGI — это аналог CGI, но в сфере телефонии.
При использовании AGI весь план набора перемещается в приложение-скрипт, написанный на любом языке программирования. Если Вы еще не определились с выбором языка программирования, советуем обратить внимание на Python — скриптовый язык сверх высокого уровня. AGI скрипты на Python'e позволяют создавать телефонные приложения с невероятной скоростью, а ясный синтаксис делает сопровождение и модернизацию такого ПО приятной и легкой задачей.
Как работает AGI? При входящем звонке вызов из плана набора сразу же переводится на AGI (кстати говоря, можно комбинировать использование AGI и плана набора, перенося в AGI только участки со сложной бизнес-логикой или взаимодействия с базами данных). Далее весь контроль над алгоритмом прохождения звонка осуществляется в AGI скрипте. Для демонстрации простоты использования AGI представим себе задачу проговаривания баланса пользователя. Бизнес логика такой задачи следующая:
-
запросить пин код пользователя
-
найти счет по пин коду
-
проговорить баланс счета пользователю
-
вернуть управление в план набора.
Вот как это реализуется на уровне плана набора и AGI.
План набора:
|
[tell-balance] exten => s,1,Read(pin,vvedite-vash-pin-kod,10) exten => s,n,AGI(get_balance_by_pin.py,${pin}) exten => s,n,Playback(vash-balance-sostavleaet) exten => s,n,SayNumber(${balance}) exten => s,n,Return exten => notfound,1,Playback(neverni-pin-kod-poprobuite-eshe-raz) exten => notfound,n,Goto(s,1) |
AGI скрипт get_balance.py, написанный на языке Python:
|
import agilib, MySQLdb,sys db = MySQLdb.connect(host=HOST,db=DB, user=USER, passwd=PASSWORD c = db.cursor() c.execute("SELECT balance FROM account WHERE pin='%s' LIMIT 1" % sys.argv[1]) balance=c.fetchone()[0] if not balance: agi.goto_on_exit(extension='notfound',priority='1') sys.exit() agi = agilib.AGI() agi.set_variable(balance=balance) sys.exit() |
Примечание: приведенный код призван продемонстрировать простоту интеграции Asterisk с базой данных и не претендует на завершенность. В реальных условиях следует обязательно добавлять обработку ошибок, например, невозможность подключиться к базе данных, и проговаривать пользователю соответствующее сообщение, например, «Технические проблемы, просим связаться со службой поддержки».
Исчерпывающую информацию по AGI можно получить тут.
AGI полностью справляется с задачей сложной обработки звонка. Но иногда бывает необходимо получить контроль над текущими звонками или другими событиями, например, разъединить абонентов при достижении нулевого остатка по счету, или уведомить супервизора при подключении или отключении оператора. В таких случая используется AMI — Asterisk Manager Interface.
AMI — Asterisk Manager Interface
Как следует из названия, AMI — это интерфейс управления Asterisk. Работает он следующим образом. Внешнее приложение подключается по TCP/IP к порту службы AMI (пройдя сперва аутентификацию и авторизацию). После этого в приложении доступна информация о происходящих в системе событиях (полный список событий можно получить тут). Помимо доступа к событиям, существует возможность реагирования на них путем вызова команд AMI (полный список команд можно получить тут). Таким образом, внешнее приложение может получить полный контроль над выполняемыми Asterisk действиями и происходящими событиями.
Два простых, но очень мощных интерфейса - AGI и AMI, позволяют реализовывать поистине безграничный функционал, и встраивать Asterisk в любые приложения и системы.
Процесс разработки
Поставляя базовое решение на базе Asterisk, мы гарантируем возможность его расширения в будущем при возникновении новых требований. При этом совсем не обязательно заказывать разработку нового решения у нас (хотя мы и предоставляем такие услуги) — вокруг Asterisk существует большая экосистема пользователей и разработчиков, готовых всегда помочь в области Asterisk.
При обращении к нам все первичные требования Заказчика к системе телефонии делятся на три категории:
-
входящие в уже существующий функционал AstPbx;
-
те, которые возможно реализовать на уровне плана набора;
-
требующие использования AGI, AMI или написания модулей.
Если первые две категории легко подвергаются оценке по сроками и стоимости ( и практически входят в базовую поставку), то более глубокая разработка с использованием AGI и AMI требует более серьезного и формального подхода, который вкратце состоит из следующих этапов: анализ, ТЗ, реализация, внедрение. Наш подход подробно описан в разделе «Разработка».
Наши специалисты могут не только самостоятельно разработать требуемое ПО, но также провести курс обучения разработки под Asterisk, наглядно показав специалистам Заказчика как создавать настоящие AGI и AMI приложения. После этого мы приступаем к реализации проекта совместными усилиями, осуществляя функции управления разработкой и консалтинга.
