Aviso por SMS de nuevo voicemail

Usaremos el envío de SMS para que cuando la persona que nos ha llamado
acceda al voicemail, además de enviarnos el correo de voz, nos notifique a nuestro móvil mediante un aviso por SMS.

"Asterisk: Tiene una llamada perdida de (callerid) el (dia) de (mes) (hora)"

Gracias a la clase de java EnviaSMS de Ivan López, podemos enviar alertas SMS a nuestro móvil usando el API de Google. Para ello debemos asociar nuestro móvil a nuestra cuenta de Google Calendar.

Una vez hecho esto descargamos en nuestro directorio home la clase para enviar SMS:

cd $HOME
wget http://bytecoders.homelinux.com/files/descargas/SMSGoogle.tar.gz
tar -xzvf SMSGoogle.tar.gz
cd SMSGoogle/

Modificaremos el archivo enviaSMS.sh para que la siguiente línea apunte a nuestro directorio donde tenemos la aplicación:

# Substituir por el directorio de nuestro usuario
SMS_HOME=/home/pep/SMSGoogle

Creamos un script AGI en /var/lib/asterisk/agi-bin/sms_send.php que tomara el CallerID y nos enviara el mensaje de texto avisando de la llamada en el Voicemail (modificar usuario, password y el path a la aplicación de envío SMS):

#!/usr/bin/php -q
<?php
    // Version 0.1 18-Nov-2007
    // J.A. Torres
    // http://bytecoders.homelinux.com
    // ------------
    // Configuracion de Google Calendar
    // ------------
    $usr="usuario@gmail.com";      // Usuario
    $pwd="password_google";         // Password
 
    // Cambiar por el directorio de instalación
    $sms_tool_path="/home/pep/SMSGoogle";
 
    // Opciones de depuracion:
    // Si tienes problemas revisa el archivo de log
    $parm_error_log = '/tmp/wakeup.log';
 
    // Poner a true si queremos habilitar la depuración
    $parm_debug_on = false;
 
 
    GLOBAL      $stdin, $stdout, $stdlog, $result, $parm_debug_on, $parm_test_mode;
 
    // Settings de la WIKI http://www.voip-info.org
    ob_implicit_flush(false);
    set_time_limit(30);
    error_reporting(0);
 
    $stdin = fopen( 'php://stdin', 'r' );
    $stdout = fopen( 'php://stdout', 'w' );
 
    // Se escribe log en modo depuracion
    if ($parm_debug_on)
    {
        $stdlog = fopen( $parm_error_log, 'w' );
        fputs( $stdlog, "---Start---\n" );
    }
 
 
    // Poner en un array todas las variables que manda Asterisk
    // http://www.voip-info.org/tiki-index.php?page=Asterisk%20AGI%20php
    while ( !feof($stdin) ) 
    {
        $temp = fgets( $stdin );
 
        if ($parm_debug_on)
            fputs( $stdlog, $temp );
 
        // Strip off any new-line characters
        $temp = str_replace( "\n", "", $temp );
 
        $s = explode( ":", $temp );
        $agivar[$s[0]] = trim( $s[1] );
        if ( ( $temp == "") || ($temp == "\n") )
        {
            break;
        }
    } 
 
    // Obtenemos el Caller ID
    $callerid = $agivar['agi_callerid'];
 
    // Mandamos el mensaje usando el API de Google
    $msg="'Asterisk: Tiene una llamada perdida de $callerid'";
    $cmd = "$sms_tool_path/enviaSMS.sh $usr $pwd $msg &";
    $p = popen($cmd, 'r');
    if ($parm_debug_on)
    {
        $stdlog = fopen( $parm_error_log, 'w' );
        fputs( $stdlog, "Mensaje enviado: ".$msg );
        fputs( $stdlog, "Enviado: ".$p );
    }
?>

Le damos permisos a Asterisk para que acceda al envio de SMS y al fichero AGI:

sudo chown -R asterisk:asterisk $HOME/SMSGoogle
sudo chmod +x /var/lib/asterisk/agi-bin/sms_send.php
sudo chown asterisk:asterisk /var/lib/asterisk/agi-bin/sms_send.php

Si no usáis freePBX en el paso siguiente (ir al grano en vuestra configuración de voicemail)Wink, si por el contrario estamos usando freePBX necesitamos crear un fichero de override para las extensiones, así cuando modifiquemos la configuración desde freePBX no nos machacará estos cambios:

cd /etc/asterisk
cp extensions.conf extensions_override_freepbx.conf

