ESP8266 - MySQL | ESP8266 - MySQL

이 튜토리얼은 ESP8266을 사용하여 MySQL 데이터베이스에 데이터를 삽입/업데이트하는 방법 또는 MySQL 데이터베이스에서 데이터를 읽는 방법을 안내합니다.

ESP8266 NodeMCU MySQL

준비물

1×ESP8266 NodeMCU Amazon
1×Micro USB Cable Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(Optional) DC Power Jack 쿠팡 | Amazon
1×(Optional) Screw Terminal Expansion Board for ESP8266 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

ESP8266 - MySQL

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

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

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

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

ESP8266이 MySQL 서버와 직접 상호 작용합니다.

ESP8266 NodeMCU directly to MySQL

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

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

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

MySQL과 간접적으로 HTTP/HTTPS를 통해 상호작용하는 것은 직접 접근의 모든 문제를 해결합니다.

작동 원리

1단계: ESP8266이 HTTP/HTTPS 요청에 데이터를 포함하여 웹 서버에 요청을 보냅니다.

2단계: 웹 서버는 ESP8266에서 온 요청을 처리하는 PHP 스크립트를 실행합니다.

3단계: PHP 스크립트는 HTTP 요청에서 데이터를 추출하고, 데이터를 처리한 후 MySQL 데이터베이스와 상호작용합니다.

4단계: PHP 스크립트는 결과를 처리하고 필요한 결과만을 HTTP 응답을 통해 ESP8266에 반환합니다.

ESP8266 NodeMCU MySQL HTTP

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

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

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

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

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

ESP8266에서 MySQL로 HTTP/HTTPS를 통해

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

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

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

  • 이 링크에서 XAMPP를 다운로드하고 설치하세요. 설치 후, PC의 C:\xampp\htdocs 폴더를 확인하세요. 여기가 PHP 코드를 넣는 곳입니다(이후 내용 참조).
  • XAMPP 제어판 열기
  • MySQL과 웹 서버를 활성화하려면 시작 버튼을 클릭하세요(아래 이미지 참조).
ESP8266 NodeMCU XAMPP

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

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

  • 공격자가 사용자 이름과 비밀번호를 알고 있어도, PC를 제어하지 않는 한 MySQL 데이터베이스에 접근할 수 없습니다.
  • 이 사용자 이름과 비밀번호는 PHP가 MySQL 데이터베이스에 연결하는 데 사용됩니다.

이 튜토리얼은 사용자 이름과 비밀번호가 각각 ESP8266, newbiely.kr인 MySQL 사용자 계정을 생성합니다:

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

기본적으로 MySQL에는 비밀번호 없이 루트 계정이 있습니다. 보안상의 이유로 루트 계정에 비밀번호를 설정하는 것이 매우 권장됩니다(예: 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

YOUR_ROOT_PASSWORD를 입력한 후 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)]>

아래 명령어를 복사해서 명령 프롬프트에 붙여넣어, 사용자 이름과 비밀번호가 각각 ESP8266, newbiely.kr인 MySQL 사용자 계정을 만듭시다:

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

MySQL 사용자 계정을 성공적으로 생성하였습니다. 사용자 이름과 비밀번호를 적어두세요. 이 정보는 PHP 스크립트에서 사용될 것입니다.

3. MySQL 데이터베이스 생성하기

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

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

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

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. PHP 스크립트 파일 작성하기

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

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

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

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

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

7. ESP8266 코드 작성

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

/* * 이 ESP8266 NodeMCU 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP8266 NodeMCU 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp8266/esp8266-mysql */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.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()); WiFiClient client; // WiFiClient 객체를 생성하세요 HTTPClient http; // ::begin(WiFiClient, url) 메소드 사용 http.begin(client, 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... 실패, 오류: %s\n", http.errorToString(httpCode).c_str()); } http.end(); } void loop() { // 여기에 루프 코드를 작성하세요(필요한 경우) }

사용 방법

  • ESP8266을 처음 사용하는 경우, Arduino IDE에서 ESP8266 환경 설정 방법을 참조하세요.
  • 위 이미지와 같이 배선하세요.
  • ESP8266 보드를 마이크로 USB 케이블을 통해 PC에 연결하세요.
  • 코드에서 IP 주소를 PC의 IP 주소로 변경하세요.
  • ESP8266에 코드를 컴파일하고 업로드하세요.
  • 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_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]>

당신이 볼 수 있듯이, 30.5라는 온도가 데이터베이스에 저장되어 있습니다.

ESP8266이 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!