PHP AMI 连接 - 将传入和传出调用保存到数据库不起作用

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

使用 AMI(与 Asterisk 服务器的 API 连接,以便我可以使用 PHP 套接字连接)我尝试使用 PHP 捕获接收数据,以便我可以记录 CRM 系统(基于网络)的传出和传入呼叫我工作的公司。 但我没有得到我希望的结果...... 完整代码可以在 PasteBin http://pastebin.com/AwRNBW2G

上找到

我用这种方式接听去电,效果很好:

  if($givenkey = array_search("Context: from-internal", $content)){
            $calleridKey = $givenkey + 1;
            $idSIP = $givenkey - 1;
            $dialNumber = str_replace("Extension: 0","31",$content[$calleridKey]);
            $dialNumber = str_replace("Extension: ", "", $dialNumber);
            $fromSIP = str_replace("Channel: SIP/", "", $content[$idSIP]);
            $fromSIP = substr($fromSIP, 0, 2);
            $dialTime = date('r');

            $uitgaand = array(
                            "Phonenumber"   => $dialNumber,
                            "Type"          => "Uitgaand",
                            "datetime"      => $dialTime,
                            "SIP"           => $fromSIP
                            );

以这种方式捕获来电,但这无法正常工作:

   if($givenkey = array_search("AppData: Using CallerID ", $content)){
            if(array_search("Channel: SIP/31000000000", $content)+5 == $InCallKey = array_search("AppData: Using CallerID", $content)){
                    $calleridNum = explode('"',str_replace('AppData: Using CallerID "',"",$content[$InCallKey]));
                    $pickupSource = array_search("Source: SIP/31000000000", $content);
                    if($pickupSource+1 == $pickupKey = array_search("Destination: SIP/", $content)){
                            $pickupBy =  str_replace("Destination: SIP/","",$content[$pickupkey]);
                            $pickupBy = substr($pickupBy, 0, 2);
                            $dialTime = date('r');         
                            $inkomend = array(
                                            "Phonenumber" => $calleridNum[0],
                                            "Type"          => "Binnenkomend",
                                            "datetime"      => $dialTime,
                                            "SIP"           => $pickupBy
                                            );

我现在无法使用该数组,但如果有必要,我可以保存该数组并将其发布到此处并过滤个人数据。

我知道我现在使用的代码并不整洁,但我编写它的目标是:快速获得结果。如果我有一个可以工作的代码,我会优化它并清理它。对此的提示也非常受欢迎。很遗憾我找不到任何关于此的好的文档,所以我必须从头开始,只能找到我现在正在使用的工作类,但它不是很完整。 我必须在没有任何关于 VOIP 或 AMI 或 Asterisk 的知识的情况下写这部分。

简而言之,这是我的问题:

  • 如何使用 AMI 记录来电和去电并最终将其保存在数据库中?
  • 如何以最佳方式保持与服务器的连接?我现在使用的方法并不是最佳选择,因为 48 小时内至少会出现一次连接失败。
  • 您对优化代码和更简洁的代码编写有什么建议或建议吗?你可能知道我可以使用什么函数来代替我正在使用的函数吗?

最近我收到这个错误,但无法正确解决。运行大约 15 分钟后会出现此错误。它将至少提前 24 小时运行:

PHP Notice:  fwrite(): send of 16 bytes failed with errno=32 Broken pipe in /var/www/html/phpami/AMILoader.php on line 147
Net_AsteriskManagerException: Authorisation failed in /var/www/html/phpami/AMILoader.php on line 173
#0 /var/www/html/phpami/AMILoader.php(173): Net_AsteriskManager-login('GEBRUIKERSNAAM','WACHTWOORD')
#1 /var/www/html/phpami/AMILoader.php(306): Net_AsteriskManager-_sendCommand('Action: Ping???...')
#2 /var/www/html/phpami/AMILoader.php(543): Net_AsteriskManager->ping()
#3 {main}

任何人都可以帮我解决这个问题吗?授权数据是正确的(它在整个脚本中使用相同的数据并且确实获得了连接)。另外,我没有收到响应“操作:Ping???...”,它说是由脚本作为命令发送的,但是三个问号和句点来自哪里?

php sockets voip asterisk amazon-ami
2个回答
1
投票

这个框架应该很方便: https://github.com/marcelog/PAMI

否则您可以检查 vTiger 源代码以及它如何处理 ami 集成: http://www.vtiger.com/index.php?Itemid=57&id=30&option=com_content&task=view


1
投票

如果您使用 php,连接 AMI 最简单的方法之一是使用 php-astmanager 类。它支持某些“事件”的回调,以便您可以捕获所需的数据。最好的(唯一?)维护的副本是 FreePBX 的一部分,可以直接从最新版本(撰写本文时为 2.9)中提取。

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