Archivo de la etiqueta: HTTP

Itinerario Formación IoT/Industria 4.0

En un acercamiento a esta disciplina, se busca conocer las tecnologías necesarias para el desarrollo de soluciones IoT/Industria Conectada y valiéndonos para ello de herramientas, tecnologías, protocolos y software libre/open source que hay a nuestra disposición, de forma que cualquier empresa por pequeña que sea pueda hacer un proyecto sencillo de IoT/Industria 4.0 con una inversión mínima, sea cual sea el sector al que pertenezca.

No solo las grandes empresas pueden dar el salto a IoT, la tecnologías libres permiten que sea factible la digitalización de las pymes con una inversión económica mínima y que surja la innovación desde las propias empresas con una formación adecuada a sus trabajadores.

Fundamentos IoT (Nivel 1)20 h
Dispositivos HW IoT (Nivel 2)20 h
Infraestructuras IoT (Nivel 3)20 h
Conectividad IoT (Nivel 3)20 h
Plataformas IoT (Nivel 4)20 h
Desarrollo Soluciones IoT con Herramientas Libres (Nivel 5)20 h

Ver Anexo I con el material necesario para impartir los cursos de este itinerario.

Fundamentos IoT (Nivel 1)

Objetivo

Describir los fundamentos de Internet de las Cosas e identificar los distintos mercados a los que el alumno puede orientar su actividad profesional.

Dado que las comunicaciones, la conexión a Internet y los dispositivos conectados es un aspecto importante actualmente y los conceptos de computación y comunicaciones van unidos de la mano cuando hablamos de las TIC (Tecnologías de la Información y de la Comunicación), vamos a tratar también en este curso las comunicaciones y la programación de los dispositivos conectados.

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Conocer qué es IoT
  • Reconocer las tecnologías y arquitecturas de IoT
  • Capas en IoT
  • Saber los retos de IoT
  • Importancia de la seguridad den IoT
  • Empresas en IoT
  • Conocer los mercados verticales de IoT
  • Saber los servicios que ofrece IoT

Requisitos Alumnos

No son necesarios requisitos previos de los alumnos para asistir a este curso

Contenido del Curso

  • Qué es el IoT. Visión Holística
  • Ecosistema IoT
  • Retos de IoT
  • Industria 4.0. IIoT
  • Empresas en IoT
  • Mercados Verticales IoT
  • Campos Profesionales IoT
  • Aplicaciones IoT

Dispositivos HW IoT (Nivel 2)

Objetivo

Visión general del HW en el ecosistema IoT y puesta en práctica. Identificar la solución Hardware y Firmware más correcta para un proyecto IoT.

Analizar el hardware y el firmware utilizado dentro el ecosistema IoT y programar algunas las plataformas de prototipado más populares del mercado

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Conocer las plataformas HW IoT 
  • Conocer el firmware usado en las plataformas HW
  • Identificar la solución Hardware y Firmware más correcta para un proyecto IoT
  • Utilizar plataformas de prototipado IoT

Requisitos Alumnos

Haber cursado el módulo de Fundamentos IoT o tener experiencia en HW y Firmware IoT.

Contenido del Curso

  • Dispositivos IoT
  • HW IoT Industrial
  • Firmware: SW de los dispositivos
  • Plataforma de Prototipado
  • Prácticas Firmware
  • HW IoT Comercial

Infraestructuras de Comunicaciones IoT (Nivel 3)

Objetivo

Visión detallada de las infraestructuras y conectividad en IoT con ejemplos prácticos en algunas tecnologías. El alumno será capaz de analizar las necesidades de una solución IoT, ofrecer la mejor solución e implementarla. 

Utilizar las Infraestructuras de comunicación que se usan hoy en día para IoT

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Conocer las diferentes infraestructuras de comunicaciones IoT disponibles en el mercado
  • Comparar las tecnologías inalámbricas y saber elegir la más adecuada dependiendo del proyecto.
  • Ofrecer e implantar soluciones IoT a nivel de conectividad e infraestructuras IoT a partir del análisis de necesidades del proyecto
  • Utilizar algunas de las comunicaciones con placas de prototipado como Arduino y ESP8266

Requisitos Alumnos

Haber cursado el módulo de Fundamentos IoT o tener experiencia en infraestructuras y conectividad IoT.

Contenido del Curso

  • Conectividad IoT
  • Redes Inalámbricas IoT
  • Infraestructura de Comunicación IoT
  • Prácticas de Comunicaciones IoT

Conectividad IoT (Nivel 3)

Objetivo

Visión detallada de las infraestructuras y conectividad en IoT con ejemplos prácticos en algunas tecnologías. El alumno será capaz de analizar las necesidades de una solución IoT, ofrecer la mejor solución e implementarla. 

Analizar los protocolos más populares para dotar de conectividad a los dispositivos IoT y configurar el software

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Conocer los protocolos más populares usados en IoT
  • Profundizar en el protocolo HTTP y el uso de API REST
  • Profundizar en el protocolo MQTT y su uso en aplicaciones IoT
  • Instalar, configurar y usar un broker MQTT
  • Ofrecer e implantar soluciones IoT a nivel de conectividad e infraestructuras IoT a partir del análisis de necesidades del proyecto

Requisitos Alumnos

Haber cursado el módulo de Fundamentos IoT o tener experiencia en infraestructuras y conectividad IoT.

Contenido del Curso

  • Protocolos IoT
  • Protocolo HTTP
  • Uso de API REST
  • Protocolo MQTT
  • Práctica MQTT

Plataformas IoT (Nivel 4)

Objetivo

Visión general de las plataformas IoT y trabajo detallado en algunas de ellas. Proponer, instalar y configurar la plataforma más adecuada para el desarrollo de soluciones IoT.

Analizar las  las plataformas existentes en IoT e instalar y configurar alguna de las más utilizadas.

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Conocer las plataformas IoT Generalistas y especializadas más usadas
  • Conocer plataformas open source, instalar y configurar en un servidor
  • Encontrar la plataforma adecuada para una solución IoT, instalación y configuración
  • Programar servicios usando Node-Red
  • Uso de Bases de Datos para almacenamiento de datos
  • Configuración y uso de Dashboards
  • Analizar datos de forma visual

Requisitos Alumnos

Haber cursado el módulo de Fundamentos IoT o tener experiencia en plataformas IoT.

Contenido del Curso

  • Plataformas Cloud Generalistas
  • Plataformas Cloud Especializadas
  • Práctica de Plataformas Cloud
  • Plataformas Privadas/Libres
  • Práctica Plataformas Privadas/Libres
  • Servicios IoT
  • Node-Red
  • Bases de Datos
  • Dashboards
  • Ejemplos prácticos IoT

Desarrollo Soluciones IoT con Herramientas Libres (Nivel 5)

Objetivo

Este curso pretende unificar todos los conocimiento adquiridos en los anteriores cursos del itinerario IoT para hacer un proyecto “full stack” de IoT.

Unificar los conocimientos adquiridos en los otros cursos, identificar necesidades reales con respuestas desde el IoT y desarrollar una solución específica para una necesidad.

Toda la documentación del curso y el código usado es libre y accesible desde https://www.aprendiendoarduino.com/.

Al finalizar el curso el alumno será capaz de:

  • Proponer e implementar soluciones IoT como respuesta a necesidades específicas
  • Desarrollar un proyecto IoT  estructurado según las fases relacionadas en cada módulo  que de respuesta a una necesidad real del entorno del alumno

Requisitos Alumnos

Los alumnos deberán haber cursado todos los cursos del itinerario IoT o tener experiencia en el desarrollo de soluciones IoT

Contenido del Curso

  • Repaso de conceptos
  • Ejemplo de soluciones IoT Completas
  • Identificación de necesidades
  • Presentación preliminar
  • Desarrollo del Proyecto
  • Presentación del Proyecto

Protocolos IoT Capa Aplicación

En informática y telecomunicación, un protocolo de comunicaciones es un sistema de reglas que permiten que dos o más entidades de un sistema de comunicación se comuniquen entre ellas para transmitir información por medio de cualquier tipo de variación de una magnitud física. Se trata de las reglas o el estándar que define la sintaxis, semántica y sincronización de la comunicación, así como también los posibles métodos de recuperación de errores. Los protocolos pueden ser implementados por hardware, por software, o por una combinación de ambos.

Los sistemas de comunicación utilizan formatos bien definidos (protocolo) para intercambiar mensajes. Cada mensaje tiene un significado exacto destinado a obtener una respuesta de un rango de posibles respuestas predeterminadas para esa situación en particular. Normalmente, el comportamiento especificado es independiente de cómo se va a implementar. Los protocolos de comunicación tienen que estar acordados por las partes involucradas.

Ejemplos de protocolos de red (wikipedia)

Algunos Protocolos de comunicación IoT de capa de aplicación, con los que comunicar el HW con el SW

  • MQTT
  • API REST/HTTP
  • SNMP
  • CoAp
  • Websockets
  • Buses de campo industriales, modbus, etc…

Más información: https://es.wikipedia.org/wiki/Protocolo_de_comunicaciones

El protocolo de red MQ Telemetry Transport (MQTT) sería una buena opción para monitorizar y controlar los paneles solares. MQTT es un protocolo de publicación/suscripción con corredores de mensajes centrales. Cada panel solar puede contener un nodo IoT que publique mensajes de tensión, corriente y temperatura.

MQTT de un vistazo

  • Ancho de banda muy bajo
  • TCP/IP
  • Publicar/suscribir transferencia de mensajes
  • Topología de muchos a muchos a través de un broker central
  • Sin metadatos
  • Tres niveles de QoS
  • Última Voluntad y Testamento revela nodos desconectados

Para los nodos IoT de los aerogeneradores, preferiría una interfaz más basada en API. El Protocolo de aplicación restringida (Constrained application protocol – CoAP) utiliza el conocido patrón de diseño REST, en el que los servidores ponen recursos a disposición en una URI y los clientes acceden a los recursos utilizando métodos como GET, PUT, POST y DELETE. Los estándares publicados facilitan la interpretación de los formatos de contenido: por ejemplo, XML (ID=41) o JSON (ID=50).

CoAP es un protocolo del IETF (Internet Engineering Task Force) que se ha diseñado para proporcionar aplicaciones RESTful modeladas en la semántica de HTTP, pero más pequeño y binario a diferencia del basado en texto. CoAP es un enfoque tradicional de cliente-servidor en comparación al de brokers, diseñado para correr sobre UDP.

Las turbinas podrían consultarse entre sí para optimizar el rendimiento de la matriz. Por ejemplo, una turbina podría consultar a la turbina adyacente para determinar si el viento estaba aumentando o disminuyendo. El vecino podría a su vez consultar a su vecino y así sucesivamente. Esta simple regla podría permitir a una turbina anticiparse a los cambios de viento y prepararse en consecuencia. Si todo el array tiene acceso a la web (vía HTTP) y un servidor DNS, es fácil traducir el URI a: http:// turbine20.domain.tld/speed y monitorizar el campo remotamente.

El CoAP de un vistazo

  • Transferencia de documentos cliente/servidor REST
  • Fácil de traducir a HTTP para la integración web
  • Topología uno a uno con conexiones directas
  • Metadatos para diferenciar clases de documentos
  • UDP
  • Seguridad a través de DTLS

En entornos industriales OPC UA (Unified Architecture, ‘arquitectura unificada’) es el estándar de nueva generación que le sigue a OPC Foundation. OPC clásico es bien conocido en la industria y provee una interfaz estándar para comunicarse con los PLC (Programmable Logic Controller, ‘controlador lógico programable’). OPC UA pretende expandir la compatibilidad de OPC al nivel de los dispositivos y de las empresas.

OPC UA es un protocolo cliente/servidor. Los clientes se conectan, navegan, leen y escriben al equipamiento industrial. UA define la comunicación desde la aplicación hacia la capa de transporte, lo que lo hace muy compatible entre vendedores. También es muy seguro, y usa mensajes bidireccionales firmados y encriptación de transporte.

OPC UA tiene una amplia base instalada en el mundo industrial. Es una buena solución para conectar información de sensores y PLC en aplicaciones industriales ya existentes como sistemas MES (Manufacturing Execution System, ‘sistema de ejecución de manufactura’) y SCADA (Supervisry Control and Data Acquisition, ‘supervisión, control y adquisición de datos’), en donde la conectividad OPC y OPC UA ya estén disponibles.

Sin embargo, OPC UA es nuevo para las tecnologías de información. Algunas personas de TIC (tecnologías de la información y comunicación) se asustan ante la complejidad de UA en comparación con otros protocolos TIC. Bastante de esta complejidad reside en el hecho de que OPC UA sea un protocolo industrial, pero esta percepción ha llevado a ralentizar su adopción para plataformas IoT y la comunidad de código abierto.

Pero la cosa están cambiando: hace muy poco, OPC Foundation abrió el código del estándar OPC UA para hacerlo más accesible y colaborar a que se incremente su adopción.

Más información:

Comparativa de protocolos IoT:

Conclusión

OPC UA, HTTP, MQTT, CoAP, DDS, AMQP, etc.. todos tienen lugar en IoT. Cuál de estos protocolos tiene la mayor parte del mercado no está claro, pero cada uno tiene sus pros y sus contras. Es importante elegir el protocolo que mejor se adapte a sus necesidades, y seleccionar los socios tecnológicos que se puedan adaptar a tales protocolos. Esto asegurará el éxito para sus aplicaciones IoT y lo protegerá de las guerras de protocolos.

Muy buen resumen de protocolos de IoT: https://www.postscapes.com/internet-of-things-protocols/

Otro Buen resumen de protocolos IoT de la capa de aplicación: https://www.14core.com/the-iot-protocols-the-base-of-internet-of-things-ecosystem/

Video. Conectar ESP8266 a Internet. WifiClient

TODO: poner enlace al vídeo

Una vez escaneadas las redes, vamos a conectarnos a una de ellas y acceder a internet llegando a un servidor y ver su contenido.

El ejemplo WiFiClientBasic que podemos encontrar en Archivos – Ejemplos – ESP8266WiFi – WiFiClientBasic.

Este ejemplo se conecta a una red WiFi y manda un mensaje a un servidor TCP, en este caso a la IP 192.168.1.1 y al puerto 80.

La clase ESP8266WiFiMulti es igual que la clase ESP8266WiFi pero que permite configurar múltiples conexiones a puntos de acceso que en caso de perder la conexión se conecte al siguiente: http://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/station-examples.html?highlight=ESP8266WiFiMulti

Con WiFi.mode(WIFI_STA); pongo el ESP8266 en modo estación, es decir, para conectar a una red WiFi de un punto de acceso.

Para más información:

Una vez conectado entramos en el loop y me conecto a un servidor como cliente. La clase cliente permite acceder a servicios de los servidor pudiendo enviar y recibir datos:

NOTA: en caso que el router wifi de una IP en otro rango que no sea el 192.168.1.x, cambiar la IP de la variable host por la IP del router wifi al que nos conectamos.

Ejercicio propuesto: conectar a https://www.aprendiendoarduino.com/servicios/aprendiendoarduino/ y leer el mensaje que devuelve.

Solución: https://github.com/jecrespo/aprendiendoarduino-curso-esp8266-youtube/blob/master/WiFiClientBasicMejorado/WiFiClientBasicMejorado.ino

En este caso debemos usar un lenguaje de comunicación común para hablar entre el servidor y el ESP8266, es el mismo lenguaje que usa cualquier navegador que se conecta a una página web y es el HTTP.

Una vez conectados al puerto 80 debe mandar un GET con la ruta del servidor y acabar con una línea nueva, tal y como funciona este protocol. Para ello mando:

 
client.println("GET /servicios/aprendiendoarduino/ HTTP/1.0");
client.println("Host: www.aprendiendoarduino.com");
client.println();

Si todo funciona bien recibiré la respuesta “HTTP1.1 200 OK” seguido de las cabeceras y luego una línea nueva, tras la cual aparecerá la respuesta del servidor. Para leer todas las líneas y no solo la primera es necesario hacer un bucle while mientras haya datos recibidos con la instrucción client.available(): https://www.arduino.cc/en/Reference/WiFiClientAvailable

NOTA: es necesario añadir la cabecera HTTP “Host: http://www.aprendiendoarduino.com” para que el hosting de la web resuelva el nombre del dominio.

La respuesta obtenida es:

Mensaje oculto: “Bienvenido al servidor de http://www.aprendiendoarduino.com

Más información sobre el protocolo HTTP: https://aprendiendoarduino.wordpress.com/2017/06/26/protocolo-http-2/

Manejo de Conexiones HTTP Arduino

Cliente

Cuando usamos Arduino como cliente HTTP, simplemente se programa la petición o http request. A la hora de recibir la respuesta o http response, dado que puede ser un número de datos muy grande podemos establecer varias estrategias:

  • Recoger toda la respuesta en un string o array de caracteres. Esto tiene un consumo muy alto de memoria.
  • Analizar línea a línea, puesto que el protocolo http se define por líneas, de forma que el consumo de memoria es pequeño y me puede permitir descartar el resto de respuesta http si ya no me interesa, para ello con un close() se cierra el socket y se descarta el resto de respuesta.
  • Leer a media que llega y usar alguna función que lea todo hasta que detecte lo que buscamos. Usa menos memoria, pero es más difícil de programar y es menos flexible.

Ejemplo: recoger datos de un servidor web y analizar los datos línea a línea o todo junto. Solicitar una petición de un json a http://www.aprendiendoarduino.com/servicios/aprendiendoarduino/string_avanzado.json

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_Avanzado_2017/tree/master/Ejercicio21-Strings_Avanzado

Servidor. Muestra de Datos

En caso que queramos mostrar los datos de los sensores conectados a Arduino en una web podemos hacerlo de dos formas:

Además esta técnica me permite tener un histórico de datos que con un Arduino está limitado a la memoria o sino habría que usar una tarjeta SD u otro almacenamiento externo.

Por ejemplo la web http://www.aprendiendoarduino.com/servicios/datos/index.html muestra los útimos 30 datos mandados al servidor con el código https://github.com/jecrespo/aprendiendoarduino-servicios/tree/master/arduino_code/data_logger_temperatura_DHCP que manda la temperatura medida con un sensor de temperatura TMP36 por el Arduino.

Esquema de conexión:

Servidor. Control Remoto

En caso que queramos controlar un elemento remotamente, como encender una luz o la calefacción o mover un servo, la problemática es la misma que en el caso anterior si queremos acceder directamente al Arduino, en caso de estar en otra red y no tener IP pública nos obliga a abrir puertos en nuestro router.

Otra opción sería usar VPNs, pero Arduino no soporta VPN, así que necesitaríamos un elemento adicional.

Dos técnicas para control remoto:

  • Mandar datos directamente al Arduino. Arduino como web server y abrir puertos.
  • Usar un servidor intermedio al que se manda la orden y arduino pregunta periódicamente (Pull). Esto supone que el control acumula un retraso máximo del periodo que configuramos Arduino para que consulte al servidor.
  • Una tercera opción es montar un websocket entre Arduino y el servidor, de forma que el servidor comunica inmediatamente el cambio a Arduino (Push). Habría que buscar una librería que funcione bien.

Servidor. Eventos (Push/ Pull)

Cuando queremos que un Arduino mande un evento, por ejemplo una puerta abierta o una alta temperatura, Arduino lanza un aviso contra otro Arduino para que ejecute una acción como por ejemplo mandar un SMS si la puerta se abre o encender el aire acondicionado si hay mucha temperatura.

Ocurre lo mismo que con el control remoto, dos formas de hacerlo:

  • Como Push el Arduino que detecta el evento manda aviso cuando ocurre. Hay que abrir puertos si no hay conectividad directa.
  • Como Pull Arduino que detecta evento es un servidor y el cliente le pregunta periódicamente. Pero también hay que abrir puertos en el Arduino que actúa como servidor.
  • Una opción intermedia es que el Arduino que detecta eventos manda datos a un servidor público (Push) y el Arduino que debe actuar consulta periódicamente al servidor a ver si tiene que hacer algo (Pull)

Pull vs Push

Un ejemplo de la tercera solución es el envío de SMSs en http://www.aprendiendoarduino.com/servicios/SMS/index.html usando este código para el Arduino que manda el evento:

Este problema lo soluciona el protocolo MQTT

Pila de protocolos MQTT:

Librería MQTT:

Brokers MQTT públicos y gratuitos: https://github.com/mqtt/mqtt.github.io/wiki/public_brokers

Protocolo HTTP

Protocolo HTTP

Hypertext Transfer Protocol o HTTP (en español protocolo de transferencia de hipertexto) es el protocolo de comunicación que permite las transferencias de información en la WWW. Se trata de un protocolo de capa 7 de aplicación.

En arduino con la librería ethernet solo trabajamos con la capa de aplicación, todas las otras capas de la pila TCP/IP ya están implementadas por Hardware, ya sea con la ethernet shield o el módulo WiFi correspondiente. Aunque si queremos realizar algunas funciones de capas inferiores, podemos hacerlo con los comandos adecuados comunicándonos con el chip ethernet o wifi via SPI.

Veamos algunos protocolos de la capa de aplicación que serán los que tengamos que implementar en nuestro arduino directamente o usando la librería adecuada:

HTTP es un protocolo muy importante puesto que es el que se va a usar para comunicar Arduino con cualquier elemento de la WWW o de una intranet. En el IoT es uno de los protocolos más usados y sobre todo si queremos obtener o mandar datos a servidores o usar las APIs que nos ofrecen algunos servicios para obtención de información, por ejemplo, para obtener el tiempo meteorológico de la AEMET https://opendata.aemet.es/centrodedescargas/inicio y con esos datos que Arduino actúe de una forma u otra.

Hypertext Transfer Protocol o HTTP (en español protocolo de transferencia de hipertexto) es el protocolo usado en cada transacción de la World Wide Web. HTTP fue desarrollado por el World Wide Web Consortium y la Internet Engineering Task Force.

HTTP define la sintaxis y la semántica que utilizan los elementos de software de la arquitectura web (clientes, servidores, proxies) para comunicarse. Es un protocolo orientado a transacciones y sigue el esquema petición-respuesta entre un cliente y un servidor. Al cliente que efectúa la petición (un navegador web) se lo conoce como “user agent” (agente del usuario). A la información transmitida se la llama recurso y se la identifica mediante un localizador uniforme de recursos (URL).

HTTP es un protocolo sin estado, es decir, que no guarda ninguna información sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener estado. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente. Esto le permite a las aplicaciones web instituir la noción de “sesión”, y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.

Una transacción HTTP está formada por un encabezado seguido, opcionalmente, por una línea en blanco y algún dato. El encabezado especificará cosas como la acción requerida del servidor, o el tipo de dato retornado, o el código de estado. El uso de campos de encabezados enviados en las transacciones HTTP le dan gran flexibilidad al protocolo. Estos campos permiten que se envíe información descriptiva en la transacción, permitiendo así la autenticación, cifrado e identificación de usuario. Ejemplos de encabezados: HTTP_ACCEPT y HTTP_USER_AGENT.

Más información sobre HTTP:

Para intercambio de archivos por HTTP usamos MIME: http://es.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions

Líneas de encabezado o headers, son muy importantes y dan información adicional de la conexión y el comportamiento puede cambiar en función de ellas:

Interesante HTTP quick guide: https://www.tutorialspoint.com/http/http_quick_guide.htm

Métodos de Petición HTTP

Lo más importante para comunicar arduino por HTTP con otros dispositivos, ya sean servidores, ordenadores, otros Arduinos, etc… es conocer los métodos GET y POST del protocolo HTTP. HTTP define 8 métodos que indica la acción que desea que se efectúe sobre el recurso identificado. Lo que este recurso representa, si los datos pre-existentes o datos que se generan de forma dinámica, depende de la aplicación del servidor. A menudo, el recurso corresponde a un archivo o la salida de un ejecutable que residen en el servidor.

GET

GET: Pide una representación del recurso especificado. Por seguridad no debería ser usado por aplicaciones que causen efectos ya que transmite información a través de la URI agregando parámetros a la URL. La petición puede ser simple, es decir en una línea o compuesta de la manera que muestra el ejemplo.

Ejemplo simple:

GET /images/logo.png HTTP/1.1 obtiene un recurso llamado logo.png

Ejemplo con parámetros:

GET /index.php?page=main&lang=es HTTP/1.1

POST

POST: Envía los datos para que sean procesados por el recurso identificado. Los datos se incluirán en el cuerpo de la petición. Esto puede resultar en la creación de un nuevo recurso o de las actualizaciones de los recursos existentes o ambas cosas.

Los otros métodos de HTTP:

Más información:

Entender los métodos get y post:

Un explicación muy buena de HTTP también se puede encontrar en:  http://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html

HTTP request

Un cliente HTTP debe formar una petición HTTP (request) al servidor de una forma determinada para que sea entendida por el servidor. Cuando Arduino trabaja como cliente hay que programar esta petición correctamente, sino el servidor nos mandará un mensaje de error.

Formación de un HTTP request, esta petición habrá que programar en Arduino:

Trama en HTTP, fijaros en el uso de cr (retorno de carro – carriage return – ASCII 13) y lf (line feed – nueva linea – ASCII 10): http://www1.ju.edu.jo/ecourse/abusufah/cpe532_Spr06/notes/BookOnLine/HTTP%20Request%20Message.htm

HTTP/1.1 se definió en el estándar RFC2616,que es la más usada actualmente. En junio de 2014 RFC2616 se retiró y HTTP/1.1 se redefinió en RFCs 7230, 7231, 7232, 7233, 7234, and 7235, HTTP/2 está en proceso de definición.

Y cuando usar GET o POST?: http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

HTTP response

Después de recibir e interpretar el servidor un HTTP request, el servidor debe responder con un mensaje de respuesta:

Para cumplir con el protocolo HTTP, arduino debe implementar estas respuestas cuando lo uso como servidor web, como devolución a un request mandado por un cliente como puede ser un browser o navegador. De esta forma puedo implementar en Arduino una web embebida.

Por lo tanto Arduino podemos programarlo para comportarse como cliente, como servidor o como ambos.

Veamos esto gráficamente:

Ejercicio: Ver las tramas HTTP con las funciones de depuración del navegador y también con wireshark, un web sniffer on-line y algún plugin para el navegador.

Listado de web sniffers: http://scraping.pro/web-sniffers-review/

Servidor Web Embebido en Arduino

Para poder implementar un servidor web embebido en un Arduino e interactuar con él, se debe programar los mensajes http en Arduino para responder al navegador de forma adecuada.

La secuencia que se produce en una web embebida para encender y apagar un led es:

  • El navegador manda un http request GET a la IP de Arduino cuando pongo su IP en el navegador. p.e. http://192.168.1.15
  • Arduino recibe la petición que comienza por “GET / HTTP/1.1”
  • Arduino devuelve el http response con “HTTP/1.0 200K” y luego la web con el código html, haciendo print sobre el cliente ethernet y cierra la comunicación.
  • El navegador recibe el http respnse y muestra la web, en este caso un botón.
  • Al pulsar el botón en el navegador, el código HTML ya está configurado para mandar una petición POST.
  • Arduino recibe la petición que comienza por “POST / HTTP/1.1” y enciende o apaga el led según corresponda.
  • Luego Arduino muestra la web con el estado del led actualizado.

Ver este proceso con wireshark o con las herramienta de desarrollador del navegador pulsando F12.

Ver sketch en: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio40-Boton_Mejorado_DHCP

Diagrama de flujo:

Más información:

Programa botón para diferentes Arduino. Comparar:

Librerías HTTP

Libreria 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 cómo 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/Aprendiendo-Arduino/tree/master/Ejercicio29-Webduino

Otras Librerías

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

Y una librería para implementar un cliente HTTP:

Librería http client: https://github.com/amcewen/HttpClient