Чтение онлайн

ЖАНРЫ

Asterisk™: будущее телефонии Второе издание
Шрифт:

Ниже приведено приложение 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 на самом деле заглядывает в столбцы базы данных и делает доступными многие новые создаваемые динамически методы.

Поделиться с друзьями: