Como fazer requisições HTTP usando Arduino para IoT

Cómo realizar solicitudes HTTP usando Arduino para IoT

Un paso esencial en el desarrollo de aplicaciones de Internet de las cosas (IoT) es configurar la comunicación entre los dispositivos de IoT y un servidor o servicios web.

Los dispositivos IoT se comunican con un servidor web, servicio o API a través de solicitudes HTTP. Una solicitud HTTP es un mensaje enviado por un cliente a un servidor en el contexto de la World Wide Web. Esto permite que los dispositivos inteligentes actúen como clientes web, intercambiando datos e información con servidores a través de Internet. Muchos proyectos de IoT se construyen utilizando placas compatibles con Arduino y Arduino. Arduino es actualmente la plataforma de microcontroladores más popular para la creación de prototipos de aplicaciones integradas típicas, incluido IoT.

En este artículo, analizaremos cómo se configuran y programan Arduino y las placas compatibles para "hablar" a través de Internet. La comunicación puede ocurrir gracias a las solicitudes HTTP.

¿Qué es una solicitud HTTP?
Una solicitud HTTP es un mensaje enviado por un cliente a un servidor en el contexto de la World Wide Web. Es la forma estándar en que los clientes web (navegadores web y otras entidades conectadas a la web, como dispositivos IoT) solicitan datos de los servidores o los envían. datos a los servidores.

Estas solicitudes son la base de la comunicación de datos en la web y operan como parte del Protocolo de transferencia de hipertexto (HTTP), un protocolo de capa de aplicación en el conjunto de protocolos de Internet.

Una solicitud HTTP incluye las siguientes partes.

1. Línea inicial: contiene tres elementos: el método HTTP, el destino de la solicitud y la versión HTTP. El método HTTP indica la acción que se realizará en el recurso, como GET, POST, PUT DELETE, etc. El destino de la solicitud es una URL o la ruta al recurso en el servidor. La versión HTTP especifica la versión del protocolo HTTP, como HTTP/1.1.

2. Encabezados: contienen metadatos sobre la solicitud, como host, agente de usuario, tipo de contenido y otra información sobre el cliente o los datos que se envían.

3. Línea vacía: el final de la sección del encabezado y el comienzo del cuerpo opcional (solicitud HTTP) se indican con una línea vacía.

4. Cuerpo: no está presente en todas las solicitudes (como ocurre con la mayoría de las solicitudes GET), pero cuando lo está, contiene los datos que se enviarán con la solicitud. Esto es típico de las solicitudes POST en las que los datos del formulario o la carga de archivos se envían al servidor.

Cada vez que navega por una página web, completa un formulario o llama a una API desde una aplicación web, el cliente envía una solicitud HTTP. Después de recibir la solicitud, el servidor la procesa y responde con una respuesta HTTP que incluye los datos solicitados, el estado de la solicitud y, a veces, un cuerpo que contiene datos solicitados adicionales o los resultados de la operación.

Métodos HTTP
El método HTTP indica la acción que se realizará en el recurso. Existen varios métodos HTTP, incluidos GET, POST, PUT, DELETE, HEAD, CONNECT, PATCH, TRACE, OPTIONS, LINK, UNLINK, etc.

  • El método GET solicita datos de un recurso.
  • El método POST envía datos para ser procesados ​​a un recurso específico.
  • El método PUT actualiza un recurso específico con los datos proporcionados.
  • El método DELETE elimina o elimina un recurso específico.

GET y POST son los métodos HTTP más comunes utilizados para la World Wide Web y el IoT. Al contrario de su definición, el método GET puede obtener y enviar datos a un servidor web.

Solicitudes Arduino y HTTP
Las placas Arduino deben conectarse a través de Ethernet o WiFi para realizar solicitudes HTTP y comunicarse con un servidor web. Se requiere un escudo Ethernet para configurar la comunicación entre Arduino e Internet a través de Ethernet. Se requiere Arduino WiFi Shield para permitir que Arduino acceda a una red WiFi.

Algunas placas de conexión permiten que Arduino se conecte a redes WiFi. Varias placas Arduino ahora también vienen con funcionalidad WiFi incorporada, incluidas Arduino Uno WiFi Rev2, Arduino Nano 33 IoT, Arduino MKR WiFi 1010, Arduino MKR1000 WiFi, Arduino Portenta H7, Arduino. Yun, Arduino Yun Mini y Arduino Yun Rev2.

ESP8266 y ESP32 son placas de microcontrolador alternativas compatibles con Arduino con funciones WiFi y Bluetooth integradas. Si una placa Arduino no tiene funcionalidad WiFi incorporada, se necesitará un escudo Ethernet o WiFi para conectarse a Internet.

