Вход/Регистрация
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]);

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

}

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

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

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

fwrite(STDERR,"-- $key = $value\n"); 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))

103

Полный справочник по регулярным выражениям - Джеффри Фридл «Регулярные выражения», 3-е издание.
– Пер. с англ.
– СПб: Символ-Плюс, 2008.

В противоположность Asterisk Gateway Interface (AGI), который обеспечивает Asterisk возможность запускать внешнюю программу из диалплана. Интерфейсы AGI и AMI во многом дополняют друг друга.

$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))

  • Читать дальше
  • 1
  • ...
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: