ESP32 MySQL

Hướng dẫn này sẽ chỉ bạn cách sử dụng ESP32 để chèn/cập nhật dữ liệu vào cơ sở dữ liệu MySQL, hoặc đọc dữ liệu từ cơ sở dữ liệu MySQL

ESP32 mysql

Linh Kiện Cần Thiết

1×mô-đun phát triển ESP-WROOM-32
1×Alternatively, ESP32 Uno-form board
1×Alternatively, ESP32 S3 Uno-form board
1×Cáp USB Type-C
1×(Tùy chọn) Jack Nguồn DC
1×breadboard (bo mạch thí nghiệm)
1×Dây Jumper
1×(Khuyến nghị) Screw Terminal Expansion Board for ESP32
1×(Khuyến nghị) Breakout Expansion Board for ESP32
1×(Khuyến nghị) Power Splitter for ESP32

Or you can buy the following kits:

1×DIYables ESP32 Starter Kit (ESP32 included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

ESP32 - MySQL

Có hai thuật ngữ trong MySQL mà người mới bắt đầu thường nhầm lẫn: MySQL Database (Cơ sở dữ liệu MySQL)MySQL server (Máy chủ MySQL). Chúng là khác nhau. Tuy nhiên, nếu bạn là người mới bắt đầu, bạn có thể giả định rằng chúng giống nhau. Sau này, bạn sẽ tìm hiểu được sự khác biệt trong quá trình học.

ESP32 có thể tương tác với cơ sở dữ liệu MySQL theo hai cách:

  • Trực tiếp: ESP32 kết nối trực tiếp đến MySQL server và tương tác với MySQL server bằng giao thức MySQL
  • Gián tiếp: ESP32 kết nối gián tiếp đến MySQL server thông qua web server bằng giao thức HTTP/HTTPS.

Cách nào tốt nhất cho ESP32? Hãy cùng tìm hiểu!

ESP32 tương tác trực tiếp với MySQL Server

ESP32 directly to mysql

Tương tác với MySQL trực tiếp có vẻ đơn giản nhưng có rất nhiều nhược điểm:

  • Chúng ta phải cấp quyền truy cập từ xa cho tài khoản người dùng MySQL ⇒ Điều này có rủi ro về bảo mật, ngay cả khi chúng ta cấp quyền hạn chế cho tài khoản người dùng.
  • ESP32 PHẢI lưu trữ và gửi các truy vấn MySQL đến MySQL server ⇒ Cần viết nhiều code ESP32 hơn, và cũng làm cạn kiệt tài nguyên ESP32 (bộ nhớ và CPU).
  • ESP32 PHẢI xử lý phản hồi MySQL phức tạp (dữ liệu có kích thước rất lớn trong một số trường hợp) ⇒ Điều này có thể làm ESP32 hết bộ nhớ
  • MySQL server phải xử lý dữ liệu thô ⇒ tăng độ phức tạp của script MySQL.
  • Hầu hết các thư viện MySQL cho ESP32 không hỗ trợ SSL/TLS ⇒ Dữ liệu và username/password được gửi mà không mã hóa ⇒ vấn đề bảo mật khác.

ESP32 tương tác gián tiếp với MySQL Server qua HTTP/HTTPS

Tương tác với MySQL gián tiếp qua HTTP/HTTPS giải quyết tất cả các vấn đề của truy cập trực tiếp.

Cách hoạt động

  • Bước 1: ESP32 bao gồm dữ liệu vào HTTP/HTTPS request và gửi request đến Web server
  • Bước 2: Web server chạy script PHP để xử lý request từ ESP32
  • Bước 3: Script PHP trích xuất dữ liệu từ HTTP request, xử lý dữ liệu, và sau đó tương tác với cơ sở dữ liệu MySQL.
  • Bước 4: Script PHP xử lý kết quả và chỉ trả về kết quả cần thiết cho ESP32 qua HTTP response
ESP32 mysql http

Chúng ta sẽ cài đặt MySQL server, Web server, và PHP trên PC. Thực tế, chúng ta có thể cài đặt nó trên server chuyên dụng hoặc dịch vụ cloud như AWS EC2.

Dưới đây là cách mà phương pháp gián tiếp giải quyết các vấn đề của phương pháp trực tiếp.

  • Chúng ta có thể cài đặt HTTP server và MySQL server trên cùng một server vật lý, chúng ta có thể cấp quyền truy cập hạn chế cho tài khoản người dùng MySQL (ví dụ: chỉ truy cập localhost) ⇒ bảo mật
  • Username/password của tài khoản MySQL được lưu trữ trên server ⇒ bảo mật.
  • Dữ liệu được xử lý bởi script PHP ⇒ Điều này giảm tải và độ phức tạp cho ESP32 và MySQL server.
  • Script PHP có thể xử lý dữ liệu dễ dàng hơn nhiều so với code ESP32 và script MySQL ⇒ Đơn giản hóa code ESP32 và script MySQL
  • Script PHP có thể xử lý dữ liệu và chỉ gửi dữ liệu cần thiết cho ESP32 (Bước 4) để ngăn ESP32 hết bộ nhớ.
  • ESP32 có thể thực hiện HTTPS request dễ dàng ⇒ dữ liệu được mã hóa.

Lưu ý rằng xác thực giữa ESP32 và Web Server nên độc lập với xác thực MySQL. Ví dụ, HTTP username/password nên khác với MySQL username/password.

Vì những ưu điểm đó, hướng dẫn này sẽ sử dụng phương pháp gián tiếp.

ESP32 Đến MySQL qua HTTP/HTTPS

Dưới đây là các bước mà chúng ta cần làm:

  • Cài đặt gói XAMPP bao gồm MySQL server, Web server, và PHP trên PC của bạn
  • Tạo tài khoản người dùng MySQL
  • Tạo cơ sở dữ liệu MySQL
  • Tạo bảng MySQL
  • Viết một hoặc nhiều file script PHP
  • Viết code ESP32

1. Cài đặt MySQL server, Web server, và PHP trên PC

  • Tải xuống và cài đặt XAMPP từ liên kết này. Sau khi cài đặt, kiểm tra thư mục C:\xampp\htdocs trên PC của bạn. Đây là nơi bạn đặt code PHP (xem phần sau).
  • Mở XAMPP Control Panel
  • Nhấp các nút Start để kích hoạt MySQL và Web server (như hình dưới đây)
ESP32 xampp

2. Tạo tài khoản người dùng MySQL

Chúng ta sẽ tạo một tài khoản MySQL chỉ với quyền truy cập localhost.

  • Ngay cả khi kẻ tấn công biết username/password, họ không thể truy cập cơ sở dữ liệu MySQL của bạn trừ khi họ kiểm soát được PC của bạn.
  • Username/password này sẽ được PHP sử dụng để kết nối đến cơ sở dữ liệu MySQL.

Hướng dẫn này tạo tài khoản người dùng MySQL với username và password lần lượt là ESP32newbiely.com:

  • Mở Command Prompt trên PC của bạn. Không đóng nó cho đến khi kết thúc hướng dẫn.
  • Gõ lệnh sau trên Command Prompt:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\YOUR_USER>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Theo mặc định, MySQL có tài khoản root không có mật khẩu. Rất khuyến khích đặt mật khẩu cho tài khoản root (ví dụ: YOUR_ROOT_PASSWORD) vì lý do bảo mật. Gõ lệnh dưới đây trên Command Prompt:
mysqladmin -u root password YOUR_ROOT_PASSWORD
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password YOUR_ROOT_PASSWORD C:\xampp\mysql\bin>
  • Gõ lệnh dưới đây trên Command Prompt để đăng nhập vào MySQL server:
mysql.exe -u root -p
  • Gõ YOUR_ROOT_PASSWORD và nhấn 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)]>
  • Hãy tạo tài khoản người dùng MySQL với username và password lần lượt là ESP32newbiely.com bằng cách sao chép các lệnh dưới đây và dán vào Command Prompt:
CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.com'; GRANT ALL PRIVILEGES ON *.* TO 'ESP32'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'ESP32'@'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)]>

Bạn đã tạo tài khoản người dùng MySQL thành công. Ghi lại username/password. Nó sẽ được sử dụng trong script PHP.

3. Tạo cơ sở dữ liệu MySQL

Tạo cơ sở dữ liệu db_esp32 bằng cách gõ lệnh sau trên Command Prompt:

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

4. Tạo bảng MySQL

Tạo bảng tbl_temp bằng cách sao chép các lệnh dưới đây và dán vào Command Prompt:

USE db_esp32; 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_esp32; Database changed MariaDB [db_esp32]> MariaDB [db_esp32]> 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_esp32]>

6. Viết file script PHP

Tạo file insert_temp.php bằng trình soạn thảo văn bản bất kỳ (ví dụ: Notepad/Notepad++). Chúng ta sẽ viết script trong file này để trích xuất giá trị nhiệt độ từ HTTP Request và chèn giá trị nhiệt độ vào cơ sở dữ liệu.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "ESP32"; $password = "newbiely.com"; $database_name = "db_esp32"; // 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"; } ?>
  • Đặt file này trong thư mục C:\xampp\htdocs
  • Lấy địa chỉ IP của PC. Nếu bạn không biết cách, hãy tìm kiếm trên Google.
  • Kiểm tra code PHP bằng cách mở trình duyệt web (ví dụ: Chrome) và truy cập liên kết này: http://192.168.0.19/insert_temp.php?temperature=26.2. Lưu ý rằng bạn cần thay thế địa chỉ IP trên bằng địa chỉ PC của bạn.
  • Trình duyệt web hiển thị như dưới đây:
