Шрифт:
# внесите соответствующие изменения для получения
# данных по интересующему вас городу
# полный список городов США можно найти по адресу
# 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))