AGI + “WAIT FOR DIGIT”, result = 0
Добрый день. Не могу поймать нажатые цифры. Есть скрипт на php, вызывается через AGI:
#!/usr/bin/php -q
<?php
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'));
}
# retrieve all AGI variables from Asterisk
# not used in this script, but not unuseful
while (!feof(STDIN))
{
$temp = trim(fgets(STDIN,4096));
if (($temp == "") || ($temp == "\n"))
{
break;
}
$s = split(":",$temp);
$name = str_replace("agi_","",$s[0]);
$agi[$name] = trim($s[1]);
}
set_time_limit(60);
ob_implicit_flush(false);
# turn off error reporting, as it will most likely interfere with
# the AGI interface
error_reporting(0);
// получаем $agivar массив служебных значений
while (!feof($stdin)) {
$temp = fgets($stdin);
$temp = str_replace("\n","",$temp);
$s = explode(":",$temp);
$agivar[$s[0]] = trim($s[1]);
if (($temp == "") || ($temp == "\n")) {
break;
}
}
SLEEP(1);
fwrite(STDOUT, "exec playback /var/lib/asterisk/sounds/beep \"\"\n");
fflush(STDOUT);
$result = fgets(STDIN,4096);
$result = trim($result);
checkresult($result);
fwrite(STDOUT, "WAIT FOR DIGIT 10000\n"); // Command and timeout of 10 seconds
fflush(STDOUT);
$result = fgets(STDIN,4096);
$result = trim($result);
$result = checkresult($result);
$ascii = $result;
fwrite(STDOUT, "SAY NUMBER " . $ascii . " \"\"\n");
fflush(STDOUT);
$result = fgets(STDIN,4096);
$result = trim($result);
checkresult($result);
fwrite(STDOUT, "exec playback /var/lib/asterisk/sounds/goodbye \"\"\n");
fflush(STDOUT);
$result = trim(fgets(STDIN,4096));
// Function to check the result of an AGI command
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;
}
}
?>
При выполнении происходит следующее:
1. Asterisk пикает в трубку (fwrite(STDOUT, "exec playback /var/lib/asterisk/sounds/beep \"\"\n");)
2. Ждет 10 секунд (fwrite(STDOUT, "WAIT FOR DIGIT 10000\n"); )
3. Говорит «ноль» (т.к. $result= «0»)
4. Говорит гудбай (fwrite(STDOUT, "exec playback /var/lib/asterisk/sounds/goodbye \"\"\n");)
5. Вешает трубку.
А нужно чтобы он сказал цифры которые набирались на телефоне в момент (fwrite(STDOUT, "WAIT FOR DIGIT 10000\n");
Если выполнять скрипт как есть, то перед fwrite(STDOUT, "SAY NUMBER " . $ascii . " \"\"\n");
переменная $result = 0
Если не делать $result = checkresult($result); т.е. не парсить полученное значение, то переменная $result = «200 result=0» (для инфы что прилетает в принципе).
Что я делаю не так?
|