Salon Optyczny Joanna Jarzyna
dj_ndc_photo

PHP AGI

Skrypty AGI umożliwiają bardziej zaawansowaną obsługę połączeń,
dzięki możliwości skorzystania z prawie dowolnego skryptowego jezyka programowania.
Ponieważ najbardziej popularnym językiem jest PHP, bardzo wygodnie korzysta się
ze specjalnej klasy PHP-AGI.

Skrypty AGI umożliwiają pisanie programów, które łączą się z bazami danych / serwisami
w celu pobrania danych, a następnie zwrócenia ich wartości do dialplanu Asteriska.

Może to być pobranie statusu zamówienia na podstawie numeru zamówienia przez komunikat IVR,
a następnie odtworzenie głosowe statusu zamówienia do słuchawki rozmówcy.

Jest bardzo dobrze opisana na stronie:

http://phpagi.sourceforge.net/

Są przykłady zastosowania i dobrze opisane funkcje składowe.
Klasę można pobrać z adresu:

http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-2.20.tgz/download

root# cd /usr/src
root# wget http://sourceforge.net/projects/phpagi/files/phpagi/2.20/phpagi-2.20.tgz/download
root# mv download phpagi.tar.gz
root# tar xvzf phpagi.tar.gz
root# mv phpagi-2.20/ /var/lib/asterisk/agi-bin/phpagi

Przechodzimy do folderu /var/lib/asterisk/agi-bin/ i tworzymy pierwszy skrypt:

root# cd /var/lib/asterisk/agi-bin/

Tworzymy pierwszy skrypt:

root# touch pierwsze.php

Edytujemy:

root# nano pierwsze.php

Wklejamy:

#!/usr/bin/php -q
<?
require('phpagi/phpagi.php');
$agi = new AGI();

$pin = $agi->request['agi_arg_1'];

if ($pin == '1234')
{
$sprawdz = 'TAK';
}
else {
        $sprawdz = 'NIE';
     }

$agi->set_variable('STAN',$sprawdz);
?>

Zapisujemy i przechodzimy do testowania.
Nadajemy prawa wykonywania:

root# chmod 777 pierwsze.php

Edytujemy /etc/asterisk/extensions.conf i dodajemy wpis do testu AGI.
AGI ma za zadanie sprawdzić wprowadzony PIN, jeżeli jest poprawny,
zwrócić do dialplany wartość TAK, jeżeli nie to NIE. Pin to 1234.
AGI zwraca wynik do dialplanu w postaci zmiennej ${STAN}.

Dialplan testowy:
[polaczenia]
exten => 100,1,Answer()
exten => 100,n,WaitExten(10)
exten => _X.,1,Goto(polaczenia_pin,${EXTEN},1)
[polaczenia_pin]
exten => _X.,1,Agi(pierwsze.php,${EXTEN})
exten => _X.,2,NoOp(${STAN})

Dzwonimy pod 100 i stukamy różne wartości np. 12345, 1234, aby zobaczyć wynik.
Oto wyniki:

Błędny PIN:
   -- Executing [100@polaczenia:1] Answer("SIP/andrzej_100-00000002", "") in new stack
    -- Executing [100@polaczenia:2] WaitExten("SIP/andrzej_100-00000002", "10") in new stack
  == CDR updated on SIP/andrzej_100-00000002
    -- Executing [1255@polaczenia:1] Goto("SIP/andrzej_100-00000002", "polaczenia_pin,1255,1") in new stack
    -- Goto (polaczenia_pin,1255,1)
    -- Executing [1255@polaczenia_pin:1] AGI("SIP/andrzej_100-00000002", "pierwszy.php,1255") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/pierwszy.php
    -- AGI Script pierwszy.php completed, returning 0
    -- Executing [1255@polaczenia_pin:2] NoOp("SIP/andrzej_100-00000002", "NIE") in new stack
    -- Auto fallthrough, channel 'SIP/andrzej_100-00000002' status is 'UNKNOWN'

PIN poprawny:
 -- Executing [100@polaczenia:1] Answer("SIP/andrzej_100-00000003", "") in new stack
    -- Executing [100@polaczenia:2] WaitExten("SIP/andrzej_100-00000003", "10") in new stack
  == CDR updated on SIP/andrzej_100-00000003
    -- Executing [1234@polaczenia:1] Goto("SIP/andrzej_100-00000003", "polaczenia_pin,1234,1") in new stack
    -- Goto (polaczenia_pin,1234,1)
    -- Executing [1234@polaczenia_pin:1] AGI("SIP/andrzej_100-00000003", "pierwszy.php,1234") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/pierwszy.php
    -- AGI Script pierwszy.php completed, returning 0
    -- Executing [1234@polaczenia_pin:2] NoOp("SIP/andrzej_100-00000003", "TAK") in new stack
    -- Auto fallthrough, channel 'SIP/andrzej_100-00000003' status is 'UNKNOWN'