You are here

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.net/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.net
    // ------------
    // 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

Asterisk: 
Qué te parece: 

Comments

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

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 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 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

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

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.

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 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.

Buenas la verdad esq me nubla el codigo que genera FreePBX me podriais orientar sobre la configuracion del extensions.conf y el voicemail.conf en un Asterisk 1.4 sin FreePBX.

Gracias.

Muy bueno el articulo, estoy probandolo y funciona muy bien, pero tenia un par de preguntas.

cada vez que me llega un mensaje al voicemail me manda 3 sms seguidos a mi movil, alguna idea xe porque podria ser?

y otra cosa, en el mensaje que me llega, no me llega el callerid me dice:

nuevo mensaje de @ Tue Jun 16 1:20 -1:21pm(email)

Alguna idea??

gracias

Hola javivi,

Esto de los 3 mensajes es un poco raro, no sé si ejecuta 3 veces el código o es cosa del Google Calendar. Puedes probar a ejecutar directamente una prueba de mensaje y comprobar cuantos te llegan para descartar una cosa u otra.


enviaSMS.sh [usuario] [password] 'Prueba de mensaje'

Lo del callerid es otra cosa, comprueba que tengas bien configurado el AGI, no entiendo porque no te coge las variables correctamente, esto igual cambia en las nuevas versiones de Asterisk.

He visto que el código en (http://www.voip-info.org/tiki-index.php?page=Asterisk%20AGI%20php) ha cambiado así que podrías probar a sustituir esto:


// 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'];

Por el nuevo código:


// Poner en un array todas las variables que manda Asterisk
// http://www.voip-info.org/tiki-index.php?page=Asterisk%20AGI%20php

$agivars = array();
while (!feof(STDIN)) {
$agivar = trim(fgets(STDIN));
if ($agivar === '') {
break;
}
$agivar = explode(':', $agivar);
$agivars[$agivar[0]] = trim($agivar[1]);
}
extract($agivars);

// Obtenemos el Caller ID
$callerid = $agi_callerid;

Por probar no se pierde nada.

Saludos

Buenas, no se si llegareis a contestar a que veo que desde Junio nadie comenta aqui, he probado en mi centralita Asterisk esto que comenta aqui y aunq parece que todo va bien no llego a recibir ningun SMS.

Comento lo que he hecho y pongo aqui el codigo aver si podeis ayudarme:

1)Tengo 2 calendarios ,como no sabia como delimitar en que calendario debe fijarse habilite en ambos el aviso por SMS desde Google Calendar.

2)Modifique la ruta en el archivo enviarSMS.sh.
3)Cree el archivo sms_send.php ,lo guarde en var/lib/asterisk/agi-bin/:

#!/usr/bin/php -q

// ------------
// Configuracion de Google Calendar
// ------------
$usr="davidin073@gmail.com"; // Usuario
$pwd="xxxxxxxx"; // Password

// Cambiar por el directorio de instalaci�n
$sms_tool_path="/usr/src/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 = true;

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
$agivars = array();
while (!feof(STDIN)) {
$agivar = trim(fgets(STDIN));
if ($agivar === '') {
break;ARG1
}
$agivar = explode(':', $agivar);
$agivars[$agivar[0]] = trim($agivar[1]);
}
extract($agivars);

// Obtenemos el Caller ID
$callerid = $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 );
}
?>

4) Modifique el extensions.conf :

[incoming]

; Send SMS using Google API
exten => 1200,1,NoOp("Voice Mail SMS alert")
exten => 1200,n,GotoIf($["${EXTEN}" = "1200"]?100:200)
exten => 1200,100,NoOp("Extension 1200: Enviando mensaje")
exten => 1200,n,AGI(sms_send.php)
exten => 1200,n,NoOp("Voicemail SMS alert, listo")
exten => 1200,n,Hangup
exten => 1200,200,NoOp("No se envia mensaje")
exten => 1200,n,Hangup

La idea era que al yo hacer una perdida a esa extension desde la 100 me llegase un SMS al movil dicendomelo.

5) En el CLI lo que aparce es lo siguiente:

