Cursos Asterisk en México

Encuesta telefonica con PHPAGI [problemas al capturar variables]

Colapsar

Anuncio

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

  • Encuesta telefonica con PHPAGI [problemas al capturar variables]

    Hola,
    ojalá alguien me pueda ayudar.
    Quiero hacer una de las encuestas en línea como la de los bancos (para análisis de servicio, etc.), cómo califique del 1 al 3 el servicio X... y luego llenar una base de datos, el problema lo tengo en que asterisk reconoce el DTMF pero no puedo capturar la variable.
    alguna idea?

    Saludos,
    Iván Carrasco Q.
    :-)

    --------
    root@Asterisk:/home/ivanx# sed "/;/d;/^$/d" /etc/asterisk/extensions_additional.conf
    [micontexto]
    exten => 999,1,Macro(survey)
    [macro-survey]
    exten => s,1,Noop(LLamada entrante a Encuestas)
    same => n,AGI(encuestas.php)
    ..

    (saqué la info que considero que no es importante)
    --------
    root@Asterisk:/home/ivanx# more /var/lib/asterisk/agi-bin/encuestas.php

    <?php
    set_time_limit(60);
    ob_implicit_flush(false);
    require("phpagi-2.20/phpagi.php");
    require("phpagi-2.20/mkdocs.php");

    $db = mysql_connect("10.0.0.1","encuestas","encuestas") or die ("Error: Conexion ");
    mysql_select_db("encuestas",$db) or die ("Error: Select DataBase");

    $agi = new AGI();
    $agi->answer();

    $cid = $agi->parse_callerid();
    $callerid = "llamada entrante de ".$cid[username];
    $agi->verbose($callerid);

    $agi->exec('playback','custom/pregunta1');
    $agi->verbose('ingresa opcion:');
    $agi->exec('Wait',1);

    // inicio : linea de codigo con conflicto



    $agi->exec('Read', 'preg1,beep,1,,1,3');
    $n = $agi->get_variable('preg1');
    $num = $n[result];
    $texto = "Numero ingresado: ".$num;
    $agi->verbose($texto);



    // fin : linea de codigo con conflicto

    $agi->verbose('fin');
    $agi->exec('playback','custom/3_gracias_converted');
    $agi->verbose('cuelga llamada');
    $agi->hangup();
    ?>
    ---------
    la consola asterisk -r me arroja:
    ...
    encuestas.php:
    -- AGI Script Executing Application: (Wait) Options: (1)
    encuestas.php: aun no contesta
    encuestas.php: ya toma la llamada
    encuestas.php: llamada entrante de 5552650100
    encuestas.php: ingrese su codigo:
    -- AGI Script Executing Application: (Wait) Options: (2)
    encuestas.php: inicio get data-----------------------------------
    -- AGI Script Executing Application: (Read) Options: (preg1,beep,1,,1,3)
    -- Accepting a maximum of 1 digits.
    -- <SIP/525544360008-00000056> Playing 'beep.gsm' (language 'es')
    -- User entered '1'
    [Sep 4 18:50:24] WARNING[10760][C-00000056]: file.c:701 ast_openstream_full: File preg1 does not exist in any format
    [Sep 4 18:50:24] WARNING[10760][C-00000056]: file.c:1017 ast_streamfile: Unable to open preg1 (format (ulaw)): No such file or directory
    encuestas.php: fin get data--------------------------------------
    encuestas.php: Numero ingresado:
    -- AGI Script Executing Application: (Wait) Options: (1)
    encuestas.php: EXEC Wait 1 returned -1
    encuestas.php: fin consulta
    --
    Iván Carrasco Quiroz
    Ing. Civil Electrónico, UTFSM - Chile
    DF, México

  • #2
    Hola Ivan, gusto en saludarte.

    Dos cosas:

    1. No uses Read dentro de un AGI. Para eso existe el método de $agi->get_data(), que ya te entrega todo en un mismo paso.

    2. El error que te da es porque el audio de preg1 no existe en la carpeta de sonidos. Asegúrate que se llama así y que está alcanzable dentro de los sonidos de Asterisk.

    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
      Hola, igualmente.

      el $agi->get_data() no me funciona (o no se usarlo), no me captura los datos, de la única manera que pude "capturar" en la consola de asterisk fue con el $agi->exec('Read', 'preg1,beep,1,,1,3');

      entiendo en el exec read:
      'preg1' es la variable donde almaceno los datos.
      'beep' sonido (/var/lib/asterisk/es/beep.gsm)


      el agi_data lo probé así: $result = $agi->get_data('beep', 6000,10); (lo vi por internet pero no me da tiempo de marcar y entregarle la variable).

      como te comentaba, el exec read en la única manera q lo visualizo por pantalla pero no puedo tomarlo.

      se te ocurre cómo puedo tomar la variable ingresada por dtmf?

      tampoco funcionó así:
      $agi->exec('Read', 'preg1,beep,1,,1,3');
      //probé con $preg1[data], $preg1[result], $preg1[1], etc
      $texto = "Numero ingresado: ".$preg1[0];
      $agi->verbose($texto0);


      De antemano,
      muchas gracias.
      Iván Carrasco Quiroz
      Editado por última vez por ivancarrascoq; https://asteriskmx.org/foros/member/1925-ivancarrascoq en 09-05-2013, 03:54 PM. Razón: más info
      --
      Iván Carrasco Quiroz
      Ing. Civil Electrónico, UTFSM - Chile
      DF, México

      Comentario


      • #4
        Segun tu comando de $result = $agi->get_data('beep', 6000,10); debe esperar 6 segundos antes de pasar a timeout y estás leyendo 10 dígitos por lo que es válido, haz un AGI debug o bien ejecutalo desde la consola de linux para ver cual puede el error.

        Comentario


        • #5
          Gracias por tu respuesta navaismo, acá el debug:

          encuestas.php
          ...
          $agi->verbose("inicio get data-----------------------------------");
          $result = $agi->get_data('beep', 6000,1);
          $agi->verbose("fin get data--------------------------------------");
          $texto0 = "Numero ingresado: ".$result;
          $agi->verbose($texto0);
          ...


          asterisk -r
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "ya toma la llamada" 1
          encuestas.php: ya toma la llamada
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "llamada entrante de " 1
          encuestas.php: llamada entrante de 5552650100
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "ingrese su codigo:" 1
          encuestas.php: ingrese su codigo:
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "inicio get data-----------------------------------" 1
          encuestas.php: inicio get data-----------------------------------
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << GET DATA beep 6000 1
          -- <SIP/525544360008-00000080> Playing 'beep.gsm' (language 'es')
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "fin get data--------------------------------------" 1
          encuestas.php: fin get data--------------------------------------
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "Numero ingresado: Array" 1
          encuestas.php: Numero ingresado: Array
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << EXEC Wait 1
          -- AGI Script Executing Application: (Wait) Options: (1)
          <SIP/525544360008-00000080>AGI Tx >> 200 result=0
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "fin consulta" 1
          encuestas.php: fin consulta
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          <SIP/525544360008-00000080>AGI Rx << VERBOSE "cuelga llamada" 1
          encuestas.php: cuelga llamada
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1
          [Sep 6 10:44:25] ERROR[15941][C-00000080]: utils.c:1252 ast_carefulwrite: write() returned error: Broken pipe
          <SIP/525544360008-00000080>AGI Rx << HANGUP
          <SIP/525544360008-00000080>AGI Tx >> 200 result=1


          Contesta la llamada y la cuelga después del 'beep', no me deja ingresar ningún dígito.
          Hasta ahora lo más cercano a recibir tonos DTMF es con exec('read'... pero no se como capturarla a una variable en el PHP.

          :S


          Saludos,
          Iván Carrasco Quiroz
          --
          Iván Carrasco Quiroz
          Ing. Civil Electrónico, UTFSM - Chile
          DF, México

          Comentario


          • #6
            Hola para poner el resultado en tu caso deberías usar:

            Código:
            $texto0 = "Numero ingresado: ".$result['result'];
            $agi->verbose($texto0);
            El GetData utiliza un arreglo para guardar el valor más info aquí: http://phpagi.sourceforge.net/phpagi....html#get_data

            Puedes pegar la salida cuando ejecutas el script desde consola(vas a tener que dar varios 'enters' si no falla el script) con el comando:
            Código:
            php encuesta.php
            PD: Solo estas leyendo un dígito verdad?

            Comentario


            • #7
              Iván,

              Como te indica navaismo, el get_data (y varios otros métodos de la clase PHPAGI) te regresan un arreglo.

              Como buena práctica te recomiendo que cada que quieras hacer un debug uses este comando para imprimir el resultado de lo capturado y veas lo que te decimos:

              Código:
              $result = $agi->get_data('beep',6000,1);
              $agi->verbose(print_r($result,1));
              De esta manera imprimes al CLI de Asterisk el contenido del arreglo completo, para que así no se te olvide limpiar y quedarse solamente con el subíndice que quieres.

              Resultó ser que SI ocupabas bien el get_data, lo que estaba mal era como utilizabas el valor de vuelta.
              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
                Muchas Gracias Christian y Navaismo,
                al final usé el get_data() e hice lo siguiente, lo que me funcionó perfecto.


                #!/usr/bin/php -q
                <?php
                error_reporting(0);
                set_time_limit(60);
                ob_implicit_flush(false);
                require("phpagi-2.20/phpagi.php");
                $agi = new AGI();
                $agi->answer();
                $agi->exec('Wait',1);
                // registro del telefono que llama
                $cid = $agi->parse_callerid();
                $callerid = "llamada entrante de ".$cid[username];
                $agi->verbose($callerid);
                // digite pin
                $pin = $agi->get_data('pin');
                $pin = $pin['result'];
                $agi->verbose('su pin es :'.$pin);
                //pregunta 1
                $resultado1 = $agi->get_data('preg1');
                $resultado1 = $resultado1['result'];
                $agi->verbose('usted ha ingresado pregunta 1: '.$resultado1);
                //pregunta 2
                $resultado2 = $agi->get_data('preg2');
                $resultado2 = $resultado2['result'];
                $agi->verbose('usted ha ingresado pregunta 2: '.$resultado2);
                //pregunta 3
                $resultado3 = $agi->get_data('preg3');
                $resultado3 = $resultado3['result'];
                $agi->verbose('usted ha ingresado pregunta 3: '.$resultado3);
                //pregunta 4
                $resultado4 = $agi->get_data('preg4');
                $resultado4 = $resultado4['result'];
                $agi->verbose('usted ha ingresado pregunta 4: '.$resultado4);
                // registro de hora y fecha
                $hoy = date('F j Y H:i:s');
                $agi->verbose('la encuesta se realizo a la hora y fecha: '.$hoy);
                //inserción en bbdd
                //...
                //
                $agi->hangup();
                ?>
                --
                Iván Carrasco Quiroz
                Ing. Civil Electrónico, UTFSM - Chile
                DF, México

                Comentario


                • #9
                  el agi_data lo probé así: $result = $agi->get_data('beep', 6000,10); (lo vi por internet pero no me da tiempo de marcar y entregarle la variable).

                  como te comentaba, el exec read en la única manera q lo visualizo por pantalla pero no puedo tomarlo.

                  se te ocurre cómo puedo tomar la variable ingresada por dtmf?


                  Pass4sure.com Microsoft MCSE: 70-412 70-414 70-462 70-980 70-247 70-496 Braindumps
                  Editado por última vez por blackrose; https://asteriskmx.org/foros/member/1965-blackrose en 01-18-2016, 02:29 AM.
                  a

                  Comentario

                  Principales Usuarios Activos

                  Colapsar

                  No hay usuarios activos superiores.
                  Trabajando...
                  X