Cursos Asterisk en México

[RESUELTO] Problema AGI PHP SOCKET

Colapsar

Anuncio

Colapsar
No hay anuncio todavía.
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • [RESUELTO] Problema AGI PHP SOCKET

    Tengo desarrollada una aplicación con un tcp server Socket escuchando un puerto especifico, mi lema es el siguiente.

    Desarrolle un codigo en PHP que se conecta al server socket y envia una linea de respuesta. Mi intencion es que cuando ingrese una llamada a mi conmutador asterisk, este ejecute una AGI escrita en PHP abra un socket al puerto especificado y envie el numero de extencion entrante y demas cosas que necesito.

    mi codigo PHP es el siguiente:

    #!/usr/bin/php -q
    <?php

    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket < 0) {
    echo "socket_create() Fallo: Razon->: " . socket_strerror($socket) . "\n";
    }
    //IP de mi server socket escuchando el puerto 999
    $result = socket_connect($socket, '192.168.53.77', '999');

    if ($result < 0) {
    echo "socket_connect() Fallo .\nRazon: ($result) " . socket_strerror($result) . "\n";
    }

    $in = "Ejemplo de texto desde php";
    socket_write($socket, $in, strlen($in));
    socket_close($socket);
    ?>

    en mi plan de marcacion tengo lo siguiente para hacer pruebas:
    exten => 111,1,AGI(socket.php)

    el error es este:
    AGI Rx << Extension '/var/lib/asterisk/agi-bin/socket.php' not present.
    AGI Tx >> 510 Invalid or unknown command
    -- AGI Script socket.php completed, returning 0
    == Auto fallthrough, channel 'SIP/103-000004b9' status is 'UNKNOWN'
    Asterisk*CLI>


    En linux ejecuto esto:
    root@Asterisk:/var/lib/asterisk/agi-bin# php socket.php
    PHP Warning: socket_connect(): unable to connect [111]: Connection refused in /
    var/lib/asterisk/agi-bin/socket.php on line 14
    PHP Warning: socket_write(): unable to write to socket [32]: Broken pipe in /va
    r/lib/asterisk/agi-bin/socket.php on line 21
    root@Asterisk:/var/lib/asterisk/agi-bin#


    También hice pruebas con ejemplos AGI's escritos en PHP y no me los ejecuta. Temo que sea algo de mi Asterisk que no he configurado.

    Ya des-habilite mi firewall con: sudo ufw disable

    abrí el puerto con: sudo ufw allow 999

    Algún rumbo que pueda tomar?
    se me acaban las opciones.

  • #2
    Hola Ramón, bienvenido al foro.

    No puedes hacer echo dentro de un AGI porque la salida de ese comando sería interpretada en Asterisk como si fuera un comando propio de AGI.

    Consigue la librería phpagi y ponla en la misma carpeta que tu AGI. Cambia tu código por esto:

    Código:
    #!/usr/bin/php -q
    <?php
    include 'phpagi.php';
    $agi = new AGI();
    
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket < 0) {
    $agi->verbose("socket_create() Fallo: Razon->: " . socket_strerror($socket));
    }
    //IP de mi server socket escuchando el puerto 999
    $result = socket_connect($socket, '192.168.53.77', '999');
    
    if ($result < 0) {
    $agi->verbose("socket_connect() Fallo .\nRazon: ($result) " . socket_strerror($result));
    }
    
    $in = "Ejemplo de texto desde php";
    socket_write($socket, $in, strlen($in));
    socket_close($socket);
    ?>
    Y córrela desde Asterisk habiendo usado antes el agi debug para ver bien que es lo que pasa.

    Inténtalo y dinos que ocurre.

    Saludos,
    dCAP Christian Cabrera R.
    Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
    Si deseas asesoría pagada, por favor contáctame

    Comentario


    • #3
      Con un TELNET te puedes conectar?

      Comentario


      • #4
        Gracias por la respuesta, va encaminado a sacar adelante este tema.

        Respuesta de asterisk:

        Asterisk*CLI> agi debug
        AGI Debugging Enabled
        -- Executing [111@celulares:1] AGI("SIP/103-000004c7", "socket.php") in new
        stack
        -- Launched AGI Script /var/lib/asterisk/agi-bin/socket.php
        AGI Tx >> agi_request: socket.php
        AGI Tx >> agi_channel: SIP/103-000004c7
        AGI Tx >> agi_language: es
        AGI Tx >> agi_type: SIP
        AGI Tx >> agi_uniqueid: 1360270653.2060
        AGI Tx >> agi_callerid: 103
        AGI Tx >> agi_calleridname: Ing. Paul Lizarraga
        AGI Tx >> agi_callingpres: 0
        AGI Tx >> agi_callingani2: 0
        AGI Tx >> agi_callington: 0
        AGI Tx >> agi_callingtns: 0
        AGI Tx >> agi_dnid: 111
        AGI Tx >> agi_rdnis: unknown
        AGI Tx >> agi_context: celulares
        AGI Tx >> agi_extension: 111
        AGI Tx >> agi_priority: 1
        AGI Tx >> agi_enhanced: 0.0
        AGI Tx >> agi_accountcode:
        AGI Tx >>
        AGI Rx << Extension '/var/lib/asterisk/agi-bin/socket.php' not present.
        AGI Tx >> 510 Invalid or unknown command
        -- AGI Script socket.php completed, returning 0
        == Auto fallthrough, channel 'SIP/103-000004c7' status is 'UNKNOWN'
        Asterisk*CLI>

        Asterisk sigue igual.

        Pero si ejecuto desde el CLI de Linux cambió la cosa:

        root@Asterisk:/var/lib/asterisk/agi-bin# php socket.php
        root@Asterisk:/var/lib/asterisk/agi-bin#

        y en mi programa hay respuesta satisfactoria y no ocurre cuando ejecuto desde asterisk.

        No puedo hacerlo por telnet porque es un desarrollo muy simple para comunicar Asterisk a un socket a un puerto especifico.

        Estoy desarrollando en Delphi 2010 y el componente es el TcpServer.

        Comentario


        • #5
          Veo que ejecutas tu AGI anteponiéndolo con 'php'. ¿Esto quiere decir que no has hecho a tu AGI ejecutable?

          ¿Ejecutaste chmod 755 /var/lib/asterisk/agi-bin/socket.php antes de hacer la llamada?
          dCAP Christian Cabrera R.
          Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
          Si deseas asesoría pagada, por favor contáctame

          Comentario


          • #6
            Di permisos de ejecución al archivo php, por esa razón estoy trastornado con este asunto.

            lo raro es que en el CLI de linux ejecuto el socket.php me manda la cadena a la aplicación. Lo raro de esto es que al ejecutar el script no se finaliza y envia la cadena en automático, tengo que dar enter nuevamente.

            Comentario


            • #7
              Es normal, dado que es un AGI. Tienes que presionar ENTER para simular que Asterisk pide el siguiente paso.

              ¿Estás seguro de que el archivo no contiene caracteres "raros" invisibles? ¿Lo editaste 100% en Linux?

              Es un hecho que el error está en estas lineas:
              Código:
              AGI Rx << Extension '/var/lib/asterisk/agi-bin/socket.php' not present.
              AGI Tx >> 510 Invalid or unknown command
              Por lo que hay algo que me hace pensar que se ejecuta o aparece en consola y rompe al AGI.

              Chécalo bien. Es un error muy básico que no estamos alcanzando a percibir.

              Saludos,
              dCAP Christian Cabrera R.
              Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
              Si deseas asesoría pagada, por favor contáctame

              Comentario


              • #8
                tienes razón.

                ejecute lo siguiente,

                root@Asterisk:/var/lib/asterisk/agi-bin# php -q -e socket.php
                PHP Notice: Undefined index: PATH in /var/lib/asterisk/agi-bin/phpagi.php on li
                ne 1693

                root@Asterisk:/var/lib/asterisk/agi-bin#

                párese que es la libreria que esta rompiendo el vinculo.

                el archivo lo edite completamente en linux, con nano. inicialmente lo hice con dreamwiever por el editor que me gusta.

                Comentario


                • #9
                  ya lo resolvi.

                  #!/usr/bin/php -q

                  esta linea el problema. La cambie por la siguiente y ahora ya anda.

                  #!/usr/bin/php -c


                  Datos de mi Equipo con Asterisk
                  PHP Version 5.3.6-13ubuntu3.6
                  Asterisk 1.4.42
                  Linux Asterisk 3.0.0-16-generic-pae #29-Ubuntu SMP Tue Feb 14 13:56:31 UTC 2012 i686 i686 i386 GNU/Linux

                  Ya jalo.. ahora investigar el porque..

                  Comentario


                  • #10
                    Ok, creo que sé cual es el error:

                    La libreria PHPAGI contiene una función llamada Goto, el cual en versiones más recientes de Asterisk da problemas, por lo que lo resuelvo comentándola.

                    Abre el phpagi.php y busca
                    Código:
                    function goto { }
                    y comenta toda la función. Eso debe resolver el problema completamente.

                    Saludos,
                    dCAP Christian Cabrera R.
                    Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
                    Si deseas asesoría pagada, por favor contáctame

                    Comentario


                    • #11
                      Ya relice los cambios en PHPAGI, y cambio a php -q en el script php y no anda.

                      No he investigado aun porque no arranca el php desde asterisk de la forma avitual, parece que la clave esta en el uso del shebang en php.

                      Comentario


                      • #12
                        Versiones recientes del PHPAGI han compueste ese bug del GOTO ¿Estas usando la versión mas actual?

                        Comentario


                        • #13
                          Quedo resuelto por completo.

                          mi archivo .php lo renombre a .agi y ahora ya anda

                          mi código quedo de la siguiente forma. simula la cadena de datos que envía un CallerID (http://callerid.com/), la manda en el protocolo UDP, por lo que realice una aplicación en delphi con un componente de indi idUDPServer escuchando el puerto y recibo el array de datos que envió y que posteriormente proceso...


                          #!/usr/bin/php -q
                          <?php
                          include "phpagi.php";
                          $agi=new AGI();
                          $agi->verbose("Inicializando Socket");

                          $port=3520;
                          $fecha=date('m/d h:i A');
                          $callerid=$agi->request["agi_callerid"];
                          //Llenamos de espacios al final
                          $numero_discado=str_pad($argv[1],30,chr(0x20),STR_PAD_RIGHT);

                          //por cual troncal salio la llamada recibida por parametro
                          $PSTN=str_pad($argv[2],2,"0",STR_PAD_RIGHT);

                          $agi->verbose("PSTN=$PSTN");

                          $agi->verbose("Generando String Llamasa de salida: ");

                          //'^^<U>'#0#0#0#0#0#1'<S>'#$17#0#$11#9'&'#4'$02 I S 0000 G A0 03/01 11:14 AM 612-128-6686
                          //este es el string que recibo en delphi en AData

                          //Esta es la expresion regular que uitilizo para la cadena anterior '
                          //'(\d{2}) ([IO]) ([ES]) (\d{4}) ([GB]) ((.)(\d)) ((\d{2})\/(\d{2}) (\d{2})\d{2}) [aApP][mM]) (.{8,15})';
                          $broadcast_string="^^<U>".chr(0x00).chr(0x00).chr( 0x00).chr(0x00).chr(0x00).chr(0x01)."<S>".chr(0x17 ).chr(0x00).chr(0x11).chr(0x09)."&".chr(0x04)."$00 O S 0000 G A0 $fecha $numero_discado";

                          $agi->verbose("AData:[$broadcast_string]");

                          $agi->verbose("Inicializando Socket UDP");
                          $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

                          $agi->verbose("Aplicando Opcion Broadcast");
                          socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);

                          $agi->verbose("Enviando Broadcast String");
                          //envio los datos de la llamada a todos los clientes de mi aplicacion, en broadcast para que todas cachen la info
                          socket_sendto($sock, $broadcast_string, strlen($broadcast_string), 0, '255.255.255.255', $port);

                          $agi->verbose("Destrullendo Objetos");
                          socket_close($sock);

                          ?>

                          Comentario


                          • #14
                            Otro éxito más. Mucha suerte ;-)
                            dCAP Christian Cabrera R.
                            Para aprender a usar Asterisk, asiste a uno de mis cursos Asterisk
                            Si deseas asesoría pagada, por favor contáctame

                            Comentario


                            • #15
                              Este agi manda le callerId de una llamada entrante a una aplicacion externa hace eso

                              Comentario

                              Principales Usuarios Activos

                              Colapsar

                              No hay usuarios activos superiores.
                              Trabajando...
                              X