-- Executing [1200@from-internal:1] NoOp("SIP/103-b7c0cd40", ""Voice Mail SMS alert"") in new stack
-- Executing [1200@from-internal:2] GotoIf("SIP/103-b7c0cd40", "1?100:200") in new stack
-- Goto (from-internal,1200,100)
-- Executing [1200@from-internal:100] NoOp("SIP/103-b7c0cd40", ""Extension 103: Enviando mensaje"") in new stack
-- Executing [1200@from-internal:101] AGI("SIP/103-b7c0cd40", "sms_send.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php
-- AGI Script sms_send.php completed, returning 0
-- Executing [1200@from-internal:102] NoOp("SIP/103-b7c0cd40", ""Voicemail SMS alert| listo"") in new stack
-- Executing [1200@from-internal:103] Hangup("SIP/103-b7c0cd40", "") in new stack
== Spawn extension (from-internal, 1200, 103) exited non-zero on 'SIP/103-b7c0cd40'

6)Como active la depuracion miro el contenido de fichero temporal waleup.log:

Mensaje enviado: 'Asterisk: Tiene una llamada perdida de 100'Enviado: Resource id #8

A pesar de hacer numerosas llamadas con la extension 100 y otras tantas con la 103 ,solo puso esa linea ,creo que fue de la primera perdia que hize.

Gracias.

Buenas,
nose si llegareis a contestarme puesto que no se ha comentado nada desde Junio,
intentando hacer lo que indica este articulo puesto que m parecio bastante interesante hay conceptos que no entiendo, ¿como se sabe que calendario de Google mira para habilitar en ese el envio de sms?o ¿Como se realiza el envio a traves del voicemail?.

No utilizo FreePBX lo que a dificultado un poco esto.

Comento lo que he hecho y pongo aqui el codigo aver si podeis ayudarme:

1)Tengo 2 calendarios en Google Calendar,como no sabia como delimitar
en que calendario debe fijarse habilite en ambos el aviso por SMS
desde Google Calendar.

2)Modifique la ruta en el archivo enviarSMS.sh.( /usr/src/SMSGoogle )
3)Cree el archivo sms_send.php ,lo guarde en var/lib/asterisk/agi-
bin/:

#!/usr/bin/php -q

// ------------
// Configuracion de Google Calendar
// ------------
$usr="davidin073@gmail.com"; // Usuario
$pwd="xxxxxxxx"; // Password

// Cambiar por el directorio de instalaci�n
$sms_tool_path="/usr/src/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 = true;

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
$agivars = array();
while (!feof(STDIN)) {
$agivar = trim(fgets(STDIN));
if ($agivar === '') {
break;ARG1
}
$agivar = explode(':', $agivar);
$agivars[$agivar[0]] = trim($agivar[1]);
}
extract($agivars);

// Obtenemos el Caller ID
$callerid = $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 );
}
?>

4) Modifique el extensions.conf :

[incoming]

; Send SMS using Google API
exten => 1200,1,NoOp("Voice Mail SMS alert")
exten => 1200,n,GotoIf($["${EXTEN}" = "1200"]?100:200)
exten => 1200,100,NoOp("Extension 1200: Enviando mensaje")
exten => 1200,n,AGI(sms_send.php)
exten => 1200,n,NoOp("Voicemail SMS alert, listo")
exten => 1200,n,Hangup
exten => 1200,200,NoOp("No se envia mensaje")
exten => 1200,n,Hangup

La idea era que al yo hacer una perdida a esa extension desde la 100
me llegase un SMS al movil dicendomelo.

5) En el CLI lo que aparce es lo siguiente:

-- Executing [1200@from-internal:1] NoOp("SIP/103-b7c0cd40", ""Voice
Mail SMS alert"") in new stack
-- Executing [1200@from-internal:2] GotoIf("SIP/103-b7c0cd40", "1?
100:200") in new stack
-- Goto (from-internal,1200,100)
-- Executing [1200@from-internal:100] NoOp("SIP/103-b7c0cd40",
""Extension 103: Enviando mensaje"") in new stack
-- Executing [1200@from-internal:101] AGI("SIP/103-b7c0cd40",
"sms_send.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/sms_send.php
-- AGI Script sms_send.php completed, returning 0
-- Executing [1200@from-internal:102] NoOp("SIP/103-b7c0cd40",
""Voicemail SMS alert| listo"") in new stack
-- Executing [1200@from-internal:103] Hangup("SIP/103-b7c0cd40",
"") in new stack
== Spawn extension (from-internal, 1200, 103) exited non-zero on
'SIP/103-b7c0cd40'

6)Como active la depuracion miro el contenido de fichero temporal
waleup.log:

Mensaje enviado: 'Asterisk: Tiene una llamada perdida de 100'Enviado:
Resource id #8

A pesar de hacer numerosas llamadas con la extension 100 y otras
tantas con la 103 ,solo puso esa linea ,creo que fue de la primera
perdia que hize.

Gracias