我正在使用 PHP 和 Asterisk 服务器开发一个应用程序。该应用程序的功能之一是检查特定呼叫者 ID 的呼叫状态(振铃、应答、挂起等),所以我想知道如何执行此操作,因为我正在尝试使用套接字和命令状态,但我认为这必须是更好的方法。
您使用什么 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 数据库,然后从数据库中提取您的呼叫记录。
哈夫,
您可以创建一个 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 是地球上唯一真正的事件驱动用于 HTML5 的 Asterisk AMI 界面。所有其他解决方案仍然卡住轮询 服务器。
我可以实时查看通话状态,发起。只需在浏览器中进行拖放即可在(队列、会面、停车、个人)之间转移。我可以创造 运行临时拨号计划条目,无需写入拨号计划或基本上 Asterisk AMI 可以通过NO POLLING 做的任何其他事情。
在 Javascript 中,我可以使用 addEventListener() 函数来实际获取名称 AMI 事件作为参数。没有 NO 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);
?>