OBJETIVOS
En esta práctica vamos a utilizar el procesador ESP8266, conectándolo como cliente de un servidor WEB, para acceder a la información que le pueda suministrar, ya sea porque está almacenada en el propio servidor o porque sea accesible desde el mismo.
Utilizaremos dos ejemplos sencillos:
MATERIAL NECESARIO
CONCEPTOS BÁSICOS
Los pasos para establecer una conexión como cliente son los siguientes:
Conexión Wi-Fi
En primer lugar se debe establecer la conexión con el punto de acceso la red Wi-Fi (router), para acceder a Internet. El modo de conexión es Station y está explicado detenidamente en la siguiente práctica.
Selección del servidor
Una vez establecida la conexión a la red, el cliente se debe conectar con el servidor específico. La dirección WEB del servidor se declara en la variable host:
const char * host = " www.vermiip.es" ;
El servidor elegido es www.vermiip.es, que es una página de Internet que permite visualizar nuestra IP pública. Esta elección se ha hecho para extraer en el segundo ejemplo el dato concreto de nuestra IP pública del contenido de la página WEB.
Inicialización del Cliente
Continuamos inicializando el cliente que va a conectar con el servidor. El nombre que asignamos a nuestro cliente es: client_1.
WiFiClient client_1;
Establecimiento de la conexión con el servidor
El siguiente paso es establecer la conexión entre el cliente y el servidor a través de un puerto. Utilizaremos el puerto 80, que es un puerto estándar para comunicaciones entre cliente y servidor.
if (client_1.connect(host, 80)) { // estamos conectados con el servidor (host www.vermiip.es)! } else { // la conexión ha fallado }
Petición de datos
Si la conexión con el servidor se a realizado correctamente, debemos realizar una petición al servidor para que se realice envío de la información requerida (en nuestro caso el código de la página WEB). Esto se hace utilizando una solicitud tipo HTTP GET, como aparece a continuación:
client.print(String("GET /") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n" );
Lectura de la respuesta del servidor
Mientras la conexión está activa: while (client.connected()), podemos leer línea a línea de la página WEB alojada en el servidor e imprimirla en el Puerto Serie del IDE de Arduino.
El separador entre líneas es el salto de línea (\n).
while (client.connected()) { if (client.available()) { String line = client.readStringUntil('\n'); Serial.println(line); } }
La instrucción if (client.available()), comprueba si queda información en el servidor. Hasta que no se finaliza la transmisión de datos no se finaliza el bucle.
SKETCH PARA VER EL CÓDIGO HTML DE LA PÁGINA www.vermiip.es
El sketch a a utilizar para mostrar el código de la página WEB www.vermiip.es será el siguiente:
/* Conexión de un procesador ESP8266 como cliente de un SERVIDOR WEB por Dani No www.esploradores.com Crea una conexión en modo cliente con un servidor y permite mostrar el código de una página WEB El servidor utilizado (host) es www.vermiip.es Este código de ejemplo es de público dominio. */ #include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi const char* ssid = "-----------"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos. const char* password = "-----------"; //Indicamos la contraseña de de red WiFi const char* host = "www.vermiip.es"; //Declaramos el servidor de conexión void setup() { Serial.begin(115200); //Inicializamos el Puerto Serie Serial.println(); Serial.printf("Connecting to %s ", ssid); //Inicializamos la conexión Wi-Fi en modo Station WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); } void loop() { WiFiClient client; //Inicializamos el cliente (client) Serial.printf("\n[Conectando a %s ... ", host); //Establecemos la conexión con el servidor if (client.connect(host, 80)) { Serial.println("conectado]"); Serial.println("[Enviando peticion]"); //Enviamos la petición de datos client.print(String("GET /") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n" ); Serial.println("[Respuesta:]"); //Leemos la respuesta del servidor while (client.connected()) { if (client.available()) { String line = client.readStringUntil('\n'); Serial.println(line); } } client.stop(); //Finalizamos la conexión con el servidor Serial.println("\n[Desconectado]"); } else { Serial.println("conexion con el servidor no lograda!]"); client.stop(); } delay(10000); }
Ejecutando el sketch podremos ver el código HTML de la página, que quedará como en la siguiente imagen.
Si pegamos el código HTML en un visor como Real-time HTML Editor o lo grabamos en un fichero con extensión HTML, generado por un editor de texto y lo visualizamos con un navegador como Internet Explorer, Mozilla, Google Chrome… podremos ver la página WEB como se ve cuando se accede a través de un navegador a www.vermiip.es.
SKETCH PARA EXTRAER EL EL DATO DE NUESTR IP PÚBLICA DE www.vermiip.es
La modificación del anterior skech para extraer datos de nuestra IP pública del contenido del código HTML de es sumamente sencilla.
Únicamente tendremos que hacer una búsqueda de la cadena de texto que los contiene y extraer el dato cuando localicemos su posición.
Para ello seguiremos el siguiente procedimiento:
Por tanto, únicamente será necesario sustituir la línea 51 del anterior sketch por las siguientes:
if (line.substring(line.indexOf('T'),line.indexOf('T')+24) == "Tu IP pública es:") { Serial.println(line.substring(line.indexOf(':')+2,line.length()-5)); }
El sketch completo quedaría como el siguiente:
/* Conexión de un procesador ESP8266 como cliente de un SERVIDOR WEB por Dani No www.esploradores.com Crea una conexión en modo cliente con un servidor y extrae la IP pública del punto de acceso (router) El servidor utilizado (host) es www.vermiip.es Este código de ejemplo es de público dominio. */ #include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi const char* ssid = "-----------"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos. const char* password = "-----------"; //Indicamos la contraseña de de red WiFi const char* host = "www.vermiip.es"; //Declaramos el servidor de conexión void setup() { Serial.begin(115200); //Inicializamos el Puerto Serie Serial.println(); Serial.printf("Connecting to %s ", ssid); //Inicializamos la conexión Wi-Fi en modo Station WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); } void loop() { WiFiClient client; //Inicializamos el cliente (client) Serial.printf("\n[Conectando a %s ... ", host); //Establecemos la conexión con el servidor if (client.connect(host, 80)) { Serial.println("conectado]"); Serial.println("[Enviando peticion]"); //Enviamos la petición de datos client.print(String("GET /") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n" ); Serial.println("[Respuesta:]"); //Leemos la respuesta del servidor while (client.connected()) { if (client.available()) { String line = client.readStringUntil('\n'); if (line.substring(line.indexOf('T'),line.indexOf('T')+24) == "Tu IP pública es:") { Serial.println(line.substring(line.indexOf(':')+2,line.length()-5)); } } } client.stop(); //Finalizamos la conexión con el servidor Serial.println("\n[Desconectado]"); } else { Serial.println("conexion con el servidor no lograda!]"); client.stop(); } delay(10000); }
En el Puerto Serie del IDE de Arduino se imprimirá la IP pública de nuestro punto de acceso (router).
17 Comments
Leave your reply.