Envío y almacenamiento de datos en internet con ESP32


Actualización: Ya se corrigió el error de la página por el cual no se podía ver el archivo rellenado por ustedes símplemente haciendo clic en el link. Ahora funciona correctamente. Gracias a todos los que escribieron notificando este problema. Entre todos hacemos Pablin!

La facilidad de conexión a internet que tienen los componentes de espressif nos invitan a probar un sinnúmero de variantes a la hora de registrar datos en la nube. He visto infinidad de opciones desde el MQTT hasta MySQL y con servicios que van desde el "pruebe gratis hasta que se acostumbre y le pidamos dinero" hasta opciones que desde el vamos piden tarjeta de crédito. Incluso he visto videos en internet de un cordobés muy bien explicados pero que arrancan con "Ahora montamos tal cosa luego nos apuntamos en tal web, luego creamos una cuenta tal, luego ponemos esto y ponga y ponga y ponga y meta poner cosas para por ahí una aplicación simple que no requería mas que un HOLA MUNDO por así decirlo. Así que eche mano a un gran amigo que me ayudó del lado servidor con un programa en php el cual lo único que hace es recibir por get (ya veremos que es eso) un dato y agregarlo al final de un archivo de texto alojado en la misma carpeta que el archivo php. Al ser un archivo de texto ya nomás desde cualquier navegador se lo puede ver! Y ni hablar desde otro ESP32... Nobleza obliga: Muchas gracias Ing. Eduardo Ruffo de ServProf Solutions por tu colaboración con este laburo! Cualquier variante de este soft que necesiten no duden en contactar a Eduardo que de seguro encontrará la mejor y mas accesible solución a medida de cada quien. 

No tenemos un gran circuito esta vez! Sólo dos pulsadores conectados en los pines 23 y 19 del ESP32. Debido a que en mi protoboard tenía ya colocados de otros tantos circuitos que hice para el sitio un pulsador colorado y otro negro los llame botonYojo al del pin 23 en honor a como llaman al Rojo pronunciando la R como Y en algunos pueblos de mi país y al otro que es negro lo llame botonNegro en el sketch que pueden ir bajando haciendo clic acá. Quiero volver sobre lo aclarado en el párrafo inicial del texto esto es algo simple y por tratarse de algo simple es que decidí utilizar valores literales para los seteos de WIFI si bien desde hace un par de semanas subí al sitio una librería que permite establecer los parámetros del WIFI a través de la terminal serie del ESP32 lo cierto es que como esto es una demo de otro tipo de cosa mientras mas simple sea el sketch mejor y evitando la librería miWIFI.h es la mejor forma de hacerlo. Tampoco tenemos la pantalla LCD del celular viejo, no necesitamos ver nada mas que el LED el cual parpadea al recibir datos provenientes del servidor web. La clave de esto radica en la nube y no en el ESP, es un programa hecho en php ubicado en la dirección www.pablin.com.ar/espressif/enviaget/prueba/control.php?dato=aqui_el_dato_a_enviar de echo si presionan el enlace el programa control.php se va a encargar de guardar en un archivo de texto llamado control.txt la fecha y hora en formato militar (AAAAMMDDHHMMSS) un espacio de separación y todo lo que se escriba a continuación del igual en la url o dirección web. A ese tipo de intercambio o envío de datos hacia un destino en internet se lo denomina GET y es del tipo no seguro o visible puesto que basta con mirar el tráfico web para saber que se envía por lo que no es muy recomendable para otras aplicaciones mas allá del monitoreo de datos no sensibles o en otras palabras no es lo mejor a la hora de enviar datos que puedan comprometer la seguridad. Donde quedan los datos guardados ? en este archivo de texto. Volviendo al sketch de nuestro ESP32 lo único que tenemos que hacer entonces es pedir al servidor remoto, en este caso el de Pablin! que nos traiga (GET) la página web control.php y pasarle los parámetros luego del ?dato= y eso lo hace el siguiente fragmento de código:

    String cadena="GET /espressif/enviaget/prueba/control.php?dato=";
    cadena=cadena + WiFi.macAddress() + "%20";
    if(boton==1) cadena=cadena + "YOJO";
    if(boton==2) cadena=cadena + "NEGRO";
    cadena=cadena + " HTTP/1.1";

    if (clienteWEB.connect(servidor, 80))
    {
        clienteWEB.println(cadena);
        clienteWEB.println("Host: www.pablin.com.ar");
        clienteWEB.println("Connection: close");
        clienteWEB.println();
    }

