Leyendo desde un servidor Web con ESP8266
Este día me pidieron ayuda para leer información desde una página Web alojada en una Azure Webapp por medio de un Arduino, el formato de la información era muy simple, el cuerpo de la página siempre serían cuatro números enteros cada uno en su propia línea, como se muestra a continuación:
2
1
0
5
El problema puede resolverse fácilmente por medio de la clase WiFiClient, esta clase contiene toda la funcionalidad para poder realizar una petición http, https no está soportado por esta clase; generalmente se dice que Arduino no soporta https, pero esto no necesariamente es cierto, en el caso de actualizaciones OTA es posible acceder a los firmwares por medio de https pero eso queda para ser mostrado en otro artículo :) Lo primero que debe conocerse es la estructura de una petición http, esta consta de varias líneas de texto que proveen información, la primera y más importante de ellas esta compuesta por verbo recurso protocolo/versión, en algunas ocasiones se acostumbra definir el host dentro del recurso, sin embargo es más apropiado agregarlo como un header separado en otra línea, el request más básico que podemos es hacer es el siguiente:
GET /data.aspx HTTP/1.1
Host: someapp.azurewebsites.net
A lo que nuestra página Web respondería con algo como:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 7
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/8.0
X-AspNetMvc-Version: 5.2
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=fa2c800b0235ac66fafa2c8de8663dc33057be0e5a83277ac66faac66fa9ad4dc;Path=/;HttpOnly;Domain=someapp.azurewebsites.net
Date: Tue, 25 Jul 2017 03:55:03 GMT
2
1
0
5
El código necesario para leer esa respuesta se lista a continuación:
//Definición de variables
String buffer;
bool flag = false;
int count = 0;
int values[4];
WiFiClient c;
//Conectando al servidor
if (c.connect("someapp.azurewebsites.net", 80))
{
//Ejecutando petición
c.println("GET /data.aspx HTTP/1.1");
c.println("host: someapp.azurewebsites.net");
c.println();
//Leyendo resultados línea por línea
buffer = c.readStringUntil('\n');
while (buffer.length() > 0)
{
if (flag && count < 4)
{
//Al finalizar los headers leer cada uno de los 4 valores
values[count] = c.parseInt();
count++;
}
else
{
//Leyendo las líneas con los headers
buffer = c.readStringUntil('\r');
//Verificando si finalizaron los headers
if (buffer.length() == 1)
{
flag = true;
count = 0;
}
}
}
}
//Los valores están almacenados dentro del arreglo values
Eso es todo por ahora, espero que les sea de utilidad, hasta la próxima!
--Rp