Asterisk™: будущее телефонии Второе издание - Меггелен Джим Ван
Шрифт:
Интервал:
Закладка:
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 [email protected]: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 здесь - это регулярное выражение, соответствующее телефонному номеру в США.