Страница 1 из 1

AMI Event Listener на MyPBX 1600

Добавлено: 12 май 2012, 21:49
slavaka_z
Здравствуйте! Поставил Yeastar MyPBX 1600, хочу сделать связку со своей CRM, а точнее получать callerID сразу при входящем звонке.

До этого стояла TDM800, та сразу при входящем звонке запускала AGI скрипт, передающий CallerID в удаленную базу MySQL. Здесь так не сделать. Получается, что нужно удаленно с сервера слушать и парсить события, и при событии входящего звонка выдирать CallerID.

Не пойму чем слушать, пытался с помощью asterisk-php-api, но он почему-то очень долго думает и все равно CallerID не дает, и как им слушать, опрашивать asterisk каждую секунду скриптов, что ли? Как можно такое сделать-то?

Re: AMI Event Listener на MyPBX 1600

Добавлено: 12 май 2012, 23:42
slavaka_z
Да, спасибо Вам, нашел демон, буду пробовать.

Я так понимаю, что на железку я ничего не могу поместить, и запускать с нее тоже не смогу (как мне объяснили в поддержке, все изменения через SSH бесполезны, так как они все равно затрутся). Получается, что выход только один - запускать скрипт с удаленного сервера.

Т.е. я запускаю ваш скрипт у себя на сервере как демон и он будет висеть и удаленно слушать астериск, а при наличии нужного события (в нашем случае NewCallerID) будет генерить чего-нужно, сработает так?

Re: AMI Event Listener на MyPBX 1600

Добавлено: 18 май 2012, 18:48
slavaka_z
Попробовал, и правда получается. Только в Events он почему-то три раза подряд выдает CallerID при звонке, вы не знаете почему?

Re: AMI Event Listener на MyPBX 1600

Добавлено: 20 май 2012, 12:39
slavaka_z
Ладно, разберемся. Спасибо за скрипт.

Re: AMI Event Listener на MyPBX 1600

Добавлено: 11 июн 2012, 02:25
slavaka_z
Разобрался со скриптом, полезная штука. Правда пришлось немного подправить. В исходном состоянии он у меня работал пару минут и потом, видимо, терялось соединение, а заново соединится не получалось, пришлось, почему-то заново создавать переменную, заново прописывать событие и т.д. но теперь в таком состоянии у меня работает постоянно:

Код: Выделить всё

#!/usr/bin/env php
<?php
require_once '../../../config.php';

$manager = new AGI_AsteriskManager();
$con = $manager->connect('localhost', 'admin', 'passwd');

if (!$con) {
   echo "Can't connect to manager!";
}

$manager->add_event_handler('NewCallerID','NewCallerID'); 
$response = $manager->wait_response(TRUE);

while (!$response) 
{
        sleep("1");
        $manager = new AGI_AsteriskManager();
        $con = $manager->connect('localhost', 'admin', 'passwd');
        $manager->add_event_handler('NewCallerID','NewCallerID'); 
        $response = $manager->wait_response(TRUE);
}

function NewCallerID($ecode, $data, $server, $port) {
   $event = $data['Event'];
   if ($event == "NewCallerID") 
   {
     print_r($data);      
   }
}
?>
Далее, если не вдаваться в детали, у меня запускается скрипт, который по сети оповещает все компы о номере входящего звонка (я не стал подробно function NewCallerID расписывать). Теперь я столкнулся с такой проблемой: скрипт срабатывает и когда есть входящие звонки, но так же и когда есть исходящие. Я заметил, что в этих двух случаях разная последовательность событий: при исходящем звонке идет Event: Dial, затем Event: NewCallerID, а при входящем Event: NewChannel, затем Even: NewCallerID. Я могу обработчик написать для каждого из этих отдельных событий, но никак не могу понять, как мне определять в какой последовательности они идут, иначе говоря - была ли последовательность Dial->NewCallerID или NewChannel->NewCallerID.