2010-02-23 3 views
5

저는 PHP와 Asterisk Server로 응용 프로그램을 개발하고 있습니다. 응용 프로그램의 기능 중 하나는 특정 호출자 ID의 호출 상태 (벨소리, 응답, 중단 등)를 확인하는 것이므로 소켓을 사용하여 시도하고 있기 때문에이 작업을 수행하는 방법을 알고 싶습니다. 명령 상태지만 나는 그것을 할 더 좋은 방법이라고 생각합니다.Asterisk와 PHP의 통화 상태를 어떻게 알 수 있습니까?

미리 감사드립니다.

답변

4

이 프로그램을 작성하기 위해 사용하는 API는 무엇입니까? AMI? AGI? FastAGI? DeadAGI? 파일을 호출 하시겠습니까? 이 정보를 얻는 방법은 다양합니다.

참고 : 통화 파일 및/또는 CDR 액세스를 사용하지 않는 한 채널이 중단되었는지 알 수 없습니다.

AMI를 사용하면 상태 명령을 사용할 수 있습니다 (여기에 설명되어 있습니다 : http://www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status).

AGI를 사용하면 프로그램에서 결정한 상태를 알 수 있습니다. 여전히 AGI 스크립트에 있다면 통화가 진행 중이며 이미 응답 한 것입니다.

호출 파일을 사용하고 있고 Archive 특성이 'yes'로 설정된 경우 호출이 완료되면 outoing_done 디렉토리 (일반적으로/var/lib/asterisk/outgoing_done /)에서 해당 파일을 검사 할 수 있습니다 호출 파일. 호출 파일을 읽을 때, Asterisk는 호출 파일의 맨 아래에 상태를 추가하여 호출의 최종 상태를 알 수 있습니다.

이 정보를 얻는 방법은 PHP 스크립트가 귀하의 별표 서버의 CDR 레코드에서 읽는 것입니다. CDR 레코드를 MySQL 데이터베이스에 기록한 다음 데이터베이스에서 호출 레코드를 가져옵니다.

+0

좋아요 ... 여기 일이 사용 채널 status.Here는 PHP 코드 확인하기 위해 CLI 명령을 사용합니다. URL에서 GET 매개 변수로 호출 된 ID를받습니다 ('$ _GET [ 'calledID']'). 그 발신자 ID의 전화 상태를 알아야합니다. (저는 PHP를 사용하여 전화를 걸지 않습니다) – Harph

+0

전화의 채널 ID가 없기 때문에이 정보를 직접 얻을 방법이 없습니다. 대신 별표 CDR 데이터베이스를 사용해야합니다. CDR 로그를 데이터베이스 (일반적으로 MySQL)로 보내려면 PHP 스크립트를 SQL 데이터베이스에 연결하고 스크립트에서 가져온 callerID에 대한 쿼리를 수행하십시오. SELECT.을 사용하여 제공된 호출자 ID가 마지막으로 호출 한 호출을 찾습니다. 그런 다음 필요한 정보 (예 : 통화 시간, 통화 종료 시간, 통화 상태 등)를 추출하십시오. – rdegges

+0

예, 맞습니다. CDR 로그 데이터베이스를 사용하여 전화 상태를 확인할 수 있지만 작동합니다. 호출이 완료되면 로그 레코드가 작성되기 때.에 호출이 종료됩니다. 전화가 URL을 통해 나를 보낼 수있는 변수를 사용하여 실시간으로 상태를 가져와야합니다. 어떤 생각? – Harph

2

Harph,

당신은 별표에서 스트리밍 AMI 이벤트를 수신 할 수있는 AMI 데몬을 만들 수 있습니다. 나는 이것을 여러 번했는데, 그 중 하나가 Asterisk GUI 용이었습니다. 데이터베이스의 상태에 대한 테이블을 만들면 AMI 이벤트를 수신하고 발생하는대로 상태를 업데이트하는 데몬을 만들 수 있습니다. 그러면 웹 페이지가 별표 (Asterisk)와 전혀 상호 작용할 필요가 없습니다. 데이터베이스에서 상태를 읽는 것만으로도됩니다.

다음 링크는 Asterisk GUI 프로젝트의 링크입니다. 그것은 자바 스크립트로 작성된, 그래서 당신의 PHP는 약간 다를 것이지만, 이것은 당신에게 좋은 기지를 제공 할 것입니다. PHP는 자바 스크립트 별표의 HTTP 데몬 대신 직선 AMI에 대한 소켓 연결을 사용한다는 것이다 대 라인 자바 스크립트의 주요 차이점 574.

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

하나 시작합니다. 이 때문에 'waitevent'물건을 사용해야합니다. 그러나 TCP 소켓 연결을 사용할 것이기 때문에 반복적으로 읽기 문을 반복하십시오.

희망이 도움이됩니다. 이 방법은 Asterisk에서 정보를 얻으려고 할 때 가장 신뢰할만한 것으로 보입니다.

1

저는 실제로 HTML5 웹 소켓과 PHP에서 작성한 미들웨어 데몬 인 AsterClick을 사용합니다.

내가 아는 한 이벤트는 행성에서 HTML5를위한 Asterisk AMI 인터페이스를 구동했습니다. 밖에있는 다른 모든 솔루션은 여전히 ​​서버가 폴링이 멈추었습니다.

나는 실시간으로 통화 상태를 볼 수있다. 내 브라우저에서 드래그 앤 드롭만으로 (대기열, 회의, 주차, 개인)간에 전송할 수 있습니다. 다이얼 플랜에 쓰지 않고도 임시 다이얼 플랜 항목을 만들 수 있습니다. 기본적으로 별표 AMI는 NO POLLING과 함께 할 수 있습니다.

Javascript에서는 실제로 AMI 이벤트 이름을 으로 매개 변수로 취하는 addEventListener() 함수를 사용할 수 있습니다. NO POLLING이 있지만 Asterisk AMI가 이벤트를 내 보내면 webSocket을 통해 내 브라우저로 전송되어 이벤트를 생성하고 브라우저 내에서 더 많은 이벤트를 방출하는 이벤트를 생성합니다.

Windows 및 Linux 용 독립 실행 형 데스크톱 실행 파일과 동일한 HTML5 AsterClick 응용 프로그램을 배포 할 수있는 WBEA 도구가 있습니다.

0

은 내가

<?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);  

    ?> 
관련 문제