ESP8266 và MySQL
Hướng dẫn này chỉ cho bạn cách sử dụng ESP8266 để chèn hoặc 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.

Phần cứng cần chuẩn bị
| 1 | × | ESP8266 NodeMCU ESP-12E | ||
| 1 | × | Recommended: ESP8266 NodeMCU ESP-12E (Uno-form) | ||
| 1 | × | USB Cable Type-A to Type-C (for USB-A PC) | ||
| 1 | × | USB Cable Type-C to Type-C (for USB-C PC) | ||
| 1 | × | breadboard | ||
| 1 | × | dây jumper | ||
| 1 | × | (Tùy chọn) DC Power Jack | ||
| 1 | × | (Khuyến nghị) Screw Terminal Expansion Board for ESP8266 | ||
| 1 | × | (Khuyến nghị) Power Splitter for ESP8266 Type-C |
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (30 sensors/displays) | ||
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
ESP8266 - Cơ sở dữ liệu MySQL
Có hai thuật ngữ trong MySQL mà người mới bắt đầu thường nhầm lẫn: Cơ sở dữ liệu MySQL và máy chủ MySQL. Chúng khác nhau. Tuy nhiên, nếu bạn là người mới bắt đầu, bạn có thể cho rằng chúng giống nhau. Sau này, bạn sẽ nhận ra sự khác biệt trong quá trình học tập của mình.
ESP8266 có thể tương tác với cơ sở dữ liệu MySQL theo hai cách:
- Trực tiếp: ESP8266 kết nối trực tiếp tới máy chủ MySQL và tương tác với máy chủ MySQL bằng giao thức MySQL
- Gián tiếp: ESP8266 kết nối gián tiếp tới máy chủ MySQL thông qua một máy chủ web bằng giao thức HTTP/HTTPS
Cái nào là tốt nhất cho ESP8266? Hãy cùng tìm hiểu nhé!
ESP8266 tương tác trực tiếp với Máy chủ 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 một tài khoản người dùng MySQL ⇒ Điều này có rủi ro về mặt bảo mật, ngay cả khi chúng ta cấp cho tài khoản người dùng quyền hạn giới hạn.
- ESP8266 phải lưu trữ và gửi các truy vấn MySQL đến máy chủ MySQL ⇒ Cần viết nhiều mã cho ESP8266, và đồng thời làm cạn kiệt các tài nguyên của ESP8266 (sử dụng bộ nhớ và CPU).
- ESP8266 phải xử lý một phản hồi MySQL phức tạp (kích thước dữ liệu rất lớn trong một số trường hợp) ⇒ Điều này có thể khiến ESP8266 hết bộ nhớ.
- Máy chủ MySQL phải xử lý dữ liệu thô ⇒ làm tăng độ phức tạp của các script MySQL.
- Hầu hết các thư viện MySQL dành cho ESP8266 không hỗ trợ SSL/TLS ⇒ Dữ liệu và tên người dùng/mật khẩu được gửi mà không được mã hóa ⇒ một vấn đề bảo mật khác.
ESP8266 tương tác gián tiếp với Máy chủ MySQL qua HTTP/HTTPS
Tương tác với MySQL một cách gián tiếp thông qua HTTP/HTTPS giải quyết tất cả các vấn đề liên quan đến truy cập trực tiếp.
Cách hoạt động
- Step 1: ESP8266 chuẩn bị dữ liệu cho yêu cầu HTTP/HTTPS và gửi yêu cầu đó đến máy chủ Web
- Step 2: Máy chủ web chạy một tập lệnh PHP xử lý yêu cầu từ ESP8266
- Step 3: Tập lệnh PHP trích xuất dữ liệu từ yêu cầu HTTP, xử lý dữ liệu, và sau đó tương tác với cơ sở dữ liệu MySQL.
- Step 4: Tập lệnh PHP xử lý kết quả và trả về chỉ kết quả cần thiết cho ESP8266 qua phản hồi HTTP

Chúng ta sẽ cài đặt máy chủ MySQL, máy chủ web và PHP trên máy tính cá nhân. Trên thực tế, chúng ta có thể cài đặt chúng trên một máy chủ riêng hoặc dịch vụ đám mây 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 máy chủ HTTP và máy chủ MySQL trên cùng một máy chủ vật lý, chúng ta có thể giới hạn quyền truy cập cho tài khoản MySQL (ví dụ: truy cập chỉ từ localhost) ⇒ an toàn
- Tên đăng nhập và mật khẩu của tài khoản MySQL được lưu trên máy chủ ⇒ an toàn
- Dữ liệu được xử lý bởi một tập lệnh PHP ⇒ Điều này làm giảm tải và độ phức tạp cho ESP8266 và máy chủ MySQL
- Tập lệnh PHP có thể xử lý dữ liệu dễ dàng hơn rất nhiều so với mã ESP8266 và tập lệnh MySQL ⇒ Đơn giản hóa mã ESP8266 và tập lệnh MySQL
- Tập lệnh PHP có thể xử lý dữ liệu và gửi chỉ dữ liệu cần thiết cho ESP8266 (Bước 4) để ngăn ESP8266 bị hết bộ nhớ
- ESP8266 có thể thực hiện yêu cầu HTTPS một cách dễ dàng ⇒ dữ liệu được mã hóa
Lưu ý rằng việc xác thực giữa ESP8266 và máy chủ web nên độc lập với xác thực MySQL. Ví dụ, tên đăng nhập và mật khẩu HTTP nên khác với tên đăng nhập và mật khẩu MySQL.
Vì những ưu điểm đó, bài hướng dẫn này sẽ sử dụng phương pháp gián tiếp.
ESP8266 Kết nối tới MySQL qua HTTP/HTTPS
Các bước dưới đây là những bước mà chúng ta cần thực hiện:
- Cài đặt gói XAMPP bao gồm máy chủ MySQL, máy chủ web và PHP trên máy tính 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 tệp PHP
- Viết mã ESP8266
1. Cài đặt máy chủ MySQL, máy chủ Web và PHP trên máy tính của bạn
- Tải xuống và cài đặt XAMPP từ liên kết này. Sau khi cài đặt, hãy kiểm tra thư mục C:\xampp\htdocs trên máy tính của bạn. Đây là nơi bạn đặt mã PHP (xem phần sau).
- Mở bảng điều khiển XAMPP
- Nhấp vào các nút Khởi động để kích hoạt MySQL và máy chủ Web (như hình bên dưới)

