355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Джим Меггелен » Asterisk™: будущее телефонии Второе издание » Текст книги (страница 21)
Asterisk™: будущее телефонии Второе издание
  • Текст добавлен: 7 октября 2016, 17:17

Текст книги "Asterisk™: будущее телефонии Второе издание"


Автор книги: Джим Меггелен


Соавторы: Джаред Смит,Лейф Мадсен

Жанр:

   

ОС и Сети


сообщить о нарушении

Текущая страница: 21 (всего у книги 41 страниц)

Action: UpdateConfig Filename: users.conf Reload: yes

SrcFilename: users.conf DstFilename: users.conf Action-00000: delcat Cat-00000: 6003 ActionID: 5298795987243

Конечно, мы лишь слегка коснулись возможностей Asterisk Manager Interface и рассмотрели лишь несколько из множества предоставляемых им разнообразных действий. Более подробный список доступных команд приведен в приложении F.

Flash Operator Panel

Flash Operator Panel (FOP) – один из наиболее популярных примеров, демонстрирующих мощь интерфейса Manager. FOP обеспечивает визу-

Рис. 10.1. Интерфейс управления Flash Operator Panel

альное веб-представление вашей системы и возможность управления вызовами.

FOP чаще всего используется для того, чтобы дать возможность оператору-человеку видеть пользователей системы и устанавливать соединения между ними. Также он может применяться в инфраструктуре центра обработки звонков для обеспечения инициируемых CRM всплывающих экранов[105]105
  Customer Relationship Management (CRM) – это интерфейс, используемый компаниями для помощи в управлении информацией и взаимодействиями клиентов.


[Закрыть]
.

Интерфейс управления FOP представлен на рис. 10.1. Копию FOP можно найти по адресуhttp://www.asternic.org.

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

FOP имеет фантастическое сообщество разработчиков и пользующуюся большой популярностью рассылку. Успеху FOP также способствовало его включение в Trixbox.

Разработка в Asterisk с использованием Adhearsion

Не так давно появилась новая технология, которая может изменить порядок составления диалпланов[106]106
  Мы хотим поблагодарить Джея Филлипса (Jay Phillips) за предоставление идей и кода для данного раздела книги.


[Закрыть]
.

Новый подход к диалпланам

Asterisk повзрослела с точки зрения как технологии, так и ее популярности, но при все большем погружении в этот чудесный мир невозможно не столкнуться с ограничениями. Созданию сложных сценариев уровня предприятия с использованием только Asterisk будет сопутствовать множество трудностей применения логики диалплана. Несмотря на всю гибкость и мощь диалплана, как язык программирования он довольно слаб и существенно менее гибок, чем большинство современных языков сценариев. При реализации расширенной логики диалплан, GUI и даже более развитый AEL (Asterisk Extension Language) могут разочаровать. Создавая все более сложные диалпланы, можно столкнуться с трудностями в следующих вопросах:

• Условные циклы и переходы по условию.

• Переменные.

• Сложные структуры данных.

• Интеграция с базой данных/LDAP.

• Использование библиотек сторонних производителей.

• Обмен и распространение функциональности VoIP.

• Расширение конфигурационных языков.

• Плохая обработка ошибок.

• Плохая обработка даты и времени.

• Сопоставление с шаблонами.

• Единообразие использования.

• Организация исходного кода.

Многие решают эти проблемы, реализуя расширенную логику во внешних программах на таких языках программирования, как Perl и PHP, и соединяясь с Asterisk через AMI и AGI. К сожалению, обеспечивая желаемую мощь, эти решения не всегда упрощают жизнь разработчика. Наоборот, они зачастую еще более усложняют процесс разработки. Используя существующие технологии в Asterisk, но имея целью обеспечение мощи и простоты, Adhearsion предлагает новый подход.

Разработка в Asterisk с использованием Adhearsion

Adhearsion – это инфраструктура с открытым исходным кодом (распространяемая по лицензии LGPL), которая разработана с целью улучшения реализации решений Asterisk. Она располагается поверх системы Asterisk, обрабатывая части или весь диалплан, и обеспечивает несколько уникальных способов управления доступом к Asterisk посредством ряда улучшенных интерфейсов. Adhearsion выполняется в отдельном процессе-демоне и интегрируется через уже представленные выше интерфейсы Gateway (AGI) и Manager (AMI), поэтому конфигурирование контекста на ее использование заключается просто в добавлении нескольких строк в диалплан или пользователя в файл manager.conf.