Si usamos freePBX en el fichero extensions_override_freepbx.conf nos iremos al contexto [macro-get-vmcontext] y lo dejaremos tal que así:

; get the voicemail context for the user in ARG1
[macro-get-vmcontext]
exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
exten => s,2,GotoIf($["foo${VMCONTEXT}" = "foo"]?200:300)
exten => s,200,Set(VMCONTEXT=default)
; Send SMS using Google API
exten => s,300,NoOp("Voice Mail SMS alert")
exten => s,301,agi,sms_send.php

Recargamos Asterisk y listo:

sudo asterisk -rx reload

Espero que os haya sido útil.

Agradecimientos a Ivan López por el envío de SMS. Smile

Comentarios

Cómo enviar sms sólo de una extensión

Ante todo muchas gracias por tu código. Lo he probado y funciona correctamente. Aunque tengo una duda, que he intentado resolver, pero no he sido capaz.

Los SMS se envían de los buzones todas las extensiones, cómo puedo hacer para que sólo me envíe el aviso de una extensión en concreto?

No tengo mucha idea de java, y en las pruebas que he hecho, he conseguido que me mande de una extensión, pero no deja de enviarme mensajes.

A ver si alguien puede ayudarme, por favor.

Gracias y saludos

Tan solo unas pequeñas modificaciones

Hola Yaluki, el código java no hace falta que lo modifiques. Tán solo hay que hacer unos pequeños cambios en la configuración de Asterisk que había propuesto. Por ejemplo, si quieres recibir solo el voicemail de la extensión 4444, este sería un ejemplo:

; get the voicemail context for the user in ARG1
[macro-get-vmcontext]
exten => s,1,Set(VMCONTEXT=${DB(AMPUSER/${ARG1}/voicemail)})
exten => s,2,GotoIf($["foo${VMCONTEXT}" = "foo"]?200:300)
exten => s,200,Set(VMCONTEXT=default)
; Send SMS using Google API
exten => s,300,NoOp("Voice Mail SMS alert")
exten => s,301,GotoIf($["${EXTEN}" = "4444"]?302:305)
exten => s,302,NoOp("Extension 4444: Enviando mensaje")
exten => s,303,agi,sms_send.php
exten => s,304,Goto(s,306)                         # Va a la ultima linea
exten => s,305,NoOp("No se envia mensaje")
exten => s,306,NoOp("Voicemail SMS alert, listo")

Básicamente se trata de un GotoIf que comprueba que la variable extensión coincida con la que tu quieres, y continua en la línea que le indiques, si coincide con la extensión la 302 si no es la extensión pasa a la 305.

Tienes más ejemplos con GotoIf, y las variables de canal en Voip-Info.

Saludos.

Una corrección en el código

Muchas gracias por tu pronta respuesta. He probado las modificaciones que me proponías, pero no funciona.

Revisando el código, he modificado la línea del goto siguiente para que busque si ARG1 se corresponde con la extensión dada, y bingo!, ahora sí que funciona.

Esta es la línea que habría que modificar, cambiar ${EXTEN} por ${ARG1}

exten=>s,301,GotoIf($["${EXTEN}" = "4444"]?302:305)

He probado y funciona perfectamente.

Gracias por todo, saludos.

Gracias por la corrección

Gracias a tí también por haberte tomado la molestia de arreglar el trozo de código, seguro que le puede ser de utilidad a más de uno que caiga por aquí.

Por lo menos ahora lo tenemos comprobado y ya funciona, encantado de que el artículo te haya resultado útil. Smile

Saludos.

esto esta cool lastima que

esto esta cool lastima que no salgo en la lista de paises soportados por google calendar - sms , ivan se tiro un home run ... buen articulo bytecoder

La verdad es que está muy bien

Ciertamente es que Ivan se lo ha currado y lo ha puesto al alcance de todo el mundo. Sabiendo lo que cuesta hacer las cosas, es todo un detalle la verdad.

Como molan las licencias Creative Commons! Smile

A ver si con un poco de suerte esto de los SMS de Google se amplía a otros países y podéis echar mano de la aplicación.

si de hecho esta cool lo

si de hecho esta cool lo mejor de todo que con ASTERISK , bueno te escribo otro post en un articulo que mire en tu website

 

saludoss desde nicaragua

 

Gracias por tus opiniones

Gracias por tus comentarios, si no fuera por ellos no tendría sentido este blog.

Lo mejor de poder compartir esto es saber que hay alguien a quien le interesa y esto es lo que me anima a escribir.

Saludos desde España Smile