我正在使用PHP和Asterisk Server开发应用程序。该应用程序的一个功能是检查特定呼叫者ID的呼叫状态(振铃,应答,挂起...),所以我想知道如何做到这一点,因为我正在尝试使用套接字和命令状态,但我认为它必须是更好的方法。
提前致谢。
答案 0 :(得分: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在调用文件的底部附加了一个状态,该状态将告诉您调用的最终状态。
最佳获取此信息的方法是从Asterisk服务器上的CDR记录中读取PHP脚本。让您的CDR记录登录到MySQL数据库,然后从数据库中提取您的呼叫记录。
答案 1 :(得分:2)
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 vs php的一个主要区别是javascript必须使用Asterisk的http守护进程而不是直接连接到AMI的套接字连接。因此,它必须使用'waitevent'的东西。但是,由于您将使用TCP套接字连接,只需保持循环读取语句。
希望这有帮助!当试图从Asterisk获取信息时,这种方法似乎是最可靠的。
答案 2 :(得分:1)
我实际上使用的是HTML5 webSockets和AsterClick,这是我用PHP编写的中间件守护进程。
据我所知,AsterClick是地球上唯一真正用于HTML5的事件驱动的 Asterisk AMI界面。所有其他解决方案仍然停留在轮询中 服务器。我可以实时观看来电的状态。只需在我的浏览器中拖放即可在(队列,聚会,停车,个人)之间进行转移。我可以创造 在没有写入拨号方案或基本上任何其他任何东西的情况下,Asterisk AMI可以使用 NO POLLING 来运行ad hoc dialplan条目。
在Javascript中,我可以使用实际获取名称的addEventListener()函数 AMI事件作为参数。有 NO POLLING ,但是当Asterisk AMI发出事件时,它会通过webSocket发送到我的浏览器,生成一个事件, 处理数据并在浏览器中发出更多事件。
我还有一个名为WBEA的工具,它允许我将这些相同的HTML5 AsterClick应用程序部署为适用于Windows和Linux的独立桌面可执行文件。
答案 3 :(得分: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);
?>