Adhearsion преимущественно использует высокодинамичный объектно-ориентированный язык программирования Ruby, но может поддерживать другие языки, такие как С или Java. В мире VoIP многие вещи существуют как концептуальные объекты, то есть применение объектно-ориентированного программирования вполне логично. У тех, кто хорошо знаком с Python, Perl или другими языками сценариев, не должно возникнуть проблем с Ruby. Для тех, кто не работал до этого с языками сценариев, Ruby – замечательное начало.

Установка Adhearsion

Программное обеспечение Ruby, как правило, устанавливается с помощью диспетчера пакетов (аналогичного диспетчерам пакетов Linux, но созданного специально для платформы Ruby). Adhearsion входит в стандарт RubyGems, поэтому, если установлены Ruby и RubyGems, вы находитесь на расстоянии одной команды от установки Adhearsion.

Установка Ruby/RubyGems в AsteriskNOW

AsteriskNOW стандартно поставляется с Ruby, но без RubyGems (по причинам поддержки). К счастью, RubyGems можно без труда установить из коллекции Ruby rPath, используя следующую команду:

conary update rubygems=ruby.rpath.org@rpl:devel source /etc/profile

Установка Ruby/RubyGems в Linux

Диспетчеры пакетов многих дистрибутивов Linux содержат пакет Ruby, хотя в некоторых до сих пор нет RubyGems. В предпочтительном приложении управления разработкой и сопровождением ПО своего дистрибутива установите Ruby 1.8.5 или более позднюю версию и RubyGems, если он доступен. Если RubyGems недоступен в CentOS, Ruby можно установить, введя следующее: yum install ruby

Далее необходим RubyGems. Чтобы получить его, перейдите в /usr/ src/ и введите следующее:

wget http://rubyforge.Org/frs/download.php/20585/rubygems-0.9.3.tgz tar zxvf rubygems-0.9.3.tgz cd rubygems-0.9.3 ruby setup.rb

Установка Ruby/RubyGems в Mac OS X

Фактически Ruby поставляется с OS X, но понадобится обновить его и установить RubyGems с MacPorts, диспетчера пакетов OS X. Если

