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
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:
- Conectar directamente a la IP de Arduino y ver los datos como en el ejemplo: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/blob/master/Ejercicio39-EthernetServer_DHCP/Ejercicio39-EthernetServer_DHCP.ino
Para hacer esto es necesario que Arduino tenga una IP pública o sino abrir el puerto 80 en nuestro router y redirigirlo a la IP de Arduino, esta opción no es la más recomendable desde el punto de vista de seguridad. - Mandar datos periódicamente a un servidor público que los almacene en una base de datos o un fichero. Luego montar una web en el servidor que muestre los datos. En este caso Arduino es un cliente y usamos un servidor externo
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:
- Arduino: https://github.com/jecrespo/aprendiendoarduino-servicios/tree/master/arduino_code/envia_SMS_DHCP
- MKR1000: https://github.com/jecrespo/aprendiendoarduino-servicios/tree/master/arduino_code/envia_SMS_MKR
- ESP8266: https://github.com/jecrespo/aprendiendoarduino-servicios/tree/master/arduino_code/envia_SMS_ESP
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
Pingback: Saber Más Avanzado 2017 | Aprendiendo Arduino
Pingback: Saber más Arduino Avanzado 2018 | Aprendiendo Arduino