我如何知道呼叫的状态 - Asterisk 和 PHP? [已关闭]

问题描述 投票:0回答:4

我正在使用 PHP 和 Asterisk 服务器开发一个应用程序。该应用程序的功能之一是检查特定呼叫者 ID 的呼叫状态(振铃、应答、挂起等),所以我想知道如何执行此操作,因为我正在尝试使用套接字和命令状态,但我认为这必须是更好的方法。

php voip asterisk
4个回答
4
投票

您使用什么 API 来编写此程序? AMI?通用人工智能?快速AGI?死AGI?调用文件?有很多方法可以获取此信息。

注意:除非您使用通话文件和/或 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 在通话文件的底部附加了一个状态,它会告诉您通话的最终状态。

获取此信息的最佳方法是让 PHP 脚本从 Asterisk 服务器上的 CDR 记录中读取。将您的 CDR 记录记录到 MySQL 数据库,然后从数据库中提取您的呼叫记录。


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


1
投票

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

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

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

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

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


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

    ?>
© www.soinside.com 2019 - 2024. All rights reserved.