Как узнать статус звонка - Asterisk и PHP? - PullRequest
5 голосов
/ 23 февраля 2010

Я занимаюсь разработкой приложения на PHP и Asterisk Server. Одной из функций приложения является проверка состояния вызова (звонит, ответил, завис ...) определенного идентификатора вызывающего абонента, поэтому я хотел бы знать, как это сделать, потому что я пытаюсь с сокетом и статус команды, но я думаю, что это должен быть лучший способ сделать это.

Заранее спасибо.

Ответы [ 4 ]

4 голосов
/ 25 февраля 2010

Какой API вы используете для написания этой программы? AMI? AGI? FastAGI? DeadAGI? Вызов файлов? Есть много способов получить эту информацию.

ПРИМЕЧАНИЕ : Вы не можете определить, завис ли канал, если вы не используете файлы вызовов и / или доступ к CDR.

С AMI вы можете использовать команду Status (задокументировано здесь: http://www.voip -info.org / wiki / view / Asterisk + Manager + API + Action + Status ).

С AGI вы узнаете статус, который определяется вашей программой. Если вы все еще в своем сценарии AGI, то вызов все еще выполняется и уже ответил.

Если вы используете файлы вызовов и у вас установлен атрибут «Архив» на «да», то после завершения вызова вы можете проверить каталог outoing_done (обычно это / var / lib / asterisk / outgoing_done /) для вашего вызова файл. Когда вы прочитаете файл вызова, вы заметите, что Asterisk добавил статус внизу файла вызова, который сообщит вам окончательный статус вызова.

ЛУЧШИЙ способ получить эту информацию - прочитать ваш скрипт PHP из записей CDR на вашем сервере Asterisk. Сделайте так, чтобы ваши записи CDR записывались в базу данных MySQL, а затем извлекали записи для вашего вызова из базы данных.

2 голосов
/ 08 марта 2010

Harph,

Вы можете создать демон AMI для прослушивания событий AMI, передаваемых из Asterisk. Я делал это много раз, в том числе для Asterisk GUI. Если вы создаете таблицу состояния в своей базе данных, вы можете создать демон для прослушивания событий AMI и обновления состояния по мере их возникновения. Тогда вашей веб-странице вообще не нужно будет взаимодействовать с Asterisk, просто нужно будет прочитать статус из базы данных.

Следующая ссылка взята из проекта Asterisk GUI. Он написан на javascript, поэтому ваш php будет немного другим, но это даст вам хорошую основу для начала. Начните со строки 574.

http://svn.asterisk.org/view/asterisk-gui/branches/2.0/config/js/welcome.js?view=markup

Одно из ключевых отличий в javascript от php заключается в том, что javascript должен использовать демон Asterisk http вместо сокетного соединения прямо к AMI. Из-за этого он должен использовать материал «waitevent». Но так как вы будете использовать соединение через сокет TCP, просто продолжайте цикл в операторе чтения.

Надеюсь, это поможет! Этот метод представляется наиболее надежным при попытке получить информацию от Asterisk.

1 голос
/ 05 января 2011

Я на самом деле использую HTML5 webSockets и AsterClick, демон промежуточного программного обеспечения, который я написал на PHP.

Насколько я знаю, AsterClick является единственным действительно управляемым событиями интерфейсом Asterisk AMI для HTML5 на планете. Все остальные решения по-прежнему застряли в опросе сервер.

Я могу смотреть статус звонков в реальном времени, исходить. Перемещение между (очереди, MeetMe, парковка, люди) просто перетаскивая в моем браузере. Я могу создать функционирование специальных записей плана набора номера без записи в план набора номера или в основном что-либо еще Asterisk AMI может делать с БЕЗ ОПРОСА никогда.

В Javascript я могу использовать функцию addEventListener (), которая фактически принимает имена событий AMI в качестве параметров. NO POLLING , но когда Asterisk AMI генерирует событие, оно отправляется в мой браузер через webSocket, генерируя событие, которое обрабатывает данные и генерирует больше событий в браузере.

У меня также есть инструмент под названием WBEA, который позволяет мне развертывать те же приложения HTML5 AsterClick, что и автономные исполняемые файлы для Windows и Linux.

0 голосов
/ 28 июня 2013

Я использую команду CLI для проверки статуса канала. Вот код php, который я использую

<?php 
    $socket = fsockopen("111.11.11.111",$portno, $errno, $errstr, $timeout);
    fputs($socket, "Action: Login\r\n");
    fputs($socket, "UserName: username\r\n");
    fputs($socket, "Secret: secret\r\n\r\n");


     $channel=$_GET['value']; //pass channel through GET method


    echo"<pre>";
    fwrite($socket, "Action: Status\r\n");
    fwrite($socket, "Command: Lists channel status ".$channel."\r\n\r\n");
    $wrets="";


    fputs($socket, "Action: Logoff\r\n\r\n");

    while (!feof($socket)) {
      $wrets .= fread($socket, 8192).'</br>';
    }

    echo $wrets."<br/>";

    fclose($socket);    

    ?>
...