Cómo se comunica Arduino
Cuando un dispositivo IoT construido con Arduino o cualquier microcontrolador se comunica con un servidor web, servicio o API, funciona como un cliente web. El servidor web, el servicio y la API son recursos identificados por una URL. La comunicación se produce a través de solicitudes HTTP a la URL del recurso especificado. También puede contener una cadena de consulta que contenga las variables o datos que se comunicarán al recurso especificado. Luego, el recurso especificado envía una respuesta HTTP. El dispositivo IoT (Arduino o cualquier microcontrolador) recibe y analiza la respuesta HTTP.

bibliotecas arduino
Hay varias bibliotecas disponibles para enviar solicitudes HTTP desde Arduino. Las bibliotecas simplifican el proceso, especialmente cuando se utilizan módulos de red como ESP8266 o ESP32, que tienen capacidades WiFi integradas o escudos Ethernet.

Las bibliotecas Arduino más utilizadas para realizar solicitudes HTTP son las siguientes.

Biblioteca Ethernet: para placas Arduino que se conectan a Internet mediante un escudo Ethernet. Le permite realizar todas las tareas de red a través de Ethernet.

Wi-Fi.h: para placas Arduino con soporte WiFi nativo, como Arduino Nano 33 IoT. Se utiliza para gestionar conexiones WiFi y enviar solicitudes HTTP.

Biblioteca WiFiNINA: diseñada para placas con el módulo WiFi u-blox NINA, como Arduino MKR WiFi 1010, Arduino MKR VIDOR 4000 y Arduino UNO WiFi Rev.2.

Biblioteca ESP8266WiFi: es para el módulo ESP8266 y se usa a menudo para administrar conexiones WiFi y realizar tareas de red, incluido el envío de solicitudes HTTP.

Biblioteca ESP32 WiFi: similar a ESP8266WiFi, pero diseñada para el módulo ESP32. Le permite conectarse a una red WiFi y enviar solicitudes HTTP.

Biblioteca ESP8266HTTPClient: para ESP8266, proporciona funcionalidad adicional específicamente para crear solicitudes HTTP y manejar respuestas.

Biblioteca HTTPClient: para ESP32, que proporciona funcionalidad adicional específicamente para crear solicitudes HTTP y manejar respuestas.

Biblioteca Ethernet
La biblioteca Ethernet permite la conexión de red a LAN o Internet utilizando el escudo Ethernet Arduino. La biblioteca proporciona funcionalidad de cliente y servidor. También se conecta a una red DHCP local y resuelve DNS. La biblioteca es compatible con todas las arquitecturas de la plataforma Arduino.

Esta biblioteca se puede utilizar con Arduino Ethernet Shield, Arduino Ethernet Shield 2, Leonardo Ethernet y otros dispositivos basados ​​en W5100/W5200/W5500. Puede configurar una tarjeta como un servidor que acepta conexiones entrantes o un cliente que realiza conexiones salientes. Admite hasta ocho o cuatro conexiones simultáneas. El escudo Ethernet interactúa con Arduino a través del bus SPI.

La biblioteca se importa a un boceto siguiendo estas instrucciones:
#incluir
#incluir

La biblioteca ofrece seis clases:

1. Clase Ethernet
2. Clase de dirección IP
3. Clase de servidor
4. Clase de cliente
5. Clase EthernetUDP
6. Clase UDP

Para realizar solicitudes HTTP utilizando Arduino, en el siguiente esquema se utilizan métodos de la clase de cliente. El cliente Ethernet se inicializa utilizando el método EthernetClient, creando un cliente que se conecta a una dirección IP y un puerto de Internet específicos, como se define en la función client.connect.

Tiene el siguiente prototipo.
cliente ethernet

El método no requiere parámetros. Un ejemplo válido de inicialización de un cliente Ethernet es el siguiente.
Cliente cliente Ethernet;

La clase de cliente de la biblioteca Ethernet proporciona los siguientes métodos...

client.connect: se conecta a una dirección IP y un puerto específicos. También admite búsquedas de DNS cuando se utiliza un nombre de dominio. El valor devuelto por el método indica el éxito o el fracaso de una conexión.

Tiene esta sintaxis:
cliente.conectar
cliente.connect(ip, puerto)
cliente.connect(URL, puerto)

Requiere una IP y un puerto, o una URL y un puerto, o puede que no requiera argumentos. IP es la dirección IP a la que se conectará el cliente, representada por una matriz de 4 bytes. Puerto es el puerto al que se conectará el cliente.

Para solicitudes HTTP, el puerto suele ser 80. La URL es el nombre de dominio al que se conectará el cliente. La función devuelve 1,-1,-2,-3 o -4, donde 1 indica ÉXITO, -1 TIMED_OUT, -2 INVALID_SERVER, -3 TRUNCADO y -4 INVALID_RESPONSE.

client.connected: detecta si el cliente Ethernet está conectado. Un cliente se considera conectado incluso si la conexión se ha cerrado pero todavía hay datos sin leer.

Tiene esta sintaxis:
cliente.conectado

El método no acepta argumentos y devuelve "verdadero" si está conectado; de lo contrario devolverá "falso".
client.localPort: Devuelve el número de puerto local al que está conectado el cliente.

