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