ESP8266 - MySQL

Este tutorial le enseña cómo usar el ESP8266 para insertar o actualizar datos en una base de datos MySQL, o leer los datos de la base de datos MySQL.

ESP8266 NodeMCU MySQL

Hardware Requerido

1×ESP8266 NodeMCU
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×Protoboard
1×Cables Puente
1×(Opcional) Conector de Alimentación DC
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

ESP8266 - MySQL

Hay dos términos en MySQL que los principiantes suelen confundir: Base de datos de MySQL y servidor de MySQL. Son diferentes. Sin embargo, si eres principiante, puedes suponer que son lo mismo. Más tarde, encontrarás las diferencias en tu proceso de aprendizaje.

ESP8266 puede interactuar con la base de datos MySQL de dos maneras:

  • Directamente: ESP8266 se conecta directamente al servidor MySQL y interactúa con él usando el protocolo MySQL
  • Indirectamente: ESP8266 se conecta indirectamente al servidor MySQL a través de un servidor web usando el protocolo HTTP/HTTPS

¿Cuál es el mejor para el ESP8266? ¡Vamos a averiguarlo!

ESP8266 interactúa directamente con el servidor MySQL

ESP8266 NodeMCU directamente a MySQL

Interactuar con MySQL directamente parece sencillo, pero hay muchas desventajas:

  • Tenemos que conceder permisos de acceso remoto a una cuenta de usuario de MySQL ⇒ Esto es arriesgado desde el punto de vista de la seguridad, incluso si concedemos privilegios limitados a la cuenta de usuario.
  • ESP8266 DEBE almacenar y enviar consultas MySQL al servidor MySQL ⇒ Necesita escribir mucho código para ESP8266, y también agotar los recursos de ESP8266 (uso de memoria y CPU).
  • ESP8266 DEBE procesar una respuesta MySQL compleja (tamaño de datos muy grande en algunos casos) ⇒ Esto puede hacer que ESP8266 se quede sin memoria.
  • El servidor MySQL debe procesar los datos sin procesar ⇒ aumenta la complejidad del script de MySQL.
  • La mayoría de las bibliotecas de MySQL para ESP8266 no admiten SSL/TLS ⇒ Los datos y el nombre de usuario y la contraseña se envían sin cifrado ⇒ otro problema de seguridad.

ESP8266 interactúa indirectamente con el servidor MySQL mediante HTTP/HTTPS

Interactuar con MySQL indirectamente a través de HTTP/HTTPS soluciona todos los problemas del acceso directo.

Cómo funciona

  • Step 1: ESP8266 incluye los datos para la solicitud HTTP/HTTPS y envía la solicitud al servidor web
  • Step 2: El servidor web ejecuta un script PHP que maneja la solicitud de ESP826826
  • Step 3: El script PHP extrae los datos de la solicitud HTTP, procesa los datos y luego interactúa con la base de datos MySQL.
  • Step 4: El script PHP procesa el resultado y devuelve solo el resultado necesario al ESP8266 mediante la respuesta HTTP
ESP8266 NodeMCU MySQL HTTP

Vamos a instalar el servidor MySQL, un servidor web y PHP en la PC. De hecho, podemos instalarlo en un servidor dedicado o en un servicio en la nube como AWS EC2.

A continuación se muestra cómo la vía indirecta resuelve los problemas de la vía directa.

  • Podemos instalar el servidor HTTP y el servidor MySQL en el mismo servidor físico. Podemos restringir el acceso a una cuenta de usuario de MySQL (p. ej. acceso localhost ÚNICO) ⇒ seguro
  • El nombre de usuario y la contraseña de la cuenta de MySQL se almacenan en el servidor ⇒ seguro.
  • Los datos son procesados por un script PHP ⇒ Esto reduce la carga y la complejidad para ESP8266 y el servidor MySQL.
  • El script PHP puede procesar los datos mucho más fácilmente que el código ESP8266 y el script MySQL ⇒ Simplificar el código ESP8266 y el script MySQL.
  • El script PHP puede procesar los datos y enviar solo los datos necesarios a ESP8266 (Paso 4) para evitar que ESP8266 se quede sin memoria.
  • ESP8266 puede realizar solicitudes HTTPS fácilmente ⇒ los datos están cifrados.

Tenga en cuenta que la autenticación entre ESP8266 y el servidor web debe ser independiente de la autenticación de MySQL. Por ejemplo, el nombre de usuario y la contraseña de HTTP deben ser diferentes de los de MySQL.

Debido a esas ventajas, este tutorial utilizará el método indirecto.

ESP8266 a MySQL mediante HTTP/HTTPS

A continuación se muestran los pasos que debemos realizar:

  • Instalando el paquete XAMPP que incluye el servidor MySQL, el servidor web y PHP en tu PC
  • Creando una cuenta de usuario de MySQL
  • Creando una base de datos MySQL
  • Creando una tabla MySQL
  • Escribiendo uno o más archivos de script PHP
  • Escribiendo código para ESP8266

1. Instalación del servidor MySQL, del servidor web y de PHP en tu PC

  • Descarga e instala XAMPP desde este enlace. Después de la instalación, verifica la carpeta C:\xampp\htdocs en tu PC. Aquí es donde colocas código PHP (ver más adelante).
  • Abre el Panel de Control de XAMPP
  • Haz clic en los botones Iniciar para habilitar MySQL y el servidor web (como se muestra en la imagen de abajo)
ESP8266 NodeMCU XAMPP

2. Creación de una cuenta de usuario de MySQL

Crearemos una cuenta de MySQL con permisos de acceso solo desde localhost.

  • Incluso si los atacantes conocen el nombre de usuario y la contraseña, no pueden acceder a su base de datos MySQL a menos que tomen el control de su PC.
  • Estas credenciales (nombre de usuario y contraseña) serán utilizadas por PHP para conectarse a la base de datos MySQL.

Este tutorial crea una cuenta de usuario de MySQL con un nombre de usuario y una contraseña que son ESP8266 y newbiely.com, respectivamente:

  • Abre el Símbolo del sistema en tu PC. No lo cierres hasta el final del tutorial.
  • Escribe el siguiente comando en el Símbolo del sistema:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\YOUR_USER>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Por defecto, MySQL tiene la cuenta root sin contraseña. Se recomienda encarecidamente establecer la contraseña para la cuenta root (p. ej. YOUR_ROOT_PASSWORD) por motivos de seguridad. Escriba el siguiente comando en el símbolo del sistema:
mysqladmin -u root password YOUR_ROOT_PASSWORD
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password YOUR_ROOT_PASSWORD C:\xampp\mysql\bin>
  • Escriba el siguiente comando en el Símbolo del sistema para iniciar sesión en el servidor MySQL:
mysql.exe -u root -p
  • Escribe TU_ROOT_PASSWORD y pulsa Enter
Command Prompt
C:\xampp\mysql\bin>mysql.exe -u root -p Enter password: ****************** Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 10.4.6-MariaDB mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
  • Creamos una cuenta de usuario de MySQL con el nombre de usuario ESP8266 y la contraseña newbiely.com, respectivamente, copiando los comandos siguientes y pegándolos en el símbolo del sistema:
CREATE USER 'ESP8266'@'localhost' IDENTIFIED BY 'newbiely.com'; GRANT ALL PRIVILEGES ON *.* TO 'ESP8266'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'ESP8266'@'localhost' IDENTIFIED BY 'newbiely.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'ESP8266'@'localhost' WITH GRANT OPTION; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]>

Has creado con éxito una cuenta de usuario de MySQL. Escribe el nombre de usuario y la contraseña. Se utilizará en el script de PHP.

3. Creación de una base de datos MySQL

Crea una base de datos db_esp8266 escribiendo el siguiente comando en el Símbolo del sistema:

CREATE DATABASE db_esp8266 CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';
Command Prompt
MariaDB [(none)]> CREATE DATABASE db_esp8266 CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci'; Query OK, 1 row affected (0.003 sec) MariaDB [(none)]>

4. Creación de una tabla de MySQL

Crea una tabla tbl_temp copiando los comandos siguientes y pégala en el Símbolo del sistema:

USE db_esp8266; CREATE TABLE tbl_temp ( temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, temp_value FLOAT DEFAULT 0.00, PRIMARY KEY (temp_id) );
Command Prompt
MariaDB [(none)]> USE db_esp8266; Database changed MariaDB [db_esp8266]> MariaDB [db_esp8266]> CREATE TABLE tbl_temp ( -> temp_id INT UNSIGNED NOT NULL AUTO_INCREMENT, -> temp_value FLOAT DEFAULT 0.00, -> PRIMARY KEY (temp_id) -> ); Query OK, 0 rows affected (0.044 sec) MariaDB [db_esp8266]>

