Ubuntu — Как использовать php в VoIP-сервере Asterisk

Я полностью настроил сервер 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");
}
?>

Спасибо

0

Решение

Я настоятельно рекомендую вам занять несколько минут, прочитать следующие ссылки и взять следующее программное обеспечение:

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, чтобы он не блокировался на выполнение.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]