Asterisk AGI, проверка статуса заказа путем ввода клиентом DTMF номера

savingleb
На сайте с 15.04.2007
Offline
393
4733

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

Сейчас сделано так, что берется номер звонящего, проверяется по базе и выдается результат, но к сожалению не совсем подходит, хоть и удобнее для клиента. Проблема в том, что как минимум, у клиента может быть несколько заказов, либо он может звонить с другого номера.

Вариант с определением номера, который сейчас есть:

;Вызваем php скрипт check_status.php  с аргументом номер клиента.

exten => s,n,AGI(check_status.php, ${CALLERID(number)})

<?php
//check_status.php скрипт для автоматического ответа по статусу заказа
//Подключаемся к базе данных (причем, можно отметить, что php имеет в своем наборе интерфейсы
//практически ко всем типам баз данных которые только существуют)
$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("clients");

//Делаем выборку по номеру клиента
$sql = "SELECT status
FROM clients
WHERE client_number = ".$argv[1];
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);

// Получили статус предположим что они бывают Ready и Please_Wait
$status=$row["status"];
mysql_free_result($result);

//Подключаем класс для работы с Asterisk
require('phpagi.php');
$agi = new AGI();

//Отвечаем на вызов клиента
$agi->answer();

// Проигрываем заранее заготовленные файлы Ready или Please_Wait /var/lib/asterisk/sounds
$agi->stream_file($status);
$agi->hangup();
?>
Визовый центр в Санкт-Петербурге (https://visaspb.com/).
H
На сайте с 15.02.2010
Offline
105
#1

Это много проще делать в диалпланах самого астериска, чем писать на php и оттуда давать команды АТС. Или я неверно понял техзадание...

savingleb
На сайте с 15.04.2007
Offline
393
#2
hubbiton:
Это много проще делать в диалпланах самого астериска, чем писать на php и оттуда давать команды АТС. Или я неверно понял техзадание...

Задание простое, человек звонит, попадает в IVR, один из пунктов который перенаправляет его на проверку готовности. Проигрывается запись с просьбой ввести номер заказа, человек вводит, введенный номер сверяется с базой (mysql, etc...) и после проверки выдается результат о готовности.

H
На сайте с 15.02.2010
Offline
105
#3

Вполне реализуемо. Могу показать примеры "живьём". В личку.

savingleb
На сайте с 15.04.2007
Offline
393
#4

Звонок - Просьба ввести номер квитанции, по результатам ответ о готовности, далее "Если хотите связаться с оператором, нажмите 0".

<?php

//check_status.php скрипт для автоматического ответа по статусу заказа
//Подключаемся к базе данных (причем, можно отметить, что php имеет в своем наборе интерфейсы
//практически ко всем типам баз данных которые только существуют)
$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("clients");

//Подключаем класс для работы с Asterisk
require('phpagi.php');
$agi = new AGI();

//Отвечаем на вызов клиента
$agi->answer(); //ответить нужно до того, как мы попросим клиента ввести номер заказа

$sound = 'enter_digits'; //файл со звуковым сообщением
$timeout = 20000; //таймаут для ввода DTMF - 20 секунд (в миллисекундах)
$max_dtmf_input = 6; //разрешить максимум 10 символов DTMF

$dtmf = $agi->get_data($sound, $timeout, $max_dtmf_input);
$code = $dtmf['result']; //строка с введенными цифрами

//Делаем выборку по номеру заказа
$sql = "SELECT status
FROM clients
WHERE client_number = ".$code;
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);

$status=$row["status"];
mysql_free_result($result);

// Проигрываем заранее заготовленные файлы Ready или Please_Wait /var/lib/asterisk/sounds
$agi->stream_file($status);

$dtmf = $agi->get_data('sound', 20000, 1); //проиграли sound, ждем кода длиной в 1 символ по DTMF
$code = $dtmf['result'];

if($code == '0') {
$agi->exec('Goto',"ext-queues,61,1"); // номер очереди
} else {
$agi->hangup();
}
//$agi->hangup();

?>
H
На сайте с 15.02.2010
Offline
105
#5

Вопрос, конечно, идеологический и "на вкус и цвет все фломастеры разные"...

Но, имхо, решать такую задачу таким путём примерно то же самое, как передавать переменные из одного php-скрипта в другой путём записи/чтения в файл или базу в то время, как существуют сессии и $_GET ))

Asterisk умеет работать напрямую с MYSQL и задача решается много проще без вызова внешних скриптов. При большой нагрузке, думаю, это будет иметь большое значение.

http://asterisk.ru/knowledgebase/Asterisk+cmd+MYSQL

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий