ESP32 - MySQL | ESP32 - MySQL

이 튜토리얼은 여러분에게 ESP32를 사용하여 MySQL 데이터베이스에 데이터를 삽입/업데이트하는 방법, 또는 MySQL 데이터베이스에서 데이터를 읽는 방법을 알려줍니다.

ESP32 MySQL

준비물

1×ESP-WROOM-32 Dev Module 쿠팡 | Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×(Optional) DC Power Jack 쿠팡 | Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Recommended) ESP32 Screw Terminal Adapter 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

ESP32 - MySQL

MySQL에서 초보자들이 보통 혼동하는 두 가지 용어가 있습니다: MySQL 데이터베이스MySQL 서버입니다. 이 둘은 다릅니다. 하지만, 만약 당신이 초보자라면, 이들이 같다고 가정해도 됩니다. 나중에, 학습 과정에서 차이점을 발견하게 될 것입니다.

ESP32는 MySQL 데이터베이스와 두 가지 방식으로 상호작용할 수 있습니다:

  • **직접적으로**: ESP32는 MySQL 프로토콜을 사용하여 MySQL 서버에 직접 연결하고 MySQL 서버와 상호 작용합니다.
  • **간접적으로**: ESP32는 HTTP/HTTPS 프로토콜을 사용하여 웹 서버를 통해 간접적으로 MySQL 서버에 연결합니다.

ESP32에 가장 적합한 것은 무엇일까요? 알아봅시다!

ESP32가 MySQL 서버와 직접 상호작용합니다

ESP32 directly to MySQL

MySQL과 직접 상호작용하는 것은 단순해 보이지만 많은 단점이 있습니다:

  • MySQL 사용자 계정에 원격 접근 권한을 부여해야 합니다 ⇒ 이는 보안 측면에서 위험합니다. 사용자 계정에 제한된 권한을 부여하더라도 마찬가지입니다.
  • ESP32는 반드시 MySQL 쿼리를 저장하고 MySQL 서버로 전송해야 합니다 ⇒ 많은 ESP32 코드를 작성해야 하며, ESP32의 자원(메모리 및 CPU 사용량)을 많이 소모합니다.
  • ESP32는 복잡한 MySQL 응답을 처리해야 합니다 (일부 경우에는 매우 큰 데이터 크기) ⇒ 이는 ESP32가 메모리를 모두 사용하게 만들 수 있습니다.
  • MySQL 서버는 원시 데이터를 처리해야 합니다 ⇒ MySQL 스크립트의 복잡성이 증가합니다.
  • ESP32용 MySQL 라이브러리 대부분이 SSL/TLS를 지원하지 않습니다 ⇒ 데이터와 사용자 이름/비밀번호가 암호화 없이 전송됩니다 ⇒ 또 다른 보안 문제입니다.

ESP32는 HTTP/HTTPS를 통해 MySQL 서버와 간접적으로 상호작용합니다.

MySQL에 직접 액세스하는 대신 HTTP/HTTPS를 통해 간접적으로 상호 작용하면 모든 문제가 해결됩니다.

작동 방식

  • 1단계: ESP32는 데이터를 HTTP/HTTPS 요청에 포함시켜 웹 서버에 요청을 보냅니다
  • 2단계: 웹 서버는 ESP32로부터의 요청을 처리하는 PHP 스크립트를 실행합니다
  • 3단계: PHP 스크립트는 HTTP 요청에서 데이터를 추출하고, 데이터를 처리한 다음 MySQL 데이터베이스와 상호작용합니다
  • 4단계: PHP 스크립트는 결과를 처리하고 필요한 결과만을 HTTP 응답을 통해 ESP32로 반환합니다
ESP32 MySQL HTTP

우리는 PC에 MySQL 서버, 웹 서버 및 PHP를 설치할 예정입니다. 사실, 전용 서버나 AWS EC2와 같은 클라우드 서비스에도 설치할 수 있습니다.

