Python Ejemplar
Python Ejemplar
Python Ejemplar
Si su Raspberry Pi necesita comunicarse con el mundo exterior cuando no está dentro del
alcance de un punto de acceso WiFi, se puede usar una red celular digital. Al igual que con los
teléfonos móviles, necesita una tarjeta SIM y una suscripción de cualquier proveedor. En la
mayoría de las aplicaciones, solo se necesita la transmisión de datos o SMS con poco volumen
de datos y baja velocidad de transferencia, por lo que puede comprar una tarjeta SIM barata
de "solo datos".
En el lado del hardware, necesita un módulo GSM, también llamado módem GSM, que se pueda
conectar con la Raspberry Pi. La mayoría de los módems utilizan un enlace de comunicación
serial (RS-232) y el buen conjunto de comandos de Hayes (extendido) con el prefijo "AT". Este
capítulo se basa en el chip SIM800 que es muy versátil y está disponible en varios módulos. Ya
que necesita una fuente de alimentación de 4.3V, verifique que la placa incluya un regulador de
voltaje, de modo que pueda alimentarse con una fuente de alimentación externa de 5V USB.
Observaciones: debe eliminar el bloqueo de la tarjeta SIM antes de poder usarlo en el módem. Para hacerlo, inserte la
tarjeta SIM en cualquier teléfono inteligente que tenga a mano y aplique la opción de configuración específica para la
eliminación del bloqueo de la tarjeta SIM (que se encuentra principalmente en "Seguridad de la tarjeta SIM"). También
puede pedirle a su operador de red que lo haga por usted. Compruebe que el teléfono inteligente se inicia sin pedir más el
código.
Objetivo:
convertir tu Raspberry Pi en un mayordomo SMS que devuelve un SMS con información de
estado cada vez que se recibe un SMS. (El mayordomo se podría expandir para realizar algunas
acciones útiles cuando se recibe un SMS, por ejemplo, para encender / apagar el calentador en
una residencia de invierno desocupada remota e informar la temperatura actual de la
habitación).
Puede usar un terminal PuTTY para jugar con los comandos SMS manualmente. Haz lo
siguiente:
Comando (termina con <cr>) Responder: Significado
AT + CMGF = 1 OK: configura el modem en modo texto
AT + CMGS = "+ 41764331357" >: Prepárate para enviar a un número de teléfono dado
¡Que tengas un buen día! <^ Z> OK: enviar texto y terminar con Ctrl + Z
Tercer SMS entrante + CMTL: "SM", 3
AT + CMGR = 3 Mostrar contenido de SMS # 3
AT + CMGDA = "DEL ALL" Borrar todos los SMS
Si la Raspberry Pi recibe un SMS que contiene el texto "getStatus", envía un SMS con la marca
de tiempo actual y el estado de GPIO pin # 24 a un número de teléfono determinado.
Programa: [►]
Programa:
# SIMSMS1.py
Observaciones:
tenga en cuenta que debe esperar un momento la respuesta del módem antes de recuperar el
contenido del búfer del receptor con ser.read () .
El servidor debe hacerse visible desde Internet como se describe anteriormente, ya sea utilizando la
dirección IP punteada del enrutador o el alias IP proporcionado por no-ip.
Objetivo:
ejecutar un servidor de socket simple en una PC que escucha en el puerto 22000 que solo muestra los
mensajes de estado en una consola. Intente configurar su enrutador para que el servidor sea visible
desde cualquier lugar de Internet.
Programa: [►]
# DataServer3.py
IP_PORT = 22000
El módem implementa una multitud de comandos AT . Al estudiar el siguiente ejemplo, aprenderá a usar
el módem como un cliente TCP. (Más información sobre cómo usar TCP el modo se encuentra aquí .)
Como se muestra arriba, se recomienda instalar un emulador de terminal como PuTTY que use con una
pantalla adjunta o un acceso VPN. Luego, prueba los comandos AT manualmente antes de
implementarlos en un programa.
Después de iniciar el tipo de emulador AT <cr> para verificar si el módem responde correctamente.
Luego escribe otros comandos AT que toma de la documentación del conjunto de comandos (use ^ H
para eliminar una entrada de caracteres incorrecta). Para iniciar una conexión a Internet, los siguientes
comandos pueden ayudar:
Debido a que somos demasiado perezosos para escribir todas estas líneas crípticas a mano, escribimos
un programa Python que envía los comandos y verifica la información de respuesta.
Se debe prestar atención a que su programa y PuTTY no estén accediendo al módem al mismo tiempo, porque PuTTY traga las
respuestas del módem. Pero a veces es conveniente ver en la ventana de la terminal lo que envía su programa y el mensaje de correo
electrónico que se encuentra en el terminal, fue el programa de envío.
Una clase SIM800Modem sería una mejor opción, depende de usted definirla.
Para obtener la respuesta del módem, verificamos con n = ser.inWaiting () el número de caracteres
que esperan en el búfer de respuesta y los recuperamos todos junto con ser.read (n) , donde ser es
la instancia del puerto serie devuelta cuando el puerto serie Se abre con serial.Serial ()
Programa: [►]
# SIM800Modem.py
VERBOSE = Falso
P_POWER = 11 # Power pin
P_RESET = 12 # Reset pin
# Activando la red
cmd = "AT + CIICR \ r"
debug ( "Cmd:" + cmd)
ser.write (cmd)
time.sleep (5)
# Obtener la dirección IP
cmd = "AT + CIFSR \ r"
debug ( "Cmd:" + cmd)
ser.write (cmd)
time.sleep (3)
Observaciones:
Como ve, se necesita bastante conocimiento y experiencias prácticas para escribir estas líneas de
código. Es importante tener en cuenta que los retrasos adecuados entre varias acciones son necesarios,
ya que el programa es muy rápido y debe esperar hasta que el módem o la red GSM cumplan con el
comando. Pero esta es una codificación peligrosa porque los retrasos de tiempo requeridos pueden
variar dependiendo de retardos imprevisibles. Una mejor solución sería permanecer en un bucle hasta
que el módem responda con un mensaje de éxito.
Existe otra posible mejora: cuando un comando informa un error o un tiempo de espera, no se debe
abandonar completamente la acción completa, sino que se debe intentar nuevamente. Estas mejoras
hacen explotar el código considerablemente y, por lo tanto, no se consideran aquí.
Puede establecer el indicador VERBOSE = True para obtener una gran cantidad de mensajes de
depuración que le ayudan a depurar el código.
Objetivo:
utilizando el código del módulo anterior, escriba un cliente que se conecte mediante GSM a un servidor
remoto y envíe información del sensor (aquí solo el estado de un botón) aproximadamente cada 5
segundos.
Programa: [►]
# SIMClient.py
importar serie
importación tiempo, sys
de SIM800Modem importación *
importación RPi.GPIO como GPIO
APN = "gprs.swisscom.ch"
#HOST = "5.149.19.125"
HOST = "raspibrick.zapto.org"
PUERTO = 5000
SERIAL_PORT = "/ dev / ttyAMA0" # Raspberry Pi 2
#SERIAL_PORT = "/ dev / ttyS0" # Raspberry Pi 3
P_BUTTON = 24 # se adapta a su cableado
preparar()
imprimir "reiniciando modem ..."
resetModem ()
ser = serial.Serial (SERIAL_PORT, baudrate = 9600, timeout = 5)
si no está listo (ser):
imprima "El módem no está listo".
sys.exit (0)
Observaciones:
Como se explica en el capítulo Comunicación de datos, el cliente debe conocer la dirección IP de su
servidor de PC tal como se ve desde Internet. Debido a que su enrutador está configurado para el
reenvío de IP, se considera que la PC tiene la dirección IP del enrutador.
Objetivo:
enviar un correo electrónico desde la Raspberry Pi a un destinatario cada vez que se presiona un
botón. El RPi tiene una conexión a Internet a través de Ethernet o WLAN y hay un servidor SMTP
disponible.
Programa: [►]
# SendMail1.py
tmpmsg = msg
msg = MIMEMultipart ()
msg.attach (tmpmsg)
si img! = Ninguno:
si no es os.path.exists (img):
imprime "Archivo" , img, "no existe".
otra cosa :
fp = abierto (img, 'rb' )
img = MIMEImage (fp.read ()) # incluido en el correo, no como archivo adjunto
fp.close ()
msg.attach (img)
preparar()
imprima "Esperando evento de botón ..."
mientras es Verdadero:
si GPIO.input (P_BUTTON) == GPIO.LOW:
t = str (datetime.datetime.now ())
text = "Alert on" + t + "<br> ¡Se presionó el botón <b>! </b>"
subject = "Alert from Raspberry Pi"
enviar correo (asunto, texto)
#sendMail (asunto, texto, "c: /scratch/mailtest.png")
time.sleep (30)
Observaciones:
La función sendMail () es algo complicada y no se explica en detalle aquí. Puede adjuntar un archivo
adjunto de correo especificando el parámetro img . La misma función se puede utilizar para enviar
correos electrónicos desde un programa Python que se ejecuta en una PC.