В конце сценария AGI результаты тестирования записываются в STDERR, который должен быть выведен в консоли Asterisk.

Итак, при написании AGI-программ на Perl необходимо помнить следующее:

• Должен быть активирован строгий контроль выполнения правил языка программирования с помощью команды use strict[102].

• Должна быть отключена буферизация вывода через задание $|=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/KMD Q.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 == ' ')) {

break;

i

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

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

$agi[$name] = trim($s[1]);

}

Далее считываем все AGI-переменные, передаваемые нам Asterisk. Использование в PHP команды fgets для чтения данных из STDIN обеспечит сохранение каждой переменной в хеше $agi. Эти переменные могли бы использоваться в логике сценария AGI, но в данном примере мы не будем этого делать.

# вывести все переменные AGI в целях отладки

foreach($agi as $key=>$value) {

fwrite(STDERR,'-- $key = $value '); fflush(STDERR);

}

Здесь переменные возвращаются в STDERR для целей отладки.

# извлечь эту веб-страницу $weatherPage=file_get_contents($weatherURL);

Эта строка кода обеспечивает извлечение XML-файла с сайта National Weather Service (Национальная метеорологическая служба) и помещение его содержимого в переменную $weatherPage. Эта переменная будет использована позже для получения необходимых частей сводки погоды.

# получить температуру в градусах по Фаренгейту

if (preg_match('/<temp_f>([0-9]+)</temp_f>/i',$weatherPage,$matches)) {

$currentTemp=$matches[1];

}

Данный фрагмент кода извлекает данные о температуре (в градусах по Фаренгейту) из сводки погоды с помощью команды preg_match. Для получения необходимых данных эта команда использует совместимые с Perl регулярные выражения[103].

# получить направление ветра

if (preg_match('/<wind_dir>North</wind_dir>/i',$weatherPage)) {

$currentWindDirection='northerly';

elseif (preg_match('/<wind_dir>South</wind_dir>/i',$weatherPage))

$currentWindDirection='southerly'; elseif (preg_match('/<wind_dir>East</wind_dir>/i', $weatherPage))

$currentWindDirection='easterly'; elseif (preg_match('/<wind_dir>West</wind_dir>/i', $weatherPage))

$currentWindDirection='westerly'; elseif (preg_match('/<wind_dir>Northwest</wind_dir>/i', $weatherPage))

$currentWindDirection='northwesterly'; elseif (preg_match('/<wind_dir>Northeast</wind_dir>/i', $weatherPage))

$currentWindDirection='northeasterly'; elseif (preg_match('/<wind_dir>Southwest</wind_dir>/i', $weatherPage))

$currentWindDirection='southwesterly'; elseif (preg_match('/<wind_dir>Southeast</wind_dir>/i',

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату