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

2 comentarios en “Manejo de Conexiones HTTP Arduino

  1. Pingback: Saber Más Avanzado 2017 | Aprendiendo Arduino

  2. Pingback: Saber más Arduino Avanzado 2018 | Aprendiendo Arduino

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.