mysql test
  • Kiểm tra xem dữ liệu có được lưu trữ trong cơ sở dữ liệu không bằng cách gõ lệnh sau trên Command Prompt:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_esp32]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_esp32]>

Như bạn có thể thấy, nhiệt độ 26.2 được lưu trữ trong cơ sở dữ liệu. Bước tiếp theo là viết code ESP32 để thực hiện HTTP Request đến web server trên PC của bạn.

7. Viết code ESP32

Code ESP32 dưới đây thực hiện HTTP đến PC của bạn để chèn nhiệt độ 30.5°C vào cơ sở dữ liệu

/* * Mã ESP32 này được phát triển bởi newbiely.vn * Mã ESP32 này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/esp32/esp32-mysql */ #include <WiFi.h> #include <HTTPClient.h> const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; 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()); HTTPClient http; http.begin(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 send 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() { }

Các Bước Nhanh

  • Mới sử dụng ESP32? Hãy bắt đầu với hướng dẫn ESP32 - Cài Đặt Phần Mềm để học các kiến thức cơ bản trước.
  • Kết nối mạch như hình trên.
  • Kết nối bo ESP32 với PC của bạn qua cáp micro USB
  • Thay đổi địa chỉ IP trong code bằng địa chỉ IP PC của bạn
  • Biên dịch và nạp code lên ESP32
  • Mở Serial Monitor trên Arduino IDE
how to open serial monitor on Arduino ide
  • Kết quả trên Serial Monitor
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  
  • Kiểm tra xem dữ liệu có được lưu trữ trong cơ sở dữ liệu không bằng cách sử dụng lệnh sau trên Command Prompt:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_esp32]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 26.2 | | 2 | 30.5 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_esp32]>

Như bạn có thể thấy, nhiệt độ 30.5 được lưu trữ trong cơ sở dữ liệu.

ESP32 chèn, cập nhật hoặc lấy dữ liệu từ/đến cơ sở dữ liệu MySQL

Ví dụ trên cho thấy cách chèn dữ liệu vào cơ sở dữ liệu MySQL. Cách thức tương tự cho việc cập nhật và đọc dữ liệu từ cơ sở dữ liệu. Bạn chỉ cần sửa đổi truy vấn MySQL trong code PHP. Bạn có thể học thêm trên W3Schools.com

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.