Nodemcu esp8266 api RESTful 4 Android Proyect Nara.
Node MCU 1.0 (ESP-12E) (ESP8266) Api RESTful 4 Android.
Descripción.
El dispositivo Nodemcu esp8266, puede ser programado, de forma que realice peticiones HTTP con el verbo POST, enviando y recibiendo información en formato JSON, de una API desplegada como un servicio web. De esta forma, la API gestiona los estados de los GPIO’s del dispositivo NodeMCU, los cuales tienen conectados cuatro diodos led, GPIOs D1, D2, D3, D4, almacenándolos en una base de datos. Al realizar modificaciones en dichos estados, mediante la aplicación android, realizando una conexión a la API, actuaríamos sobre los GPIO’s del dispositivo.
Necesitamos que el dispositivo Nodemcu esp8266 se encuentre asociado a una red local mediante el módulo de acceso WiFi incorporado, asignándole una IP de forma automática. Necesitamos incorporarle en la programación los datos de la red wifi y la token de seguridad encriptada con sha1.
La aplicación android también necesita acceso a Internet, bien en la propia red local o en otra diferente. Nos solicita los datos del host donde se encuentra desplegada la API y la token de seguridad sin codificar, ya que este paso lo realiza la aplicación. Se ha redirigido el botón atrás con un cuadro de diálogo para que el usuario confirme si desea salir de la aplicación o permanecer en ella.
Cada vez que la aplicación realiza una petición de encendido o apagado de uno de los leds conectados a los puertos GPIOs, envía un JSON con el siguiente formato:
{ "operacion":"cambiarestado", "token":"94a9816e920383727d9g4725b76dad6184e61d9g", "gpio":"D1", "estado":"ON" }
Si la petición se ha procesado correctamente, devuelve el siguiente JSON:
{ "resultado":{ "estado":"Correcto", "mensaje":"GPIO Actualizado." } }
Si el GPIO ya se encuentra en el estado el cual se solicita, no se realiza cambio de estado y obtenemos el siguiente JSON:
{ "resultado":{ "estado":"Error", "mensaje":"El GPIO No Requiere Actualizacion." } }
Si la token de seguridad introducida no es correcta, no se realiza cambio de estado en el GPIO y se devuelve el siguiente JSON:
{ "operacion":"cambiarestado", "token":"94a9816e920383727d9g4725b76dad6184e61d9g", "gpio":"D1", "estado":"ON" }
Respondiendo:
{ "resultado":{ "estado":"Error", "mensaje":"Fallo en Token de Seguridad." } }
La Api se encarga de identificar las operaciones y redireccionar a los métodos oportunos para conseguir realizar un cambio de estado o verificar un estado. Escrita en el lenguaje de programación PHP, la base de datos MySql y el formato de intercambio de información, los datos de la aplicación, es Json, respondiendo al verbo POST, ejecutando las operaciones indicadas en el JSON. Incorpora una clase de conexión a la base de datos utilizando PDO, evitando así la Inyección de Sentencias SQL y manteniendo además los métodos de conexión **protected**. Incorpora un sistema de seguridad en forma de token encriptado en sha1, para evitar accesos no deseados, aun así respondiendo la API con el error en token de segridad. Así mismo cuenta con un archivo de configuración del virtualhost evitando el acceso a los archivos y demás configuraciones. Aunque el verbo GET también está implementado, no realiaza función.
En cuanto a la programación almacenada en el dispositivo Nodemcu esp8266, necesita incorporar el SSID y la clave de la red wifi a la que se desea conectar, la token de seguridad, el host y el puerto para el acceso a la API, se configura el dispositivo Nodemcu esp8266 en una red local mediante el módulo de acceso WiFi incorporado, asignándole una IP de forma automática.
Mediante el acceso por HTTP, conectamos a una API RESTful alojada en un servidor en internet, enviando y recibiendo los datos en formato JSON. Con la información recibida queremos controlar cuatro GPIO, los cuales tienen conectados cuatro diodos led. El verbo utilizado en las peticiones a la API REST es POST. Mediante este verbo identificamos las operaciones y obtenemos la salida de datos correspondiente.
Se realizan dos peticiones POST. En la primera petición enviamos el JSON:
{ "operacion":"estados", "token":"94a9816e920383727d9g4725b76dad6184e61d9g" }
Y recibimos el JSON con los estados de los GPI’s:
{ "D0":{ "gpio":"D0", "estado":"OFF" }, "D1":{ "gpio":"D1", "estado":"ON" }, "D2":{ "gpio":"D2", "estado":"OFF" }, "D3":{ "gpio":"D3", "estado":"OFF" }, "D4":{ "gpio":"D4", "estado":"OFF" }, "D5":{ "gpio":"D5", "estado":"OFF" }, "D6":{ "gpio":"D6", "estado":"OFF" }, "D7":{ "gpio":"D7", "estado":"OFF" }, "D8":{ "gpio":"D8", "estado":"OFF" }, "D9":{ "gpio":"D9", "estado":"OFF" }, "D10":{ "gpio":"D10", "estado":"OFF" } }
En la segunda petición se envían las confirmaciones de estado de los GPIO’s si se ha producido algún cambio. Si no se ha producido ninguna modificación de estado, esta petición no se realiza. Se envía el siguiente JSON. Solo sonsideramos los GPIOs de los Leds activos:
{ "operacion":"confirmacion", "token":"94a9816e920383727d9f4725b76dad6184e61d9f", "D1":"OFF", "D2":"OFF", "D3":"OFF", "D4":"OFF" }
Recibimos la confirmación en JSON:
{ "resultado":{ "estado":"Correcto", "mensaje":"GPIO Confirmado." } }
La aplicación Android se ha desarrollado en el lenguaje de programación Java, con la ayuda del IDE Android Studio con Gradle.
El Servicio Web Api RESTful escrito en PHP, con el gestor de base de datos MySql on PDO para la persistencia de los estados de los GPIO’s y el intercambio de la información en formato Json, ayudándonos del IDE NetBeans.
La aplicación Arduino se ha desarrollado con la ayuda del IDE Arduino IDE, y con las librerias del proyecto Arduino core for ESP8266 WiFi chip y JSON library for embedded systems.
Finalmente comentar que el proyecto está basado en el que desarrollamos anteriormente con este dispositivo, aumentando la complejidad al incorporar la captura de los datos en el formato JSON y el diseño de la API RESTful. Tiene, por tanto, un gran potencial, debido a la facilidad de ofrece la API de interaccionar con el dispositivo de forma independiente a su programación y de la propia API, debiendo conocer únicamente el modelo de envío de la información en formato JSON con el verbo POST, y el dominio en internet de la API.
Novedades versión 1.1.0.0:
⇒ Corregida la salida inesperada de la aplicación android al pulsar el botón atras.
⇒ En desarrollo lectura de datos de sensor de temperatura y humedad DHT11.
Implementaciones Nodemcu esp8266.
⇒ Operaciones soportadas on POST: ‘estados’, ‘cambiarestado’, ‘confirmacion’, ‘confirmarestado’ y ‘saludo’.
⇒ Fuente de iconos Material Design.
⇒ Lib com.android.support:design:24.2.1 para Design Support Library en Android Studio.
⇒ Lib com.android.volley:volley:1.0.0 para comunicación en Android Studio.
⇒ Lib esp8266.com para soporte del ESP8266 en Arduino IDE.
⇒ Lib ArduinoJson para JSON decoding y JSON encoding en Arduino IDE.
Dependencias.
⇒ Icono e imágenes de títulos de la aplicación: Nara
⇒ Iconos Material Desing: Iconos Material Desing
⇒ Librería Design Support Library: Design
⇒ Librería Volley: Volley
⇒ Arduino core for ESP8266 WiFi chip: esp8266.com / ESP8266WiFi
⇒ An elegant and efficient JSON library for embedded systems: ArduinoJson
Capturas.
Portada:
Datos del Host:
Selección del GPIO:
Respuesta de la API del cambio de estado:
Respuesta de la API de confirmación por parte del Nodemcu esp8266 del cambio de estado:
Mas información
Puede ver mas proyectos de la Nodemcu esp8266:
http://blog.antoniohorrillo.com/iotmcu01/
Vídeo
Audio Track
Invisible by Vibe Tracks.
Licencia.
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007. Ver el archivo LICENSE.
Nara by Antonio Horrillo.
Hola! espero estés bien, mi Nombre es
Eduardo, actualmente curso el 2º semestre en la Uni, quería ver si podrías ayudarme .
Me encuentro haciendo un proyecto con Nodemcu Esp8266, el cual consiste en 2 modos, el modo Auto: mantendrá temperaturas dentro de un rango, mediante mediciones de temperatura por un sensor, el otro modo es el manual, en dónde el usuario decide si encender o no los ventiladores, para ello estoy ocupando un servidor local usando una red en el área dónde lo implementare, por ahora ya puedo hacer inserción de datos a la DB mysql (Cabe mencionar que estoy usando el Método POST), pero no logro leer los datos de mi tabla dónde me indica si los ventiladores están encendidos o apagados, por el momento no he encontrado información para solucionarlo, si tuvieras una guía o algo de documentación que pueda leer para lograr mi objetivo te lo agradecería mucho.