Cursos Asterisk en México

[How-To] MySQL + AGI(PHP) (draft v1)

Colapsar

Anuncio

Colapsar
No hay anuncio todavía.
Este es un tema pegajoso.
X
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • [How-To] MySQL + AGI(PHP) (draft v1)

    Hoy, después de mucho batallar, logré hacer que jalara mi configuración deseada para poder tener a Asterisk comunicándose con MySQL a través de AGI, lo cual me da mucho poder y me permite hacer lo que quiera con los datos.

    Para los que no se han metido con AGI, la idea simple es que se trata de un intérprete de lenguajes que te permite pasar scripts en PHP, Perl, Python (y otros) a Asterisk para que ejecute comandos complicados que no podrían hacerse desde una simple extensión. La gran ventaja, es que si ya programas en alguno de estos lenguajes, implementarlo es cosa de niños, y teniendo la oportunidad de hacerlo en lo que más eres bueno, las características de lo que puedes hacer son prácticamente ilimitadas.

    La instalación que llevé a cabo fue con la intención de montar un IVR inteligente, que permite mediante una llamada introducir el número de usuario y contraseña, y con ello, regrese un dato (comunmente, un saldo). El IVR aún no está terminado, pero aquí les pongo los pasos de lo que tuve que hacer para llegar hasta donde me encuentro.

    Los supuestos del sistema actual son los siguientes:
    - Instalación de Linux basada en Red Hat (o Fedora Core)
    - Zaptel y Asterisk 1.0.2 instalados.

    Para lograr lo que necesitamos, necesitamos los siguientes paquetes. Favor de reemplazar la palabra VERSION por la versión actual correspondiente (y todas ellas se pueden buscar desde Google):
    - MySQL-server-VERSION.i386.rpm
    - MySQL-client-VERSION.i386.rpm
    - MySQL-devel-VERSION.i386.rpm
    - MySQL-shared-compat-VERSION.i386.rpm
    - php-VERSION.tar.gz
    - php-mysql-VERSION.rpm

    Al momento de escribir esto, la VERSION para MySQL era la 4.1.7-0, y para los archivos de PHP era la 4.3.3-6. Es importante que TODOS los archivos de MySQL tengan la misma versión, y lo mismo aplica con los de PHP entre ellos.

    Ahora bien, lo primero a instalar PHP. Dirígete al directorio donde se encuentre el .tar.gz y dale:
    Código:
    tar -zxf php-VERSION.tar.gz
    cd php-VERSION
    ./configure --enable=cli 
    make
    make install
    No te desesperes, que estos tardan algo de tiempo en compilarse.

    Ya de ahi lo demás viene fácil. Teclea los siguientes comandos:
    Código:
    rpm -ivh MySQL-server-VERSION.i386.rpm
    rpm -ivh MySQL-client-VERSION.i386.rpm
    rpm -ivh MySQL-devel-VERSION.i386.rpm
    rpm -ivh MySQL-shared-compat-VERSION.i386.rpm
    rpm -ivh php-mysql-VERSION.rpm
    Se supone que ahora ya tienes instalados todos los paquetes.

    [....]

    Continúo este post en otra ocasión. Por el momento, a los interesados vayan comenzando con esto.

    Pendientes por redactar:
    - Donde definir los AGIs
    - AGI de ejemplo usando PHP
    - Pasar parámetros desde Asterisk hacia el AGI
    - Query básico a MySQL
    - Regresando comandos a Asterisk usando AGI
    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

  • #2
    seria bueno agregar el phpMyAdmin para adminstrar las bases de datos, no?

    Comentario


    • #3
      Mis primeros pinitos con AGi. una vez que tenemos el entorno funcionando, ¿Qué hacemos? ¿Cómoo se depura un AGI?

      Por ejemplo estoy intentando programar un pequeño AGI que obtenga un PIN de la BBDD y lo compare con el que introduce el usuario, devuelve 0 si no permite pasar y 1 si es correcto.

      El archivo pin.php que se encuentra en /var/lib/asterisk/agi-bin y con permisos 777 (se que no es lo correcto pero por si las moscas)

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

      require "/var/lib/asterisk/agi-bin/phpagi/phpagi.php";

      $agi = new AGI();

      $agi->agi_exec("ANSWER");

      $CallerID=$agi->varglobal['agi_callerid'];
      $channel=$agi->varglobal['agi_channel'];
      $uniqueid=$agi->varglobal['agi_uniqueid'];
      $accountcode=$agi->varglobal['agi_accountcode'];
      $pin_src = $agi->varglobal['pin'];

      $user="root";
      $password="";
      $database="asterisk";
      mysql_connect(localhost,$user,$password);
      @mysql_select_db($database) or die( "Unable to select database");

      $query="SELECT pin FROM sipfriends WHERE username='$accoundcode'";
      $result = mysql_query($query);

      $num = mysq_numrows($result);
      $i = 0;
      while ($i < $num) {
      $pin = mysql_result($result, $i, 'pin');
      $i++;
      }

      mysql_close();

      $agi->set_variable('Valid', '0');
      if ( $pin == $pin_src ) {
      $agi->set_variable('Valid', '1');
      }
      ?>

      Pero la verdad es que el Asterisk se pasa esto y no hace nada

      ¿Cómo debería de ser la llamada desd extensions.conf?

      Comentario


      • #4
        para depurar lo más común es correr desde consola el agi y ver si no tiene problemas de sintaxis, por cierto te recomiendo hacer el answer fuera del agi siempre.

        Comentario


        • #5
          Yo estoy haciendo justamente algo similar pero no con AGI o PHP sino directamente desde extensiones usando los addons de asterisk y mysql.

          ahi les va

          exten => 5,1,Read(user,enteruser)
          exten => 5,2,NoOp(User: ${user})
          exten => 5,3,Read(password,enterpassword)
          exten => 5,4,NoOp(Password: ${password})
          exten => 5,5,MYSQL(Connect connid localhost root net721009 asterisk)
          exten => 5,6,MYSQL(Query resultid ${connid} SELECT\ id\ FROM\ demousers\ WHERE\ user=\'${user}\'\ and\ password
          =\'${password}\')
          exten => 5,7,MYSQL(Fetch foundRow ${resultid} id)
          exten => 5,8,GotoIf($["${foundRow}" = "1"]?13:9)
          exten => 5,9,Playback(vm-incorrect)
          exten => 5,10,MYSQL(Clear ${resultid})
          exten => 5,11,MYSQL(Disconnect ${connid})
          exten => 5,12,Goto(s,10)
          exten => 5,13,NoOp(ID: ${id})
          exten => 5,14,MYSQL(Clear ${resultid})
          exten => 5,15,MYSQL(Disconnect ${connid})
          exten => 5,16,Goto(intruder-demos,s,1)

          la idea es pedir un user y password a la llamda, comprar con mysql, si esta bien, proceder a un nuevo menu, sino, pues mandarlo a la..... /dev/null

          Comentario


          • #6
            Hola a todos:

            Mi pregunta va relacionada a la instalacion del MySql. Tengo un redhat 9. Me da errores al compilar el addons, para el mysql.

            Me podrian decir que sistema linux estan usando y que version?

            Gracias.

            Comentario


            • #7
              [How-To] MySQL + AGI(PHP) (draft v1)

              Originalmente publicado por Chris
              Continúo este post en otra ocasión. Por el momento, a los interesados vayan comenzando con esto.

              Pendientes por redactar:
              - Donde definir los AGIs
              - AGI de ejemplo usando PHP
              - Pasar parámetros desde Asterisk hacia el AGI
              - Query básico a MySQL
              - Regresando comandos a Asterisk usando AGI
              Has continuado este tema en otro lugar?,,,,perdona el despieste

              Saludos desde Argentina
              Oscar

              Comentario


              • #8
                Algo tarde pero aver

                Código:
                Mis primeros pinitos con AGi. una vez que tenemos el entorno funcionando, ¿Qué hacemos? ¿Cómoo se depura un AGI?
                
                Por ejemplo estoy intentando programar un pequeño AGI que obtenga un PIN de la BBDD y lo compare con el que introduce el usuario, devuelve 0 si no permite pasar y 1 si es correcto.
                
                El archivo pin.php que se encuentra en /var/lib/asterisk/agi-bin y con permisos 777 (se que no es lo correcto pero por si las moscas)
                
                #!/usr/bin/php -q
                <php
                
                require "/var/lib/asterisk/agi-bin/phpagi/phpagi.php";
                
                        $agi = new AGI();
                
                        $agi->agi_exec("ANSWER");
                
                        $CallerID=$agi->varglobal['agi_callerid'];
                        $channel=$agi->varglobal['agi_channel'];
                        $uniqueid=$agi->varglobal['agi_uniqueid'];
                        $accountcode=$agi->varglobal['agi_accountcode'];
                        $pin_src = $agi->varglobal['pin'];
                
                        $user="root";
                        $password="";
                        $database="asterisk";
                        mysql_connect(localhost,$user,$password);
                        @mysql_select_db($database) or die( "Unable to select database");
                
                        $query="SELECT pin FROM sipfriends WHERE username='$accoundcode'";
                        $result = mysql_query($query);
                
                        $num = mysq_numrows($result);
                        $i = 0;
                        while ($i < $num) {
                                $pin = mysql_result($result, $i, 'pin');
                                $i++;
                        }
                
                        mysql_close();
                
                        $agi->set_variable('Valid', '0');
                        if ( $pin == $pin_src ) {
                                $agi->set_variable('Valid', '1');
                        }
                ?>
                
                Pero la verdad es que el Asterisk se pasa esto y no hace nada :(
                
                ¿Cómo debería de ser la llamada desd extensions.conf
                El problema que veo de entrada en este codigo es que si vas
                a mover todo en agi hay que estar esperando los codigo desde agi
                es decir hay loops que esperan la captura del agi el php no va esperar a recibir algun dato de asterisk es un vil programa que se ejecuta y se muere al meterle tu answer no va detenerse a espera un prompt

                // Preguntamos la clave para ver los niveles de privilegios
                $result=$agi->get_data($digit_cap_msg, $digit_cap_time, digit_clave); // Captura de digitos

                En mi caso yo los capturo asi

                Claro esto ya tiene como dos años pero lo vi y me parecio interesante
                comentarlo

                Saludos.

                Comentario


                • #9
                  Algo tarde pero aver

                  Hola.

                  Yo tambien ando buscando conectar asterisk con mysql.

                  he provado el codigo que poneis en este post y no me va.

                  He intentado con esto.

                  exten => 8001,1,Answer
                  exten => 8001,2,SendText(Prueba de Texto)
                  exten => 8001,3,Wait(2)
                  exten => 8001,4,SendText(16 car max.)
                  exten => 8001,5,Wait(2)
                  exten => 8001,6,MYSQL(Connect conid localhost ht2 ht2 sugarcrm)
                  exten => 8001,7,MYSQL(Query resultid ${conid} SELECT\ id\ FROM\ contacts\ WHERE\ phone_home='${CALLERIDNUM}\'\)
                  exten => 8001,8,MYSQL(Fetch foundRow ${resultid} id)
                  exten => 8001,9,SendText(${id})
                  exten => 8001,10,MYSQL(Fetch fetchid ${resultid} first_name)
                  exten => 8001,11,SendText(${first_name})
                  exten => 8001,12,Wait(4)
                  exten => 8001,13,Hangup

                  La idea es identificar el numero que llama, consultar la base de datos de SOUGARCRM, y que me escriba en el terminal el nombre del contacto (mas adelante que salte una grabacion, diciendo "Bienvenido Fulanito" Donde fulanito es el nombre del cliente sacado de la base de datos y pasado por el FESTIVAL.

                  El caso que no me saca bien la consulta y cuando llega a la linea 6, no hace nada y luego se cuelga la llamada.

                  Nota: ht2 es tanto el nombre del usuario y la contraseña de un usuario con derechos SELECT en la BD del sougarcrm.

                  Alguna ayudita ?

                  Gracias.

                  Comentario

                  Principales Usuarios Activos

                  Colapsar

                  No hay usuarios activos superiores.
                  Trabajando...
                  X