簡體   English   中英

我怎么知道一個電話的狀態 - 星號和PHP?

[英]How can I know the status of a call - Asterisk and PHP?

我正在使用PHP和Asterisk服務器開發應用程序。 該應用程序的一個功能是檢查特定呼叫者ID的呼叫狀態(振鈴,應答,掛起...),所以我想知道如何做到這一點,因為我正在嘗試使用套接字和命令狀態,但我認為它必須是一個更好的方法。

提前致謝。

你用什么API來編寫這個程序? AMI? AGI? FastAGI? DeadAGI? 調用文件? 有很多方法可以獲得這些信息。

注意 :除非使用呼叫文件和/或CDR訪問,否則您無法判斷某個頻道是否已掛起。

使用AMI,您可以使用Status命令(此處記錄: http//www.voip-info.org/wiki/view/Asterisk+Manager+API+Action+Status )。

使用AGI,您將知道您的程序確定的狀態。 如果您仍在AGI腳本中,則呼叫仍在進行中且已經應答。

如果您正在使用調用文件,並且Archive屬性設置為“yes”,那么一旦調用完成,您就可以檢查調用文件的outoing_done目錄(通常是/ var / lib / asterisk / outgoing_done /)。 當您讀取調用文件時,您會注意到Asterisk在調用文件的底部附加了一個狀態,該狀態將告訴您調用的最終狀態。

獲取此信息的最佳方法是從Asterisk服務器上的CDR記錄中讀取PHP腳本。 讓您的CDR記錄登錄到MySQL數據庫,然后從數據庫中提取您的呼叫記錄。

Harph,

您可以創建AMI守護程序以偵聽從Asterisk流式傳輸的AMI事件。 我已經多次這樣做了,其中一個用於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獲取信息時,此方法似乎最可靠。

我實際上使用HTML5 webSockets和AsterClick,這是我用PHP編寫的中間件守護進程。

據我所知,AsterClick是地球上唯一真正的事件驅動的 Asterisk AMI接口。 所有其他解決方案仍然卡在服務器上。

我可以實時觀察來電的狀態。 只需在我的瀏覽器中拖放即可在(隊列,聚會,停車,個人)之間進行轉移。 我可以創建有效的ad hoc dialplan條目,而無需寫入撥號方案或基本上任何其他任何東西,Asterisk AMI可以做任何POLLING

在Javascript中,我可以使用addEventListener()函數,該函數實際上將AMI事件的名稱作為參數。 沒有POLLING ,但是當Asterisk AMI發出事件時,它會通過webSocket發送到我的瀏覽器,生成一個處理數據並在瀏覽器中發出更多事件的事件。

我還有一個名為WBEA的工具,它允許我將相同的HTML5 AsterClick應用程序部署為Windows和Linux的獨立桌面可執行文件。

我使用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);    

    ?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM