5

我正在使用 PHP 和 Asterisk Server 开发应用程序。该应用程序的功能之一是检查特定呼叫者 ID 的呼叫状态(振铃、应答、挂起......),所以我想知道如何做到这一点,因为我正在尝试使用套接字和命令状态,但我认为它必须是一种更好的方法。

提前致谢。

4

4 回答 4

4

竖琴,

您可以创建一个 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 获取信息时,这种方法似乎是最可靠的。

于 2010-03-08T19:52:18.933 回答
4

你用什么 API 来写这个程序?AMI?通用人工智能?快速AGI?死机?调用文件?有很多方法可以获取这些信息。

注意:除非您使用通话文件和/或 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 脚本从 Asterisk 服务器上的 CDR 记录中读取。将您的 CDR 记录记录到 MySQL 数据库,然后从数据库中提取您的呼叫记录。

于 2010-02-25T03:35:47.583 回答
1

我实际上使用 HTML5 webSockets 和 AsterClick ,这是我用 PHP 编写的中间件守护程序。

据我所知,AsterClick 是地球上唯一一个真正的事件驱动的Asterisk AMI 界面,用于 HTML5。那里的所有其他解决方案仍然卡在轮询服务器。

我可以实时查看通话状态,发起。只需在我的浏览器中拖放即可在(队列、meetme、停车场、个人)之间转移。我可以创建有效的临时拨号计划条目,而无需写入拨号计划或基本上任何其他 Asterisk AMI 可以通过NO POLLING做的事情。

在 Javascript 中,我可以使用 addEventListener() 函数,该函数实际上将 AMI 事件的名称作为参数。没有POLLING,而是当 Asterisk AMI 发出一个事件时,它通过 webSocket 发送到我的浏览器,生成一个处理数据并在浏览器中发出更多事件的事件。

我还有一个名为 WBEA 的工具,它允许我将相同的 HTML5 AsterClick 应用程序部署为适用于 Windows 和 Linux 的独立桌面可执行文件。

于 2011-01-04T21:58:30.463 回答
0

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

    ?>
于 2013-06-28T11:54:22.300 回答