PHP AMI Connection - сохранение входящих и исходящих вызовов в базу данных не работает

Используя AMI (соединение API с сервером Asterisk, поэтому я могу использовать соединение PHP Socket), я пытаюсь перехватить полученные данные с помощью 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???...», который, как говорится, отправляется сценарием как команда, но откуда берутся три вопросительных знака и точки?


person AltShiftZero    schedule 11.05.2011    source источник


Ответы (2)


эта структура должна быть удобной: https://github.com/marcelog/PAMI

в противном случае вы можете проверить исходники vTiger и то, как он справляется с интеграцией ami: http://www.vtiger.com/index.php?Itemid=57&id=30&option=com_content&task=view

person shoen    schedule 12.05.2011

Если вы используете php, одним из самых простых способов подключения к AMI является использование класса php-astmanager. Он поддерживает обратный вызов для определенных «событий», чтобы вы могли перехватывать нужные вам данные. Лучшая (единственная?) поддерживаемая копия является частью FreePBX и может быть извлечена прямо из последней версии (2.9 как этого сочинения).

person Mbrevda    schedule 15.05.2011
comment
Спасибо вам обоим за ответы. Я обязательно посмотрю на это и вернусь сюда, чтобы поделиться своими выводами. - person AltShiftZero; 18.05.2011