아래는 간접적 방식이 직접적 방식의 문제점을 어떻게 해결하는지에 대한 것입니다.

  • HTTP 서버와 MySQL 서버를 같은 물리 서버에 설치할 수 있으며, MySQL 사용자 계정에 대한 접근 제한을 줄 수 있습니다(예: 로컬호스트 접속만). ⇒ 안전함
  • MySQL 계정의 사용자 이름/비밀번호가 서버에 저장됩니다 ⇒ 안전함.
  • 데이터는 PHP 스크립트에 의해 처리됩니다 ⇒ 이는 ESP32와 MySQL 서버에 대한 부하와 복잡성을 줄입니다.
  • PHP 스크립트는 ESP32 코드와 MySQL 스크립트보다 데이터를 훨씬 쉽게 처리할 수 있습니다 ⇒ ESP32 코드와 MySQL 스크립트를 단순화합니다.
  • PHP 스크립트는 데이터를 처리하고 필요한 데이터만 ESP32(4단계)에 보내서 ESP32의 메모리 부족을 방지할 수 있습니다.
  • ESP32는 HTTPS 요청을 쉽게 할 수 있습니다 ⇒ 데이터가 암호화됩니다.

ESP32와 웹 서버 간의 인증은 MySQL 인증과 독립적이어야 합니다. 예를 들어, HTTP 사용자 이름/비밀번호는 MySQL 사용자 이름/비밀번호와 달라야 합니다.

그러한 장점들 때문에, 이 튜토리얼은 간접적인 방법을 사용할 것입니다.

ESP32에서 HTTP/HTTPS를 통한 MySQL 연동

아래는 우리가 해야 할 단계입니다:

  • PC에 MySQL 서버, 웹 서버, PHP가 포함된 XAMPP 패키지를 설치하는 중
  • MySQL 사용자 계정 만들기
  • MySQL 데이터베이스 만들기
  • MySQL 테이블 만들기
  • 하나 이상의 PHP 스크립트 파일 작성하기
  • ESP32 코드 작성하기

PC에 MySQL 서버, 웹 서버 및 PHP 설치하기

아래 링크에서 XAMPP를 다운로드하고 설치하세요: 이 링크. 설치 후, PC에서 C:\xampp\htdocs 폴더를 확인하세요. 여기에 PHP 코드를 넣습니다(이후 참조).

  • XAMPP 제어판을 엽니다
  • 아래 이미지와 같이 MySQL과 웹 서버를 활성화하려면 시작 버튼을 클릭하세요.
ESP32 XAMPP

2. MySQL 사용자 계정 생성하기

우리는 localhost 접근 권한만 있는 MySQL 계정을 생성할 것입니다.

  • 공격자가 사용자 이름/비밀번호를 알고 있더라도, 그들이 당신의 PC를 제어하지 않는 이상 당신의 MySQL 데이터베이스에 접근할 수 없습니다.
  • 이 사용자 이름/비밀번호는 PHP가 MySQL 데이터베이스에 연결하는 데 사용될 것입니다.

이 튜토리얼에서는 사용자 이름과 비밀번호가 각각 ESP32newbiely.kr인 MySQL 사용자 계정을 생성합니다:

  • PC에서 명령 프롬프트를 엽니다. 튜토리얼이 끝날 때까지 닫지 마세요.
  • 명령 프롬프트에 다음 명령을 입력하세요:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\YOUR_USER>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>

기본적으로 MySQL은 비밀번호 없이 root 계정을 가지고 있습니다. 보안상의 이유로 root 계정에 비밀번호를 설정하는 것이 매우 권장됩니다(예: YOUR_ROOT_PASSWORD). 명령 프롬프트에서 아래 명령어를 입력하세요:

mysqladmin -u root password YOUR_ROOT_PASSWORD
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password YOUR_ROOT_PASSWORD C:\xampp\mysql\bin>

명령 프롬프트에서 다음 명령어를 입력하여 MySQL 서버에 로그인하십시오:

mysql.exe -u root -p

당신의 루트 비밀번호를 입력하고 엔터를 누르세요.

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)]>

아래 명령어를 복사하여 커맨드 프롬프트에 붙여넣어 사용자 이름이 ESP32이고 비밀번호가 newbiely.kr인 MySQL 사용자 계정을 만듭시다:

CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.kr'; GRANT ALL PRIVILEGES ON *.* TO 'ESP32'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'ESP32'@'localhost' IDENTIFIED BY 'newbiely.kr'; 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)]>

MySQL 사용자 계정을 성공적으로 생성하셨습니다. 사용자 이름/비밀번호를 적어두십시오. PHP 스크립트에서 사용될 것입니다.

MySQL 데이터베이스 생성하기

다음 명령어를 명령 프롬프트에 입력하여 db_esp32 데이터베이스를 생성하세요:

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. MySQL 테이블 생성하기

아래 명령어를 복사하여 명령 프롬프트에 붙여넣어 tbl_temp라는 테이블을 생성하세요:

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]>

PHP 스크립트 파일 작성하기

아무 텍스트 편집기(예: 메모장/Notepad++)를 사용해서 insert_temp.php를 생성하세요. 이 파일 안에서 스크립트를 작성하여 HTTP 요청에서 온도 값을 추출하고 데이터베이스에 온도 값을 삽입할 것입니다.

<?php if(isset($_GET["temperature"])) { $temperature = $_GET["temperature"]; // get temperature value from HTTP GET $servername = "localhost"; $username = "ESP32"; $password = "newbiely.kr"; $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"; } ?>
  • 이 파일을 C:\xampp\htdocs 폴더 안에 넣으세요.
  • PC의 IP 주소를 가져오세요. 방법을 모른다면, 구글에 검색하세요.
  • 웹 브라우저(예: 크롬)를 열고 다음 링크에 접속함으로써 PHP 코드를 테스트하세요: http://192.168.0.19/insert_temp.php?temperature=26.2. 위의 IP 주소를 귀하의 PC 주소로 바꿔야 한다는 점을 유의하세요.
  • 웹 브라우저는 아래와 같이 표시됩니다:
MySQL Test

명령 프롬프트에서 다음 명령어를 입력하여 데이터가 데이터베이스에 저장되어 있는지 확인하세요:

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]>

보시다시피, 데이터베이스에 26.2의 온도가 저장되어 있습니다. 다음 단계는 ESP32 코드를 작성하여 PC의 웹 서버에 HTTP 요청을 하는 것입니다.

7. ESP32 코드 작성

아래의 ESP32 코드는 온도 30.5°C를 데이터베이스에 입력하기 위해 PC로 HTTP를 만듭니다.

/* * 이 ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/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"; // PC의 IP 주소로 변경하세요 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가 음수일 경우 오류 if(httpCode > 0) { // 서버에서 파일을 찾음 if(httpCode == HTTP_CODE_OK) { String payload = http.getString(); Serial.println(payload); } else { // HTTP 헤더가 전송되었고 서버 응답 헤더가 처리되었습니다 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() { }

사용 방법

  • ESP32를 처음 사용하는 경우, Arduino IDE에서 ESP32 환경 설정 방법을 참조하세요.
  • 위 이미지와 같이 배선하세요.
  • ESP32 보드를 마이크로 USB 케이블을 사용하여 PC에 연결하세요.
  • 코드 상의 IP 주소를 귀하의 PC의 IP 주소로 변경하세요.
  • ESP32에 코드를 컴파일하고 업로드하세요.
  • Arduino IDE에서 시리얼 모니터를 열세요.
How to open serial monitor on Arduino IDE

시리얼 모니터의 결과

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  

다음 명령어를 커맨드 프롬프트에서 사용하여 데이터가 데이터베이스에 저장되어 있는지 확인하십시오:

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]>

보시다시피, 온도 30.5가 데이터베이스에 저장되어 있습니다.

ESP32가 MySQL 데이터베이스에 데이터를 삽입, 업데이트 또는 가져오는 방법

위의 예는 MySQL 데이터베이스에 데이터를 삽입하는 방법을 보여줍니다. 데이터베이스에서 데이터를 업데이트하고 읽는 것도 비슷합니다. PHP 코드에서 MySQL 쿼리를 수정하기만 하면 됩니다. 더 배우고 싶다면 W3Schools.com에서 배울 수 있습니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!