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

на главную - закладки

Жанры

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

}

Данный фрагмент кода извлекает данные о температуре (в градусах по Фаренгейту) из сводки погоды с помощью команды 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))

$currentWindDirection='southwesterly'; elseif (preg_match("/<wind_dir>Southeast<\/wind_dir>/i",$weatherPage)) $currentWindDirection='southeasterly';

Направление ветра извлекаем посредством команды preg_match, а полученное значение (заключенное в теги wind_dir) присваиваем переменной $currentWindDirection.

# получаем скорость ветра

if (preg_match("/<wind_mph>([0-9.]+)<\/wind_mph>/i",$weatherPage,$matches)) {

$currentWindSpeed = $matches[1];

}

Наконец получаем текущую скорость ветра и присваиваем ее значение переменной $currentWindSpeed.

# сообщить вызывающему абоненту текущие погодные условия

if ($currentTemp) {

fwrite(STDOUT,"STREAM FILE temperature \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result); fwrite(STDOUT,"STREAM FILE is \"\"\n"); fflush(STDOUT);

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

checkresult($result);

fwrite(STDOUT,"SAY NUMBER $currentTemp \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite(STDOUT,"STREAM FILE degrees \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite(STDOUT,"STREAM FILE fahrenheit \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

}

if ($currentWindDirection && $currentWindSpeed) {

fwrite(STDOUT,"STREAM FILE with \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite(STDOUT,"STREAM FILE $currentWindDirection \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite(STDOUT,"STREAM FILE wx/winds \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result); fwrite(STDOUT,"STREAM FILE at \"\"\n";) fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite(STDOUT,"SAY NUMBER $currentWindSpeed \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

fwrite($STDOUT,"STREAM FILE miles-per-hour \"\"\n"); fflush(STDOUT);

$result = trim(fgets(STDIN,4096)); checkresult($result);

}

Теперь,

собрав все необходимые данные, можно отправить AGI-коман- ды в Asterisk (проверяя результаты по ходу), которые доставят информацию о текущих погодных условиях вызывающему абоненту. Это будет реализовано с помощью AGI-команд STREAM FILE и SAY NUMBER. Мы говорили об этом раньше, повторим еще раз: при вызове команд AGI в них должны передаваться все необходимые аргументы. В данном случае обе команды, STREAM FILE и SAY NUMBER, требуют второго аргумента. Передадим пустые кавычки, экранированные символом обратного слэша.

Также следует обратить внимание, что при каждой записи в STDOUT вызывается команда fflush. Вероятно, это лишнее, но не будет вреда в том, чтобы гарантировать немедленную отправку AGI-команды в Asterisk, без буферизации.

function checkresult($res) {

trim($res);

if (preg_match('/"200/',$res)) {

if (! preg_match('/result=(-?\d+)/',$res,$matches)) {

fwrite(STDERR,"FAIL ($res)\n");

fflush(STDERR);

return 0;

}

else {

fwrite(STDERR,"PASS (".$matches[1].")\n");

fflush(STDERR);

return $matches[1];

}

}

else {

fwrite(STDERR,"FAIL (unexpected result '$res')\n");

fflush(STDERR);

return -1;

}

}

Назначение функции checkresult аналогично подпрограмме checkresult из нашего примера на Perl. Как следует из ее имени, она проводит проверку

результатов, возвращаемых Asterisk, при каждом вызове команды AGI.

?>

В конце файла располагается закрывающий тег PHP. После закрывающего тега PHP не должно быть никаких пробелов, поскольку это может сбить с толку интерфейс AGI.

Теперь мы уже рассмотрели два разных языка программирования с целью продемонстрировать, что общего в написании сценария AGI на PHP и Perl и чем они отличаются. При создании сценария AGI на PHP помните, что необходимо:

• Запускать PHP с ключом -q; это отключает HTML в сообщениях об ошибках.

• Отключить ограничение по времени или задать для него приемлемое значение (более новые версии PHP автоматически отключают ограничение по времени при запуске PHP из командной строки).

• Отключить буферизацию вывода с помощью команды ob_implicit_ flush(false).

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

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Мимик нового Мира 13

Северный Лис
12. Мимик!
Фантастика:
боевая фантастика
юмористическая фантастика
рпг
5.00
рейтинг книги
Мимик нового Мира 13

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Бывший муж

Рузанова Ольга
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Бывший муж

Безнадежно влип

Юнина Наталья
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Безнадежно влип

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Убийца

Бубела Олег Николаевич
3. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Убийца

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

Последняя Арена 7

Греков Сергей
7. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 7

Возвращение Безумного Бога 4

Тесленок Кирилл Геннадьевич
4. Возвращение Безумного Бога
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога 4

Варлорд

Астахов Евгений Евгеньевич
3. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Варлорд

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III