envio de sms en linux

11 de junio de 2009

Una de las cosas chulas de Nagios es que puedes ir creando servicios de notificación para enviar mensajes por diferentes medios cuando un servicio cae. Lo normal es hacer que Nagios te envíe un mail cuando un disco se llene, cuando una impresora deje de funcionar o cuando el ancho de banda de un router esté al 80%.
Otra forma curiosa de enviar notificaciones es enviar todas estas a Twitter. Simplemente echando un vistazo a tú Twitter puedes ver que está pasando con tus servidores... ¿arriesgado?.

Lo más efectivo es el envio de SMS a tú móvil en caso de que un servicio importante deje de funcionar. El uso de la notificación por correo (o el Twitter) solo funciona si tú conexión a Internet está funcionando. ¿Que pasa si monitorizas tú conexión a Internet y esta ha caído?.
Para ello he rebuscado y rebuscado entre todos lo móviles de la empresa hasta encontrar uno con conexión USB y sobre todo que sea capaz de cargarse la batería también por el mismo cable USB... al final encontré uno muy chulo: un Motorola V3.

Lo primero que tenemos que hacer es verificar si es capaz de detectar el móvil. Para ello lanzamos un lsusb (todos los resultados están bajo un Fedora 7):

[root@server ~]# lsusb
Bus 001 Device 001: ID 0000:0000
Bus 004 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 003 Device 007: ID 22b8:4902 Motorola PCS E398 GSM Phone
Bus 003 Device 001: ID 0000:0000

Como resultado también obtendremos un nuevo dispositivo mapeado en /dev/ttyACM0. Un dispositivo ttyACM identifica a un módem USB, y como tal módem es capaz de ser atacado vía comandos AT. Los comandos AT son cadenas de texto que nos permiten interactuar con cualquier módem para inicializarlo, marcar un número, transferir un fichero o colgar una llamada. Los móviles son modems GSM y, por tanto, también acepta comandos AT.

Los comandos AT que debemos enviar para que el móvil envie un SMS son los siguientes:
AT+CMGF=1 (le dice al módem que enviamos los SMS en formato texto).
AT+CSCA="+34607003110" (le decimos que el número del centro de mensajes es el 
                        +34607003110)
AT+CMGS="696342572" (le decimos el número donde debe enviar el SMS)
> Hola caracola <Ctrl+Z> (escribimos el mensaje y lanzamos un Ctrl+Z).

Lo único que necesitamos saber es el número del centro de mensajes SMS de nuestra operadora. En mi caso el SIM de la tarjeta es Vodafone y el centro de mensajes es el +34607003110. Esta información la puedes encontrar dentro de la configuración del móvil o te la puede dar la operadora.

Una vez sabemos como funciona todo, podemos crear un script en Perl que nos permita hacer todo esto en una simple línea de comandos.

#!/usr/bin/perl

$_SMS_CM="+34607003110";
$_SMS_MODEM="/dev/ttyACM0";

if ($#ARGV != 1 ) {
   print "sendsms.pl v0.1b, por amperis[@]gmail.com\n\n";
   print "Uso:\n";
   print "   ./sendsms.php <numero destino> \"<mensaje>\"\n\n";
   exit;
}

use Device::Modem;

my $modem = new Device::Modem( port => $_SMS_MODEM );

if ( $modem->connect( baudrate => 115200 ) ) {
   $modem->echo(1);
   $modem->verbose(1);

   $modem->atsend( 'AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0'.Device::Modem::CR);
   print $modem->answer()."\n";

   $modem->atsend( 'AT+CMGF=1'.Device::Modem::CR);
   print $modem->answer()."\n";

   $modem->atsend( 'AT+CSCA="' . $_SMS_CM. '"'.Device::Modem::CR);
   print $modem->answer()."\n";

   $modem->atsend( 'AT+CMGS="' .$ARGV[0]. '"'.Device::Modem::CR);
   print $modem->answer()."\n";

   $modem->atsend( $ARGV[1].chr(26));
   print $ARGV[1]."\n\n";

   print "\nFin de la conexion.\n\n";


} else {
   print "ERROR: No encuentro el modem.\n";
}

Nota: Tenemos que tener instalado en Perl el paquete Device::Modem. Para instalar paquetes en Perl hacemos un "perl -e shell -MCPAN" y luego haremos un ">install Device:Modem".

Ahora solo queda dar permisos de ejecución al script (chmod +x sendsms.pl) y ejecutarlo:
# ./sendsms.pl 696342572 "Error a las 19:35h. Router Cisco 877 sin conexión"

Más información:
+ Using AT commands to Send and Receive SMS

5 comentarios:

Steve dijo...

Justo lo que necesitava!!

cejodrake dijo...

me imagino que el cel tiene q t ener saldo para enviar el mensaje o tiene q ser un celular con linea directa

pakistani dijo...

yeah its a very useful method and good thing is to work with AT commands. I just love it.There are certain AT commands that even does not require the number of SMS message center. credit cards...

Martinez dijo...

Amperis, gracias y felicitaciones. Buen año para vos!

omar marcelo dijo...

He probado el script y no me hada dado resultado, sin embargo he comprabado que puedo mandar la orden para que envie sms a travez de minicom usando el siguiente script
------------------------
send “AT+CMGF=1″
expect {
“OK”
}
sleep 1
send “AT+CMGS=\”8001232222\”"
expect {
“>”
}
sleep 1
send “Aqui va el texto a enviar ^z”
exit
-------------------------

¿cual puede ser la falla?