Tema 6 – Comunicaciones con Arduino (3)

Librería webduino

Webduino es una librería muy popular que nos permite implementar un servidor web en nuestro Arduino.

La web del creador: https://code.google.com/p/webduino/

El reference de la librería: https://code.google.com/p/webduino/wiki/Documentation

Repositorio de la librería: https://github.com/sirleech/Webduino

Snippet Webduino en el playground: http://playground.arduino.cc/Main/WebduinoFileServer

Para Shields con Microchip ENC28J60 no es válida esta librería puesto que necesita SW adicional para implementar la pila TCP/IP.

Una presentación que explica como funciona: https://docs.google.com/presentation/d/1QUG4XJTK3jKtU-eYUfM1DvUdRaKBrp__LEwZQfz9s6E/edit#slide=id.i0

Hilo de soporte de la librería: http://forum.arduino.cc/index.php/topic,37851.0.html

Ejercicio 29-Webduino Entender como funciona la librería y ver el ejemplo webdemo

Luego hacer la aplicación web buzzer.

Streaming: http://arduiniana.org/libraries/streaming/

Class Templates: http://www.cprogramming.com/tutorial/templates.html

Solución en https://github.com/jecrespo

Otras librerías para implementar un servidor web en Arduino:

Y una librería para implementar un cliente HTTP:

Ejercicio30-SD: Grabar y leer en una tarjeta SD

Ver la reference en: http://arduino.cc/en/Reference/SD

Basarse en los tutoriales.

Hacer una versión de un servidor web cuya web esté en la tarjeta SD y la lea para mostrarla. Luego esa web recoge un texto de un input text y lo guarde en otro fichero.

Solución en https://github.com/jecrespo

Otro ejemplo más completo en: http://www.instructables.com/id/ServDuino-Arduino-Webserver/?ALLSTEPS

Ejercicio31-MandaCorreo: Mandar un correo desde Arduino

El Simple Mail Transfer Protocol (SMTP) (Protocolo para la transferencia simple de correo electrónico), es un protocolo de red utilizado para el intercambio de mensajes de correo electrónico entre ordenadores u otros dispositivos (Arduino, teléfonos móviles, etc.). Fue definido en el RFC 2821 y es un estándar oficial de Internet.

 El funcionamiento de este protocolo se da en línea, de manera que opera en los servicios de correo electrónico. Sin embargo, este protocolo posee algunas limitaciones en cuanto a la recepción de mensajes en el servidor de destino (cola de mensajes recibidos). Como alternativa a esta limitación se asocia normalmente a este protocolo con otros, como el POP o IMAP, otorgando a SMTP la tarea específica de enviar correo, y recibirlos empleando los otros protocolos antes mencionados (POP O IMAP).

Más información en: http://es.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol y http://es.kioskea.net/contents/279-protocolos-de-mensajeria-smtp-pop3-e-imap4

Éste es un protocolo que funciona en línea, encapsulado en una trama TCP/IP. El correo se envía directamente al servidor de correo del destinatario. El protocolo SMTP funciona con comandos de textos enviados al servidor SMTP (al puerto 25 de manera predeterminada). A cada comando enviado por el cliente (validado por la cadena de caracteres ASCII CR/LF, que equivale a presionar la tecla Enter) le sigue una respuesta del servidor SMTP compuesta por un número y un mensaje descriptivo.

Esta es la secuencia de envío de un correo:

  • Al abrir la sesión SMTP, el primer comando que se envía es el comando HELO seguido por un espacio (escrito <SP>) y el nombre de dominio de su equipo (para decir “hola, soy este equipo”), y después validado por Enter (escrito <CRLF>). Desde abril de 2001, las especificaciones para el protocolo SMTP, definidas en RFC 2821, indican que el comando HELO sea remplazado por el comando EHLO.
  • El segundo comando es “MAIL FROM:” seguido de la dirección de correo electrónico del remitente. Si se acepta el comando, el servidor responde con un mensaje “250 OK”.
  • El siguiente comando es “RCPT TO:” seguido de la dirección de correo electrónico del destinatario. Si se acepta el comando, el servidor responde con un mensaje “250 OK”.
  • El comando DATA es la tercera etapa para enviar un correo electrónico. Anuncia el comienzo del cuerpo del mensaje. Si se acepta el comando, el servidor responde con un mensaje intermediario numerado 354 que indica que puede iniciarse el envío del cuerpo del mensaje.
  • Si se acepta el comando, el servidor responde con un mensaje “250 OK”.

Las especificaciones básicas del protocolo SMTP indican que todos los caracteres enviados están codificados mediante el código ASCII de 7 bits y que el 8º bit sea explícitamente cero. Por lo tanto, para enviar caracteres acentuados es necesario recurrir a algoritmos que se encuentren dentro de las especificaciones MIME.

Ejemplo de Conversación SMTP mediante telnet:

RFC 2821:

Para enviar correos electrónicos desde arduino, es como si lo hiciéramos utilizando telnet. Esto se hacía mucho antiguamente cuando los  servidores de correo no solían estar protegidos contra el reenvío de emails y cualquiera podía conectarse al puerto  25 de un servidor de correo y enviar un correo con un remitente falso.

Un ejemplo de como mandar correo electrónico con Arduino directamente:

Obviamente para poder enviar un correo de la forma anteriormente vista necesitamos un servidor SMTP no protegido. La gran mayoría de los servidores de correo requieren que nos autentiquemos por lo que se complica un poco el proceso de enviar correo a través de telnet pero esto no significa que no podamos hacerlo.

Podemos montar una raspberry pi que haga de servidor SMTP que reciba los correos de nuestro arduino y usar la raspberry pi para que reenvíe los correos a través de gmail u otro servicio de correo.

Por supuesto disponemos de librerías que implementan un cliente SMTP en arduino:

Solución en https://github.com/jecrespo

Otra estrategia para mandar correos desde Arduino es dejarlo en manos de un servidor, es decir, Arduino mando un POST que recoge el servidor y este mediante PHP, python u otro lenguaje se encarga de mandar el correo con las librería que tiene disponibles.

Ejercicio32-EnviaDatos: Este ejercicio consiste en mandar datos a un servidor mediante requests POST HTTP con Arduino. El servidor es una Raspberry Pi con un servidor LAMP instalado y todos los datos recibidos desde los arduinos los guarda en una base de datos MySQL.

Los datos que mandará Arduino son la temperatura leída por el sensor de temperatura cada minuto y el post mandará el número de arduino y la temperatura.

“arduino=5&temperatura=21.8”

Dos estrategias para guardar datos de Arduino en un servidor, pull y push:

Pull: Una aplicación en un ordenador o servidor pregunta a Arduino por los datos

Push: Arduino se comunica con el servidor para mandarle los datos

Para poder usar una Raspberry Pi en este ejercicio, necesitamos instalar un servidor LAMP, aquí os dejo unos tutoriales de como hacerlo:

También podemos instalar Postfix en Raspberry Pi como servidor SMTP para mandar correos desde nuestro Arduino:

Y para finalizar:

Solución en https://github.com/jecrespo