6. Escribir archivos de scripts PHP

Crea un insert_temp.php usando cualquier editor de texto (p. ej. Notepad/Notepad++). Escribiremos el script en este archivo para extraer el valor de la temperatura de la solicitud HTTP e insertar ese valor en la base de datos.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "ESP8266"; $password = "newbiely.com"; $database_name = "db_esp8266"; // Create MySQL connection fom PHP to MySQL server $connection = new mysqli($servername, $username, $password, $database_name); // Check connection if ($connection->connect_error) { die("MySQL connection failed: " . $connection->connect_error); } $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)"; if ($connection->query($sql) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $sql . " => " . $connection->error; } $connection->close(); } else { echo "temperature is not set in the HTTP request"; } ?>
  • Coloca este archivo dentro de la carpeta C:\xampp\htdocs.
  • Obtén la dirección IP de tu PC. Si no sabes cómo hacerlo, búscala en Google.
  • Prueba el código PHP abriendo un navegador web (p. ej. Chrome) y accede a este enlace: http://192.168.0.19/insert_temp.php?temperature=26.2. Ten en cuenta que debes reemplazar la dirección IP anterior por la de tu PC.
  • El navegador web se muestra a continuación:
Prueba de MySQL
  • Verifique si los datos están almacenados en la base de datos escribiendo el siguiente comando en el Símbolo del sistema:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_esp8266]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_esp8266]>

Como puedes ver, la temperatura de 26.2 está almacenada en la base de datos. El siguiente paso es escribir código para ESP8266 que realice una solicitud HTTP al servidor web en tu PC.

7. Escribe código ESP8266

El código ESP8266 de abajo realiza una petición HTTP a tu PC para insertar una temperatura de 30,5 °C en la base de datos.

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-mysql */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* WIFI_SSID = "YOUR_WIFI_SSID"; // CHANGE IT const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"; // CHANGE IT String HOST_NAME = "http://192.168.0.19"; // change to your PC's IP address String PATH_NAME = "/insert_temp.php"; String queryString = "?temperature=30.5"; void setup() { Serial.begin(9600); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); Serial.println("Connecting"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.print("Connected to WiFi network with IP Address: "); Serial.println(WiFi.localIP()); WiFiClient client; // Create a WiFiClient object HTTPClient http; // Use ::begin(WiFiClient, url) method http.begin(client, HOST_NAME + PATH_NAME + queryString); //HTTP int httpCode = http.GET(); // httpCode will be negative on error if (httpCode > 0) { // file found at server if (httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println(payload); } else { // HTTP header has been sent and Server response header has been handled Serial.printf("[HTTP] GET... code: %d\n", httpCode); } } else { Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } void loop() { // Your loop code here (if needed) }

Pasos R\u00e1pidos

  • Si es la primera vez que usas ESP8266, consulta cómo configurar el entorno para ESP8266 en Arduino IDE.
  • Realiza el cableado como en la imagen de arriba.
  • Conecta la placa ESP8266 a tu PC mediante un cable micro USB
  • Cambia la dirección IP en el código por la dirección IP de tu PC
  • Compila y sube el código a ESP8266
  • Abre el Monitor Serial en el IDE de Arduino
  • El resultado en el Monitor Serial
COM6
Send
Connected to server HTTP/1.1 200 OK Date: Tue, 12 Jan 2021 07:52:22 GMT Server: Apache/2.4.39 (Win64) OpenSSL/1.1.1c PHP/7.3.8 X-Powered-By: PHP/7.3.8 Content-Length: 31 Connection: close Content-Type: text/html; charset=UTF-8 New record created successfully disconnected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Verifique si los datos están almacenados en la base de datos utilizando el siguiente comando en la Línea de comandos:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_esp8266]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | | 2 | 30.5 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_esp8266]>

Como se puede ver, la temperatura de 30,5 está almacenada en la base de datos.

Cómo ESP8266 inserta, actualiza o obtiene datos desde y hacia la base de datos MySQL

El ejemplo anterior muestra cómo insertar datos en la base de datos MySQL. Es similar para actualizar y leer datos de la base de datos. Solo necesitas modificar la consulta de MySQL en el código PHP. Puedes aprender más en W3Schools.com

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!