Se declara un objeto String llamado cadena conteniendo inicialmente la palabra GET la cual es clave para que el servidor remoto identifique la operación a realizar como el pedido de una página web seguidamente se indica que página se quiere pedir  donde se encuentra (podría decirse en que carpeta aunque se denomina path). Pero no termina ahí también se especifica posteriormente al archivo a solicitar un parámetro a través del separador ? el parámetro es dato y el contenido se envía luego del signo = y hasta ahí la primer carga de contenido del objeto String llamado cadena. Posteriormente se le suma a dicha cadena al final de lo que ya tiene la dirección MAC o física del módulo WIFI del ESP32 y un espacio no separante (un espacio de texto) por ello el %20. Si aquí dejásemos un espacio entendería el servidor remoto que se trunca la cadena. Porqué envío la MAC ? Para poder identificar cada uno que pruebe y quiera saber si le funciona si es así o no !!! Sinó sólo saldría YOJO o NEGRO y ya! En cambio así conociendo cada uno la MAC de su ESP32 fácilmente puede identificar su envío de datos. Por último pero no menos importante se le anexa ya si truncado de la url el tipo de medio HTTP en su versión 1.1 el mas estándar de todos. Y luego a enviarlo al servidor porque hasta ahora solo se había armado la url mas no se envió nada, ni siquiera nos conectamos al servidor. Primero se conecta y luego estando ya la conexión establecida se envía la cadena, la confirmación formal de host de destino, la solicitud de pronta desconexión tras el último envío de servidor a cliente y listo. Es todo lo que debemos mandar nosotros hacia el servidor. Luego viene esta porción del sketch.

    while (clienteWEB.connected())
    {
        while (clienteWEB.available())
        {
            Serial.write(clienteWEB.read());
            digitalWrite(LED, !digitalRead(LED));
        }
    }

Básicamente lo que hace es permanecer aquí en tanto el servidor remoto no nos corte la conexión y en tanto dure esa conexión esperamos que lleguen datos en forma de bytes. Cada byte recibido es reenviado a la PC local por medio del terminal serie para que veamos que bonito es! Y también cambiamos el estado del LED en consecuencia este debería parecer que titila pero casi no se lo ve porque todo es muy rápido. Luego que el servidor nos desconecta nuestro sketch detiene el cliente web y por último espera que ambos pulsadores estén sueltos para evitar envíos recursivos innecesarios.

En la terminal serie del PC vemos algo como esto, el arranque normal del ESP32 seguido de la conexión a internet la cual va reportando por este medio para ver su progreso y detectar posibles conflictos que eviten la conexión y una vez pulsado el botón, en este caso el colorado y tras recibir el servidor remoto nuestra petición nos devuelve desde HTTP/1.1 200 OK donde básicamente nos dice que cumplimos las formalidades del estándar y acepta lo enviado y ya luego toma el mando el intérprete de php del servidor indicando datos que consideran importantes que sepamos ¿? y vemos casi al final un reflejo de lo que queda guardado en el archivo de texto a modo de confirmación. el d8 y el 0 no se a que se deban. No logré identificarlo pero en el archivo de texto no queda, solo lo devuelve por internet.

Aquí vemos un segmento del navegador web donde vemos el archivo de texto y el contenido producto de esta pulsación en particular dando inicio al mismo y al momento de editar esta nota único contenido. Veremos con el tiempo que cantidad y que datos termina albergando! Por favor, sean educados y discretos.

Les vuelvo a comentar que no es necesario tener grandes sofisticaciones informáticas para hacer uso de esto es mas, con cualquier página web tipo gratuita de subdominio que tenga php (el 99,9% de los servidores lo tienen) sirve y sobra!. Si necesitan un programa en php en particular personalizado para ustedes no duden en contactar al Ing. Ruffo que con gusto los va a saber ayudar.

 

Pablo Canello, 03/05/2020