MacPorts установлен (доступен наhttp://www.macports.org, если у вас его еще нет), Ruby и RubyGems можно установить, используя следующую команду:

sudo port install ruby rb-rubygems

Также может понадобиться добавить /opt/local/bin в переменную PATH в/etc/profile.

Ruby/RubyGems в Windows

Для Windows существует замечательная программа установки «одним щелчком». Этот инсталлятор за несколько минут автоматически установит Ruby, RubyGems и несколько других обычно используемых пакетов. Инсталлятор можно скачать по адресуhttp://rubyforge.org/ projects/rubyinstaller.

Установка Adhearsion из RubyGems

Выполнив для своей системы все представленные выше инструкции и получив Ruby и RubyGems, установите Adhearsion, используя следующую команду:

gem install adhearsion

Если обнаружены какие-либо зависимости, вероятно, необходимо разрешить их установку, чтобы обеспечить нормальную работу Adhearsion.

Создание нового проекта Adhearsion

После того как Adhearsion установлена, можно приступать к созданию и запуску нового проекта Adhearsion с использованием новой команды ahn, утилиты командной строки, которая выполняет в Adhearsion практически все.

Вот пример команды для создания нового проекта Adhearsion:

ahn create ~/новыйпроект При этом в заданной папке создается подпапка, содержащая папку и иерархию файлов, необходимые для работы Adhearsion. У вас сразу же должно получиться запустить новое приложение по команде

ahn start ~/новыйпроект Чтобы ознакомиться с системой Adhearsion, просмотрите папки приложения и прочитайте сопутствующую документацию.

Написание диалплана в Adhearsion

Как правило, новички начинают с использования возможности написания диалпланов в Adhearsion. Поскольку Ruby допускает тонкую настройку самого языка во время выполнения, одна из функций, выполняемых Adhearsion, – реализация эстетических изменений, которые призваны упростить процесс разработки диалпланов.

Ниже приведено приложение Hello World (Здравствуй, мир), написанное в Adhearsion:

мой_первый_контекст { play "hello-world"

}

Это абсолютно допустимый синтаксис Ruby, но не все приложения Ruby так выглядят. В Adhearsion очень удобно объявлять имена контекстов, поскольку сценарий диалплана здесь обрабатывается особым образом. Ваши сценарии будут располагаться в корневой папке вновь созданного приложения Adhearsion.

Когда вызовы поступают в Asterisk и потом в Adhearsion, Adhearsion вызывает собственную версию имени контекста, из которого происходит AGI-запрос. Таким образом, имя контекста в файле extensions.conf должно гарантированно быть таким же, чтобы обеспечить соответствующее перенаправление вызовов в Adhearsion.

Синтаксис направления вызовов в Adhearsion следующий:

[мой_первый_контекст]

exten => _.,1,AGI(agi://127.0.0.1)

Любой набранный шаблон фиксируется здесь и отправляется в Adhearsion через AGI для реализации инструкций по обработке вызова. Предоставленный здесь IP, конечно, должен быть заменен на IP, который обеспечит доступ к вашему серверу Adhearsion.

Теперь, имея базовое понимание того, как взаимодействуют Adhearsion и Asterisk, можно перейти к более реалистичному примеру диалплана в Adhearsion:

internal {

case extension when 10..99

dial SIP/extension when 6000..6020, 7000..7030

# Присоединяемся к конференции MeetMe с помощью join join extension

when _'21XX'

if Time.now.hour.between? 2, 10

dial SIP/"berlin-office"/extension[2..4] else speak "The German office is closed" end

when US_NUMBER

dial SIP/'us-trunk-out'/extension when /~d{11,}$/ # Perl-подобное регулярное выражение

# Передаем все остальные длинные номера прямо в наш

# магистральный канал связи.

dial IAX/'intl-trunk-out'/extension else

play %w'sorry invalid extension please-try-again' end

Такой небольшой фрагмент кода реализует довольно многое. Даже имея ограниченные познания в Ruby или не зная его вовсе, вы поймете следующее:

• Переменная extension (которую Adhearsion создает для нас) используется в условном выражении.

• Набор номера от 10 до 99 направляет нас к равноправному участнику SIP с соответствующим числовым именем пользователя.

• Любой номер в диапазоне от 6000 до 6200 или от 7000 до 7030 направляется в конференцию MeetMe под тем же номером. Конечно, для этого требуется, чтобы номера данных конференций были сконфигурированы в meetme.conf.

• Опция 21XX' точно отвечает стилю шаблонов Asteris. Начало строки с символа подчеркивания в Adhearsion обеспечивает неявный вызов метода, который возвращает регулярное выражение Ruby. В Ruby-выражении case регулярные выражения могут использоваться в выражении when для выполнения сопоставления с шаблоном. Конечный результат должен быть очень хорошо знаком тем, кто имеет опыт написания extensions.conf.

• Синтаксис Adhearsion для представления каналов также происходит непосредственно из традиционного формата Asterisk. SIP/123 может использоваться как есть для представления равноправного участника SIP 123. Если бы использовался магистральный канал, синтаксис был бы такой: SIP/имяканала/имяпользователя.

• Метод speak() обобщает лежащий в основе механизм преобразования текста в речь. Он может быть сконфигурирован на использование наиболее популярных механизмов.

• В выражении when для осуществления более сложного сопоставления с шаблонами, если шаблонов Asterisk недостаточно, может использоваться полноценное Perl-подобное регулярное выражение.

• Adhearsion определяет несколько констант, которые могут быть полезны при написании диалпланов. Константа US_NUMBER здесь – это регулярное выражение, соответствующее телефонному номеру в США.

• Если необходимо воспроизводить несколько файлов последовательно, play() принимает массив имен файлов. К счастью, в Ruby есть удобный способ создания массива строковых значений (String).

Конечно, это только простой пример, демонстрирующий лишь самые основы возможностей Adhearsion для создания диалплана.

Интеграция с базами данных

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

PHP или Perl, потому что extensions.conf или синтаксиса AEL просто недостаточно для решения задач такого уровня сложности. Adhearsion использует библиотеку интеграции с базами данных ActiveRecord, разработанную создателями инфраструктуры Ruby on Rails. Имея ActiveRecord, конечный пользователь изредка, если вообще делает это, пишет SQL-выражения. А разработчик осуществляет доступ к базе данных, как к любому другому объекту Ruby. Благодаря обеспечиваемым Ruby гибкости и динамичности, доступ к базе данных выглядит и ощущается довольно естественным. Кроме того, ActiveRe– cord устраняет различия между системами управления базами данных, делая реализацию доступа к базе данных универсальной. Не вдаваясь в детали ActiveRecord и более сложные варианты ее использования, рассмотрим следующую простую схему MySQL: CREATE TABLE groups (

'id' int(11) DEFAULT NULL auto_increment PRIMARY KEY, 'description' varchar(255) DEFAULT NULL, 'hourly_rate' decimal DEFAULT NULL

);

CREATE TABLE customers (

'id' int(11) DEFAULT NULL auto_increment PRIMARY KEY, 'name' varchar(255) DEFAULT NULL, 'phone_number' varchar(10) DEFAULT NULL, 'usage_this_month' int(11) DEFAULT 0, 'group_id' int(11) DEFAULT NULL

);

В реальности, конечно, о заказчике хранилось бы намного больше сведений и информация об использовании сервиса находилась бы в записи параметров вызова в базе данных, но такое упрощение позволяет более эффективно продемонстрировать основные моменты ActiveRecord. Чтобы подключить Adhearsion к этой базе данных, необходимо просто задать информацию для доступа к базе данных в конфигурационном файле YAML: adapter: mysql host: localhost database: adhearsion username: root password: pass

Так Adhearsion будет знать, как подключиться к базе данных, однако механизм доступа к информации в таблицах зависит от того, как смоделированы наши объекты ActiveRecord. Поскольку объект – это экземпляр класса, для каждой таблицы ставим в соответствие класс. С помощью методов надкласса определяем простые свойства и отношения в классе.

Вот два класса, которые могут использоваться с вышеупомянутыми таблицами:

class Customer < ActiveRecord::Base belongs_to :group

validates_presence_of :name, :phone_number validates_uniqueness_of :phone_number validates_associated :group def total_bill

self.group.hourly_rate * self.usage_this_month / 1.hour end

end

class Group < ActiveRecord::Base has_many :customers

validates_presence_of description, :hourly_rate

end

Уже из этого небольшого объема информации ActiveRecord может сделать множество логических выводов. При обработке данных классов ActiveRecord переводит их имена в нижний регистр, ставит во множественное число и принимает, что это – имена таблиц (customers и groups соответственно). Если применение такого соглашения нежелательно, автор может без труда переопределить его. Кроме того, во время интерпретации ActiveRecord на самом деле заглядывает в столбцы базы данных и делает доступными многие новые создаваемые динамически методы.

Методы belongs_to (принадлежит) и has_many (имеет много) в данном примере определяют отношения между Customers (клиенты) и Groups (группы). Опять обратите внимание, как ActiveRecord использует множественное число в строке has_many :customers для большей выразительности кода. В этом примере также можно увидеть несколько проверок достоверности – политик, которые будет применять ActiveRecord. При создании нового объекта Customer мы должны обеспечить для него как минимум name (имя) и phone_number (номер телефона). Задание двух телефонных номеров может привести к конфликту. У каждого Customer должна быть Group. У каждой группы должно быть description (описание) и hourly_rate (почасовая ставка). Это поможет разработчику избежать ошибок, а также нарушения целостности базы данных.

Также обратите внимание на метод total_bill (общий счет) класса Customer. Для любого объекта Customer, извлекаемого из базы данных, можно вызвать этот метод, который умножает значение hourly_rate для группы, к которой принадлежит Customer, на время пользования телефоном этого клиента (в секундах).

Вот несколько примеров, которые могут точнее продемонстрировать то, насколько удобно применять абстрактную объектную логику Ruby для работы с базами данных:

everyone = Customer.find :all

jay = Customer.find_by_name "Jay Phillips"

jay.phone_number # Выполняем выражение SELECT

jay.total_bill # Выполняем вычисления по нескольким выражениям SELECT

jay.group.customers.average :usage_this_month jay.group.destroy

jay.group = Group.create description => "New cool group!",

:hourly_rate => 1.23

jay.save

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

# Предположим, сервис VoIP предлагается клиентам,

# которые могут быть идентифицированы по их callerid.

service {

# Строка кода ниже реализует выражение SQL SELECT

# по отношению к нашей базе данных. Метод

# find_by_phone_number() был создан автоматически,

# потому что ActiveRecord обнаружила в базе данных

# столбец phone_number. Adhearsion создает для нас

# переменную callerid.

caller = Customer.find_by_phone_number callerid

usage = caller.usage_this_month if usage >= 100.hours

play "sorry-cant-let-you-do-that" else

play %w'to-hear-your-account-balance press-1

otherwise wait-moment' choice = wait_for_digit 3.seconds

p choice if choice == 1

charge = usage / 60.0 * caller.group.hourly_rate play %W"your-account will-reflect-charge-of

$#{charge} this month for #{usage / 60} minutes and #{usage % 60} seconds"

end

# Мы также можем записать значение свойства

# usage_this_month объекта caller. По завершении

# выполнения метода time новое значение для этого

# абонента будет внесено в базу данных. caller.usage_this_month += time do

# Засекаем время выполнения данного фрагмента кода. dial IAX/'main-trunk'/extension

end

caller.save

end

Надежная интеграция с базой данных, которую обеспечивает Adhear– sion, упрощает управление и разработку для офисной АТС. Хранящаяся централизованно информация позволяет Asterisk напрямую интегрироваться с другими сервисами, обеспечивая при этом более ценные сервисы, которые не могут быть реализованы в рамках традиционных технологий разработки в Asterisk.

Распространение и повторное использование кода

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

Кроме того, на локальном уровне расширения инфраструктуры Adhear– sion, называемые помощниками, могут использоваться повторно или создаваться самостоятельно. Помощниками могут быть как целые вспомогательные инфраструктуры, такие как Micromenus для интеграции с телефонными микроброузерами, так и обычный новый метод диал– плана, который возвращает выбираемые случайным образом цитаты Оскара Уайльда.

Ниже представлен простой помощник Adhearsion, написанный на Ruby. Он создает новый метод, который будет существовать во всей инфраструктуре, включая диалплан. В целях сохранения простоты метод загружает XML-документ по заданному URL HTTP и преобразует его в Ruby-объект Hash (тип ассоциативного массива Ruby): def remote_parse url

Hash.from_xml open(url).read

end

Заметьте, что вспомогательный файл может включать только эти три строки. При загрузке Adhearsion выполняет сценарий таким образом, что все описанные методы или классы становятся доступными во всей системе.

Для некоторых задач, в частности задач масштабирования Adhearsion, может потребоваться обеспечить в узких местах эффективность короля производительности: языка программирования С. Ниже представлен пример помощника Adhearsion, который возвращает факториал заданного числа:

int fast_factorial(int input) { int fact = 1, count = 1; while(count <= input) { fact *= count++;

}

return fact;

Опять же, приведенный здесь код может составлять все содержимое вспомогательного файла. В данном случае, поскольку код написан на С, файл должен называться factorial.alien.c. Это указывает Adhearsion запустить алгоритм для чтения файла, добавить стандартные заголовки разработки языков С и Ruby, скомпилировать файл, кэшировать общий объект, загрузить его в интерпретатор и затем создать для С-ме– тода оболочку на Ruby. Ниже представлен диалплан, который просто воспроизводит факториал шести, используя этот помощник на С:

fast_test {

num = fast_factorial 6 play num

}

Заметьте, что С-метод становится первоклассным методом на Ruby. Числовые объекты Ruby, преданные в метод, преобразуются в элементарный тип С int, а затем возвращаемое значение преобразуется обратно в числовой объект Ruby.

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

Интеграция с настольным телефоном с использованием Micromenus

В условиях все возрастающей конкуренции между производителями современных настольных телефонов, поддерживающих IP, появление микроброузера прошло относительно незамеченным и используется он крайне редко. Принцип прост: физические настольные телефоны создают интерактивные меню, принимая XML по HTTP или что-то подобное. Однако конфликт интересов сыграл с этой технологией злую шутку: каждый производитель создает собственный XML, микроброузеры часто имеют какие-то странности и доступные возможности сильно разнятся. Инфраструктура Micromenus (Микроменю) существует как помощник Adhearsion и предназначена устранять различия между телефонами разных производителей. В этой очень специальной области разработки (то есть создании меню) для четкой реализации логики независимо от марок телефонов Micromenus использует очень простой основанный на Ruby «доменный язык». Вот простой пример Micromenu: image 'company-logo' item "Call an Employee" do

# Создаем список сотрудников из активных ссылок в базе данных. Employee.find(:all).each do |someone|

# Просто выбираем кого-то, чтобы позвонить ему по телефону. call someone.extension, someone.full_name

end

end

item "Weather Information" do

call "Hear the weather report" do play weather_report("Portland, OR")

end

item "Current: " + weather("Portland, OR")[:current][:temp]

end

item "System Uptime: " + 'uptime' Список item (элемент) отображается двумя способами. Если дается только строка текста (String), Micromenus формирует лишь текстовый элемент. Если аргументы содержат блок do/end вложенной информации, этот текст становится ссылкой на подстраницу, которая формирует визуальное представление этого вложенного содержимого. Элемент call (вызов) также имеет два варианта использования, каждый из них формирует ссылку, которая при выборе инициирует вызов. Когда call получает блок do/end, он моделирует физический набор номера, заданного в качестве первого аргумента. Если блок do/end существует и все вызовы направляются через Adhearsion, выбор этого элемента обеспечивает выполнение функциональности диалплана в рамках блока. Это замечательный пример того, как выгодно выполнять обработку диалпланов и экранных микроброузеров в одной инфраструктуре. Из этого примера можно сделать еще некоторые четкие выводы о Micro– menus:

• Micromenus поддерживает отправку изображений. Если запрашивающий телефон не поддерживает изображения, в ответе они не будут упоминаться.

• Все помощники Adhearsion работают и здесь. В данном примере использовался помощник сводки погоды.

• Вспомогательная инфраструктура Micromenus может использовать интеграцию Adhearsion с базой данных.

• Ruby может выполнять команду, заключенную в открывающие кавычки, и возвращать результат как строку (String). В нашем случае возвращается время безотказной работы (uptime).

Конечно, этот пример предполагает, что вы сконфигурировали интеграцию своего приложения с базой данных соответствующим образом и имеете класс Employee, соответствующий таблице со столбцами extension (расширение) и full_name (полное имя).

Поскольку Micromenus просто формирует визуальное представление различных ответов, поступающих по HTTP, обычный веб-броузер тоже может прислать запрос на сервер Micromenus. Для таких более высокотехнологичных конечных точек Micromenus формирует красивый интерфейс с загрузкой Ajax, эффектами DHTML и окнами, которые можно перетаскивать.

Micromenus – это еще одна возможность сделать ваши Adhearsion-при– ложения для VoIP более надежными.

Интеграция с веб-приложением

Хотя Adhearsion конструктивно может интегрироваться с практически любым приложением, включая PHP или сервлеты Java, Ruby на платформе Rails является особенно мощным партнером. Rails – среда разработки веб-приложений, широко обсуждаемая в прессе в последнее время, причем абсолютно заслуженно. Ее разработчики используют весь потенциал Ruby, демонстрируя, как метапрограммирование действительно избавляет разработчика от ненужной работы. Поразительная ясность кода Rails и использование принципа Don't Repeat Yourself (Не повторяйся), или DRY, вдохновили дизайнеров на создание Adhearsion в том виде, в каком она существует сейчас. Начиная с версии 0.8.0, каталог приложений Adhearsion располагается поверх существующего Rails-приложения, совместное использование данных происходит автоматически. Если требуется разработать сложный веб-интерфейс для функциональности VoIP, обратите внимание на этот сногсшибательный дуэт.

Использование Java

Весь мир пришел в изумление, когда Sun объявила о приеме на работу двух основных специалистов проекта по разработке интерпретатора JRuby Чарльза Наттера (Charles Nutter) и Томаса Энебо (Thomas Enebo) в сентябре 2006 года. JRuby – это интерпретатор Ruby, написанный не на С, а на Java. Поскольку JRuby может компилировать части приложения на Ruby в байт-код Java, JRuby фактически превосходит С-реализа– цию Ruby 1.8 по многим параметрам и обещает полностью обойти последнюю в ближайшем будущем.

Приложение на Ruby, выполняемое в JRuby, имеет преимущество использования не только библиотек Ruby, но и любых библиотек Java. Выполнение Adhearsion в JRuby обеспечивает потрясающий ассортимент библиотек Java сторонних производителей для написания диал– плана офисной АТС. Если окружение вашей компании требует тесной интеграции с другими технологиями Java, внедрение Adhearsion в стек J2EE может предложить необходимую гибкость.

Дополнительная информация

Больше информации о быстро развивающемся сообществе разработчиков Adhearsion, включая полные разборы примеров по шагам, можно найти на официальном веб-сайте Adhearsion по адресуhttp://adhearsion.com, в официальном блоге, посвященном Adhearsion, по адресуhttp://blog. adhearsion.com, на веб-сайте консалтинговой компании-учредителя Adhearsion по адресуhttp://codemecca.com. За помощью в изучении Ruby обращайтесь на сайтhttp://jicksta.com.

11

Инфраструктура Asterisk GUI

..Я конструировал маяк, в то время как все остальные строили корабли.

– Чарльз Саймик

В данной главе представлены компоненты, которые составляют графический пользовательский интерфейс (GUI) и помогают работать с Asterisk. Для тех, кто не использует дистрибутив AsteriskNOW, здесь приводится установка веб-сервера и компонентов GUI. Показано, как настраивать GUI в соответствии со своими задачами. Также предоставлена техническая информация, чтобы разработчики, желающие создать собственный GUI или приложение, могли использовать веб-сервер и компоненты GUI. Мы выражаем благодарность сотрудникам Digium, помогавшим писать эту главу, и особое спасибо за примеры кода, которые они разработали и протестировали.

Зачем нужен GUI для Asterisk

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

Еще с самых ранних времен, до версии 1.0, люди пытаются приручить могучую систему Asterisk с помощью генераторов конфигурационных файлов, связанных с базами данных и управляемых посредством различных графических пользовательских интерфейсов (Graphical User Interfaces, GUI). Самым успешным удалось создать приложение, основанное на Asterisk, но ни один из них не обеспечил полной гибкости, которую предлагает самостоятельная среда для написания сценариев. После замены цифрового хокку диалплана на ограниченный список опций полученная система превратилась из собственно Asterisk в систему, основанную на Asterisk. Неплохо, но не достаточно[107]107
  Кстати, два автора данной книги однажды попытались написать идеальный GUI Asterisk. К счастью для вас, они отказались от этого проекта и занялись документацией Asterisk!


[Закрыть]
. Чтобы GUI был именно GUI Asterisk, в нем должны быть сохранены создаваемые вручную конфигурационные файлы, которые являются лингва-франка Asterisk испокон веков. Он должен предоставлять простые графические средства конфигурации без оказания воздействия на базовое программное обеспечение Asterisk или жесткой фиксации решений, которые должны оставаться открытыми для конечного пользователя. Также он должен обеспечивать расширенную функциональность, не загружая компьютер и не захватывая ценные ресурсы, необходимые для выполнения основной задачи – обработки вызовов.

Одновременно с выходом версии Asterisk 1.4 Digium начала разработку проекта Asterisk GUI. Изначально GUI задумывался как компонент встроенного устройства Asterisk от Digium. Устройство, продаваемое и как Asterisk Appliance Developers Kit (AADK – комплект для разработчиков устройств Asterisk), и как самостоятельная конфигурация, представляет собой небольшой полупроводниковый компьютер с необязательными аналоговыми (и в перспективе цифровыми) интерфейсами. GUI был создан с использованием гибкой и расширяемой инфраструктуры, которая переносит максимум задач по отображению и логику проверки достоверности на компьютер клиента. Также была учтена необходимость сохранения возможности создания конфигурационных файлов вручную, но при этом предоставлены автоматизированные средства их редактирования. Созданная в результате инфраструктура получила название AJAM (обыгрывается название популярной технологии Web 2.0 Ajax), что является аббревиатурой от Asynchronous JavaScript and Asterisk Manager (Асинхронный диспетчер JavaScript и Asterisk). Основной AJAM-код, наборы поддерживающих AJAM веб-страниц и расширение диспетчера Asterisk – все вместе, взаимодействуя, формируют инфраструктуру Asterisk GUI.


    Ваша оценка произведения:

Популярные книги за неделю