20 diciembre, 2013

Enviar SMS con Python y la libreria PySerial

Mandar un SMS con Python

Mandar un SMS con Python

Algunos módem usb permiten recibir ordenes mediante comandos AT, con estos comandos podemos hacer muchas cosas. Hace años, muchos años, estos comandos los utilizábamos para configurar centralitas, realizar llamadas, obtener información del aparato, etc. Ahora esta técnica esta en desuso, pero aun así, algunos módems están preparados todavía para poderse programar con estos comandos.

Aprovechando la librería PySerial y python he creado un programa para cuando lee ciertos valores desde el arduino me los mande por SMS a mi móvil.

Para empezar con el programa tenemos que saber cual es el puerto serie del módem, en mi caso cuando pincho el módem usb al ordenador me crea tres puertos /dev/ttyUSB0, /dev/ttyUSB1 y /dev/ttyUSB2, para windows no tengo ni idea que hace.

Una vez que sabemos los puertos del módem, tenemos que saber cual de ellos es el que responde a los comandos AT. Para saber que puerto responde a los comandos hice este programa

#!/usr/bin/env python

import serial

sSerie = serial.Serial('/dev/ttyUSB0', 9600)
#sSerie.open()
try:
    sSerie.write("AT\r\n")
    print sSerie.readline()
    print sSerie.readline()

except ValueError:
    print "Oops!  se ha producido un error ..."

#sSerie.close()

Con este programa, lo que hacemos es abrir el puerto correspondiente, y le enviamos el comando «AT». Si el módem sabe que es lo que le estoy enviando nos devolverá «OK», en caso contrario «ERRROR», o saltara la excepción del programa.

También lo podemos probar con un programa de terminal, como el «Serial port Terminal» o el «minicom» en Linux, o con el «Hiperterminal» en windows. Solo tenemos que abrir el puerto a probar y escribir «AT» y esperar la respuesta

Así con todos los puertos disponibles, en mi caso me admitió peticiones por los puertos /dev/ttyUSB1 y /dev/ttyUSB2.

Una vez que sabes el puerto, podes probar ha enviar un SMS de la siguiente forma.

#!/usr/bin/env python

import serial
# para enviar el Ctrl-Z
from curses import ascii

sSerie = serial.Serial('/dev/ttyUSB2', 9600)
#sSerie.open()
try:
    # Enviamos un reset al modem
    sSerie.write("ATZ\r\n") 
    # Le ponemos en modo para SMS
    sSerie.write("AT+CMGF=1\r\n") 
    # Le pasamos el numero al que vamos ha mandar el SMS
    sSerie.write("AT+CMGS=\"123456789\"\r\n"); 
    # Texto del mensaje terminado en Ctrl+Z
    sSerie.write("Esto es un mensaje" + ascii.ctrl('z')) 
    # Leemos la informacion devuelta
    print sSerie.readline() 
    # Leemos la informacion devuelta
    print sSerie.readline() 
    # Leemos la informacion devuelta
    print sSerie.readline() 

except ValueError:
    print "Oops! se ha producido un error ..."

#sSerie.close()

Y con esto ya podemos mandar SMS desde python, esta un poco chapucero, pero para lo hace y lo que he tardado en el, sobra la mitad.

Ya solo nos queda leer los datos del arduino y mandar el SMS.