Tiene esta sintaxis:
cliente.localPort

client.remoteIP: devuelve la dirección IP del cliente.

Tiene esta sintaxis:
cliente.IP remota

client.remotePort: Devuelve el puerto del host que envió el paquete entrante actual.

Tiene esta sintaxis:
cliente.puertoremoto

client.setConnectionTimeout: establece el tiempo de espera para client.connect y client.stop. El valor inicial es 1000 ms, que se puede reducir para que el programa responda mejor.

Tiene esta sintaxis:
client.setConnectionTimeout (milisegundos)

client.write: escribe datos en el servidor al que está conectado el cliente. Estos datos se envían como un byte o una serie de bytes.

Tiene esta sintaxis:
cliente.write(val)
cliente.write(buf, len)

El método toma como argumento un valor de byte o un búfer que contiene una matriz de bytes.

imprimir: imprime datos en el servidor al que está conectado un cliente. Imprime números como una secuencia de dígitos, cada uno de ellos un carácter ASCII.

Tiene esta sintaxis:
cliente.imprimir(datos)
cliente.print(datos,BASE)

El método toma los datos a imprimir como argumento. También permite especificar la base de los números indicados como DEC para decimales, OCT para octal y HEX para hexadecimal.

client.println: imprime datos seguidos de un retorno de carro y una nueva línea en el servidor al que está conectado el cliente. También imprime números como una secuencia de dígitos, cada uno como un carácter ASCII.

Tiene esta sintaxis:
cliente.println
cliente.println(datos)
cliente.print(datos,BASE)

client.available: devuelve el número de bytes disponibles para leer desde el servidor conectado.

Tiene esta sintaxis:
cliente.disponible

client.read: lee el siguiente byte recibido del servidor al que está conectado el cliente.

Tiene esta sintaxis:
cliente.ler

client.flush: detiene todo hasta que se hayan enviado todos los caracteres de salida en el búfer.

Tiene esta sintaxis:
cliente.flush

client.stop: se desconecta del servidor.

Tiene esta sintaxis:
cliente.detener

Realizar solicitudes HTTP GET utilizando la biblioteca Ethernet
Para enviar una solicitud HTTP GET desde Arduino utilizando la biblioteca Ethernet, necesitará un Arduino con un escudo Ethernet o capacidades Ethernet integradas, como placas basadas en Arduino Portenta H7 o ESP8266/ESP32.

Componentes

  1. placa arduino
  2. Blindaje Ethernet
  3. Cable de ethernet
  4. Un servidor para recibir la solicitud GET

Para fines de demostración, enviaremos una solicitud HTTP GET a httpbin.org. Para hacer esto, conecte el escudo Ethernet a la placa Arduino y conecte el escudo a un enrutador usando el cable Ethernet. Luego, conecta el Arduino a tu computadora y sube el siguiente boceto.

Recuerde reemplazar la matriz MAC con la dirección MAC de su escudo Ethernet, que generalmente está impresa en una etiqueta adhesiva en el escudo. La matriz de servidores debe contener el nombre de dominio del servidor al que realiza la solicitud. Cargue el boceto en Arduino y observe el resultado en el monitor serie del IDE de Arduino.

Realizar solicitudes HTTP POST utilizando la biblioteca Ethernet
Para enviar una solicitud HTTP POST desde Arduino utilizando la biblioteca Ethernet, necesitará el Arduino con un escudo Ethernet o capacidades Ethernet integradas.

Componentes

  1. placa arduino
  2. Escudo Ethernet
  3. Cable de ethernet
  4. Un servidor para recibir la solicitud POST

Para fines de demostración, enviaremos una solicitud HTTP POST a httpbin.org. Conecte el escudo Ethernet a la placa Arduino y conecte el escudo a un enrutador usando el cable Ethernet. Luego conecte el Arduino a su computadora y cargue el siguiente boceto.

Recuerde reemplazar la matriz MAC con la dirección MAC de su escudo Ethernet, que generalmente está impresa en una etiqueta adhesiva en el escudo. La matriz de servidores debe contener el nombre de dominio del servidor al que realiza la solicitud.

En la variable postData, coloque los datos que desea enviar en el formato application/x-www-form-urlencoded, que es el formato estándar para datos POST en formularios web. Cada par clave-valor está separado por un signo (&) y cada clave está separada de su valor por un signo igual (=).

Cargue el boceto en Arduino y observe el resultado en el monitor serie del IDE de Arduino. Cuando se ejecute este boceto, intentará publicar los datos en httpbin.org/post, que refleja los datos publicados en formato JSON.

Cabe señalar que enviar solicitudes HTTP utilizando un simple escudo Arduino y Ethernet es adecuado para aplicaciones básicas, pero para una comunicación más segura a través de Internet, considere usar HTTPS. No es compatible automáticamente con Arduino, pero se puede utilizar con bibliotecas y hardware adicionales como Arduino MKR1000 o ESP8266/ESP32.

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.