Команда SEND TEXT принимает один аргумент: текст, который должен быть отправлен в канал. Если текст содержит пробелы (как в предыдущем фрагменте кода), аргумент должен быть заключен в кавычки, чтобы Asterisk понимала, что вся строка является одним аргументом команды. Опять же, обратите внимание, что кавычки экранированы, поскольку они должны быть переданы в Asterisk, а не использоваться для ограничения строки в Perl.
print STDERR "3. Testing 'sendimage'..."; print "SEND IMAGE asterisk-image\n"; my $result = ; &checkresult($result);
Этот тест вызывает команду SEND IMAGE, которая является аналогом приложения SendImage(). Ее единственный аргумент - имя файла изображения, который будет отправляться вызывающему абоненту. Как и команда SEND TEXT, данная команда работает, только если вызывающий канал поддерживает прием изображений. print STDERR "4. Testing 'saynumber'..."; print "SAY NUMBER 192837465 \"\"\n"; my $result = ; &checkresult($result);
Этот тест посылает Asterisk команду SAY NUMBER. Она ведет себя аналогично приложению диалплана SayNumber() и принимает два аргумента:
• Число, которое должно быть воспроизведено.
• Коды, которые могут прервать выполнение команды.
Опять же, поскольку второй аргумент опущен, необходимо передать пустую пару кавычек.
print STDERR "5. Testing 'waitdtmf'..."; print "WAIT FOR DIGIT 1000\n"; my $result = ; &checkresult($result);
Этот тест демонстрирует применение команды WAIT FOR DIGIT. Эта команда обеспечивает ожидание ввода DTMF-кода вызывающим абонентом заданное количество миллисекунд. Если требуется реализовать бесконечное ожидание ввода цифры, в качестве времени ожидания задается -1. Это приложение возвращает десятичное значение ASCII нажатой цифры.
print STDERR "6. Testing 'record'..."; print "RECORD FILE testagi gsm 1234 3000\n"; my $result = ; &checkresult($result);
Этот фрагмент кода демонстрирует команду RECORD FILE. Она используется для записи разговора, аналогично приложению диалплана Record(). RECORD FILE принимает семь аргументов, из которых три последних являются необязательными:
• Имя записываемого файла.
• Формат, в котором выполняется запись.
• Коды, которые могут прервать запись.
• Время ожидания (максимальное время записи) в миллисекундах или -1, если время ожидания бесконечно.
• Число музыкальных фрагментов, которые необходимо пропустить перед началом записи (необязательный).
• Слово BEEP, если требуется, чтобы Asterisk подавала звуковой сигнал перед началом записи (необязательный).
• Количество секунд, которое должно пройти, прежде чем Asterisk решит, что пользователь закончил запись, и продолжит выполнение даже несмотря на то, что время ожидания еще не истекло и DTMF-коды не были введены (необязательный). Этот аргумент должен следовать за s=.
В данном конкретном случае записывается файл testagi (в формате GSM), любой DTMF-код от 1 до 4 может прервать запись и максимальное время записи - 3000 мс.
print STDERR "6a. Testing 'record' playback..."; print "STREAM FILE testagi \"\"\n"; my $result = ; &checkresult($result);
Вторая часть этого теста воспроизводит записанный ранее аудиофайл, используя команду STREAM FILE. Команда STREAM FILE уже рассматривалась, поэтому данный фрагмент кода не требует дополнительных пояснений.
print STDERR "================== Complete ======================\n";
print STDERR "$tests tests completed, $pass passed, $fail failed\n"; print STDERR "==================================================\n";
В конце сценария AGI результаты тестирования записываются в STDERR, который должен быть выведен в консоли Asterisk.
Итак, при написании AGI-программ на Perl необходимо помнить следующее:
• Должен быть активирован строгий контроль выполнения правил языка программирования с помощью команды use strict [102].
• Должна быть отключена буферизация вывода через задание $|=1.
• Данные, поступающие от Asterisk, принимаются с помощью цикла
while().
• Значения записываются командой print.
• Для записи отладочной информации в консоль Asterisk используется команда print STDERR.
Библиотека AGI для Perl
Тем, кто собирается создавать собственные сценарии AGI на языке Perl, вероятно, будет интересен модуль на Perl - Asterisk::AGI, написанный Джеймсом Головичем (James Golovich), который можно найти по адресу http://asterisk.gnuinter.net. Модуль Asterisk::AGI еще больше упрощает написание сценариев AGI на Perl.
Создание сценариев AGI на PHP
Мы обещали обсудить несколько языков программирования, поэтому пойдем дальше и рассмотрим, как выглядит сценарий AGI на PHP. Основные правила программирования AGI те же, изменился только язык программирования. В данном примере мы напишем сценарий AGI для загрузки из Интернета сводки погоды и предоставления вызывающему абоненту информации о температуре, направлении и скорости ветра.
Читать дальше