Я полностью настроил сервер Asterisk. На этом сервере мне удалось сделать ч / б двух пользователей через программный телефон.
Для совершения звонка сначала я регистрирую учетную запись и абонентскую группу в двух файлах, а именно
sip.conf и extensions.conf соответственно.
Мне нужно знать, как я могу взаимодействовать с PHP-скриптом, поэтому я делаю динамически.
Я использую Ubuntu Os pl z, помогите мне.
Пожалуйста, поделитесь идеей и ссылками, которые помогут мне понять, как сделать VoIP
API
Я попробовал некоторый код, как это, но это полностью показывает ошибку
Я настраиваю php сервер перед сервером звездочки, который находится в каталоге
/ Опт / lampp / HTDOCS /
и сервер звездочки установлен в каталоге / usr / src /
Пожалуйста, скажите мне, в какой директории мне нужно написать свой php код. И есть ли необходимость в php с помощью звездочки.
#!/usr/bin/php
<?php
/*
This script answers the call and prompts for an extension, provided your caller ID is approved.
When it receives 4 digits it will read them back to you and hang up.
*/
$debug_mode = false; //debug mode writes extra data to the log file below whenever an AGI command is executed
$log_file = '/tmp/agitest.log'; //log file to use in debug mode
$allowed_ext = array('1234', '0'); //who's allowed to access this script
//get the AGI variables; we will check caller id
$agivars = array();
while (!feof(STDIN)) {
$agivar = trim(fgets(STDIN));
if ($agivar === '') {
break;
}
else {
$agivar = explode(':', $agivar);
$agivars[$agivar[0]] = trim($agivar[1]);
}
}
foreach($agivars as $k=>$v) {
log_agi("Got $k=$v");
}
extract($agivars);
//hangup if it's not an allowed extension
if (!empty($allowed_ext)) {
if (!in_array($agi_callerid, $allowed_ext)) {
log_agi("Call rejected from $agi_calleridname <$agi_callerid>");
execute_agi('STREAM FILE goodbye ""');
execute_agi('HANGUP');
exit;
}
}
//ask for an extension
$ext = '';
$result = execute_agi('STREAM FILE please-enter-the "0123456789"');
if ($result['result'] == 0) {
$result = execute_agi('STREAM FILE users "0123456789"');
if ($result['result'] == 0) {
//they haven't entered anything yet
$result = execute_agi("GET DATA extension 5000 4");
if ($result['result'] > 0) {
$ext = $result['result'];
}
}
else {
$ext = chr($result['result']);
}
}
else {
$ext = chr($result['result']);
}
//we haven't got 4 digits yet
if (strlen($ext) < 4) {
//still no input after GET DATA timeout
if (empty($ext)) {
execute_agi('STREAM FILE please-enter-the ""');
execute_agi('STREAM FILE users ""');
execute_agi('STREAM FILE extension ""');
}
//we got a single digit during playback of 'please enter the' or 'users'
while (strlen($ext) < 4) {
$result = execute_agi('WAIT FOR DIGIT -1');
//look for digits only
if ($result['result'] >= 48 && $result['result'] <= 57) {
$ext .= chr($result['result']);
}
//ignore * or # (or a, b, c, d)
else {
continue;
}
}
}
log_agi("Got extension $ext");
//say back the extension; at this point you could certainly do something more productive but that is left to you
execute_agi('STREAM FILE you-entered ""');
execute_agi("SAY DIGITS $ext \"\"");
execute_agi('STREAM FILE goodbye ""');
execute_agi('HANGUP');
exit;
function execute_agi($command) {
global $debug_mode, $log_file;
fwrite(STDOUT, "$command\n");
fflush(STDOUT);
$result = trim(fgets(STDIN));
$ret = array('code'=> -1, 'result'=> -1, 'timeout'=> false, 'data'=> '');
if (preg_match("/^([0-9]{1,3}) (.*)/", $result, $matches)) {
$ret['code'] = $matches[1];
$ret['result'] = 0;
if (preg_match('/^result=([0-9a-zA-Z]*)\s?(?:\(?(.*?)\)?)?$/', $matches[2], $match)) {
$ret['result'] = $match[1];
$ret['timeout'] = ($match[2] === 'timeout') ? true : false;
$ret['data'] = $match[2];
}
}
if ($debug_mode && !empty($logfile)) {
$fh = fopen($logfile, 'a');
if ($fh !== false) {
$res = $ret['result'] . (empty($ret['data']) ? '' : " / $ret[data]");
fwrite($fh, "-------\n>> $command\n<< $result\n<< parsed $res\n");
fclose($fh);
}
}
return $ret;
}
function log_agi($entry, $level = 1) {
if (!is_numeric($level)) {
$level = 1;
}
$result = execute_agi("VERBOSE \"$entry\" $level");
}
?>
Спасибо
Я настоятельно рекомендую вам занять несколько минут, прочитать следующие ссылки и взять следующее программное обеспечение:
http://phpagi.sourceforge.net/
http://marcelog.github.io/PAGI/
http://www.asteriskdocs.org/en/2nd_Edition/asterisk-book-html-chunk/asterisk-CHP-9-SECT-3.html
http://www.robpeck.com/2007/07/agi-php-using-php-to-route-phone-calls/
Я также предлагаю вам начать намного меньше.
Создайте очень простой скрипт и убедитесь, что вы можете заставить -any- AGI работать правильно. Затем сложность возрастает.
Я лично помещаю символические ссылки на весь мой код AGI в /var/lib/asterisk/agi-bin/
; именно здесь Asterisk по умолчанию ищет файлы AGI.
Кроме того, убедитесь, что ваши сценарии AGI имеют правильное владение и права доступа, особенно если вам нужен этот файл для записи файла журнала.
Также убедитесь, что для скрипта правильно задан контекст SELinux, чтобы он не блокировался на выполнение.
Других решений пока нет …