2. Tạo tài khoản người dùng MySQL
Chúng tôi sẽ tạo một tài khoản MySQL chỉ có quyền truy cập từ localhost.
- Ngay cả khi kẻ tấn công biết tên đăng nhập/mật khẩu, họ sẽ không thể truy cập cơ sở dữ liệu MySQL của bạn trừ khi họ chiếm quyền kiểm soát máy tính của bạn.
- Tên đăng nhập/mật khẩu này sẽ được PHP sử dụng để kết nối với cơ sở dữ liệu MySQL.
Hướng dẫn này tạo một tài khoản người dùng MySQL với tên đăng nhập và mật khẩu lần lượt là ESP8266 và newbiely.com, tương ứng:
- Mở Dòng lệnh trên máy tính của bạn. Đừng đóng nó cho đến khi kết thúc bài hướng dẫn.
- Gõ lệnh sau vào Dòng lệnh:
- Theo mặc định, MySQL có tài khoản root không mật khẩu. Nên đặt mật khẩu cho tài khoản root (ví dụ YOUR_ROOT_PASSWORD) để tăng tính bảo mật. Gõ lệnh dưới đây trên Dòng lệnh:
- Nhập lệnh dưới đây vào Dòng lệnh để đăng nhập vào máy chủ MySQL:
- Nhập YOUR_ROOT_PASSWORD và nhấn Enter
- Hãy tạo một tài khoản người dùng MySQL với tên đăng nhập là ESP8266 và mật khẩu là newbiely.com, tương ứng bằng cách sao chép các lệnh dưới đây và dán vào Command Prompt:
Bạn đã tạo thành công một tài khoản người dùng MySQL. Ghi lại tên đăng nhập và mật khẩu. Nó sẽ được sử dụng trong script PHP.
3. Tạo cơ sở dữ liệu MySQL
Tạo một cơ sở dữ liệu db_esp8266 bằng cách nhập lệnh sau trên Command Prompt:
4. Tạo bảng MySQL
Tạo một 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:
6. Viết các tập tin script PHP
Tạo một insert_temp.php bằng bất kỳ trình soạn thảo văn bản nào (ví dụ Notepad/Notepad++). Chúng ta sẽ viết script trong tập tin này để trích xuất giá trị nhiệt độ từ yêu cầu HTTP và chèn giá trị nhiệt độ vào cơ sở dữ liệu.
- Đặt tệp này vào thư mục C:\xampp\htdocs
- Lấy địa chỉ IP của máy tính của bạn. Nếu bạn không biết cách làm, hãy tra trên Google.
- Kiểm tra mã PHP bằng cách mở trình duyệt web (ví dụ Chrome) và truy cập liên kết sau: http://192.168.0.19/insert_temp.php?temperature=26.2. Lưu ý rằng bạn cần thay địa chỉ IP ở trên bằng địa chỉ IP của máy tính bạn.
- Trình duyệt web hiển thị như bên dưới:

- Kiểm tra xem dữ liệu có được lưu trữ trong cơ sở dữ liệu hay không bằng cách nhập lệnh sau trên Command Prompt:
Như bạn có thể thấy, nhiệt độ 26,2 được lưu vào cơ sở dữ liệu. Bước tiếp theo là viết mã ESP8266 để thực hiện một yêu cầu HTTP tới máy chủ web trên máy tính của bạn.
7. Viết mã ESP8266
Mã ESP8266 dưới đây gửi HTTP tới máy tính của bạn để chèn nhiệt độ 30,5°C vào cơ sở dữ liệu.
Hướng dẫn từng bước
- Nếu đây là lần đầu bạn sử dụng ESP8266, hãy xem ESP8266 - Cài đặt phần mềm.
- Nối dây như hình ở trên.
- Kết nối bo mạch ESP8266 với máy tính của bạn bằng cáp micro USB.
- Thay đổi địa chỉ IP trong mã bằng địa chỉ IP của máy tính bạn.
- Biên dịch và tải mã lên ESP8266.
- Mở Serial Monitor trên Arduino IDE.
- Kết quả hiển thị trên Serial Monitor.
- Kiểm tra xem dữ liệu có được lưu trữ trong cơ sở dữ liệu hay không bằng cách sử dụng lệnh sau trên Command Prompt:
Như bạn có thể thấy, nhiệt độ 30,5 được lưu trong cơ sở dữ liệu.
Cách ESP8266 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. Nó cũng tương tự đối với việc cập nhật và đọc dữ liệu từ cơ sở dữ liệu. Bạn chỉ cần chỉnh sửa truy vấn MySQL trong mã PHP. Bạn có thể tìm hiểu thêm tại 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.