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

ЖАНРЫ

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

Этот тест посылает Asterisk команду SAY NUMBER. Она ведет себя аналогично приложению диалплана SayNumber и принимает два аргумента:

• Число, которое должно быть воспроизведено.

• Коды, которые могут прервать выполнение команды.

Опять же, поскольку второй аргумент опущен, необходимо передать пустую пару кавычек.

print STDERR "5. Testing 'waitdtmf'..."; print "WAIT FOR DIGIT 1000\n"; my $result = <STDIN>; &checkresult($result);

Этот тест демонстрирует применение команды WAIT FOR DIGIT. Эта команда обеспечивает ожидание ввода DTMF-кода вызывающим абонентом заданное количество миллисекунд. Если требуется реализовать

бесконечное ожидание ввода цифры, в качестве времени ожидания задается -1. Это приложение возвращает десятичное значение ASCII нажатой цифры.

print STDERR "6. Testing 'record'..."; print "RECORD FILE testagi gsm 1234 3000\n"; my $result = <STDIN>; &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 = <STDIN>; &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] .

102

Приносим извинения читателям, которые живут не в США, за использование сервиса погоды, предоставляющем информацию только о городах США. Если вы сможете найти хороший международный погодный сервис, который предоставляет свои данные в XML, вам не должно составить особого труда изменить этот сценарий AGI для работы с тем конкретным сервисом. Как только мы найдем такой сервис, мы внесем поправки в этот сценарий для будущих изданий данной книги.

• Должна быть отключена буферизация вывода через задание $|=1.

• Данные, поступающие от Asterisk, принимаются с помощью цикла

while(<STDIN>).

Значения записываются командой 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 для загрузки из Интернета сводки погоды и предоставления вызывающему абоненту информации о температуре, направлении и скорости ветра.

#!/usr/bin/php -q

<?php

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

# внесите соответствующие изменения для получения

# данных по интересующему вас городу

# полный список городов США можно найти по адресу

# http://www.nws.noaa.gov/data/current_obs/

$weatherURL="http://www.nws.noaa.gov/data/current_obs/KMDQ.xml"; Тем самым вы указываете сценарию AGI, где можно получить информацию о текущих погодных условиях. В данном примере предоставляются данные для Хантсвилла, штат Алабама. Вы можете свободно посетить указанный сайт, на котором найдете полный список станций по всем Соединенным Штатам Америки1.

# не допускайте, чтобы этот сценарий выполнялся дольше 60 с set_time_limit(60);

Здесь мы указываем PHP, что данная программа не должна выполняться более 60 с. Таким образом, сценарий будет гарантированно завершен, если по какой-то причине время его выполнения превысит 60 с.

# отключить буферизацию вывода ob_implicit_flush(false);

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

# отключите сообщения об ошибках, поскольку, скорее всего,

# они будут пересекаться с сообщениями интерфейса AGI error_reporting(0);

Эта команда отключает все сообщения об ошибках, поскольку они могут пересекаться с сообщениями интерфейса AGI. (Вероятно, полезно будет закомментировать эту строку при тестировании.)

# создать описатели файла в случае необходимости if (!defined('STDIN'))

define('STDIN', fopen('php://stdin', 'r'));

if (!defined('STDOUT'))

define('STDOUT', fopen('php://stdout', 'w'));

if (!defined('STDERR'))

define('STDERR', fopen('php://stderr', 'w'));

Этот фрагмент кода гарантирует открытие описателей файла для потоков STDIN, STDOUT и STDERR, которые будут обрабатывать все взаимодействия между Asterisk и нашим сценарием.

# извлекаем все переменные AGI из Asterisk

while (!feof(STDIN)) {

$temp = trim(fgets(STDIN,4096));

if (($temp == "") || ($temp == "\n")) {

break;

i

$s = split(":",$temp);

$name = str_replace("agi_","",$s[0]);

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