카테고리 없음

Arduino - MySQL

기하 2021. 8. 16. 11:57

Arduino는 센서 데이터를 수집하여 MySQL 데이터베이스에 저장할 수 있습니다. 
Arduino는 또한 MySQL 데이터베이스에서 데이터(명령)를 얻고
LED, 모터, 액추에이터, 장치를 제어할 수 있습니다.

이 튜토리얼에서는 다음을 배울 것입니다.

  • Arduino가 MySQL 데이터베이스와 상호 작용하는 가장 좋은 방법
  • Arduino가 MySQL 데이터베이스에 데이터를 삽입하는 방법
  • Arduino가 MySQL 데이터베이스에 데이터를 업데이트하는 방법
  • Arduino가 MySQL 데이터베이스에서 데이터를 얻는 방법

필요한 하드웨어

Arduino UNO 또는 Genuino UNO
USB 2.0 케이블 유형 A/B
아두이노 이더넷 쉴드 2
이더넷 케이블

또는

Arduino UNO 또는 Genuino UNO
USB 2.0 케이블 유형 A/B
PHPoC WiFi/이더넷 쉴드
(옵션)이더넷 케이블

아두이노 - MySQL

시스템 아키텍처에 대한 지식이 많지 않은 경우 

MySQL 데이터베이스  MySQL 서버 라는 두 가지 용어를 동일하게 이해할 수 있습니다. 

나중에 시스템 아키텍처에 대해 많이 알게 되면 차이점을 알게 될 것입니다.

Arduino가 MySQL 데이터베이스와 상호 작용하는 두 가지 방법이 있습니다.

 

  • Arduino는 MySQL 연결을 통해 MySQL 서버와 직접 상호 작용합니다(직접 방식이라고 함).
  • Arduino는 HTTP 연결을 통해 MySQL 서버와 간접적으로 상호 작용합니다(간접 방식이라고 함).

최고의 것을 찾자.

 

Arduino는 MySQL 서버와 직접 상호 작용합니다.

 

이것은 더 간단해 보이지만 많은 단점이 있습니다.

  • 이렇게 하면 MySQL 사용자 계정이 MySQL 데이터베이스에 원격으로 액세스할 수 있습니다.
    ⇒ 사용자 계정에 제한된 권한이 부여되더라도 보안 관점에서 위험합니다.
  • 데이터는 Arduino 및/또는 MySQL 서버에서 처리되어야 합니다.
    ⇒ 이것은 Arduino 코드 및 MySQL 스크립트의 복잡성을 증가시킵니다. 
    특히 Arduino 리소스(메모리 및 CPU 사용량)를 많이 소모합니다.
  • MySQL 서버는 경우에 따라 매우 많은 양의 데이터를 Arduino에 반환할 수 있습니다.
    ⇒ 이로 인해 Arduino의 메모리가 부족해질 수 있습니다.
  • 사용 가능한 대부분의 MySQL 라이브러리는 SSL/TLS를 지원하지 않습니다. 
    사용자 이름/비밀번호를 포함한 데이터는 일반 텍스트로 전송됩니다
    ⇒ 또 다른 보안 문제.

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

이 간접 방법은 직접 방법이 가지고 있는 모든 문제를 해결합니다. 
간접 방법이 직접 방법의 단점을 어떻게 극복하는지 보기 전에 먼저 어떻게 작동하는지 봅시다.

 

  • 1단계: Arduino는 웹 서버에 HTTP 요청을 합니다.
  • 2단계: 웹 서버에서 PHP 스크립트 실행
  • 3단계: PHP 스크립트는 HTTP 요청에서 데이터를 가져와서 데이터를 처리한 다음
    MySQL 데이터베이스와 상호 작용합니다.
  • 4단계: PHP 스크립트는 결과를 처리하고 HTTP 응답을 통해 결과를 Arduino에 반환합니다.

이 튜토리얼에서는 웹 서버, MySQL 서버가 PC에 설치됩니다.

복잡해 보이지만 그렇지 않습니다. 이제 간접 방법이 직접 방법의 단점을 어떻게 극복하는지 봅시다.

 

  • 동일한 물리적 서버에 MySQL 서버와 HTTP 서버를 설치함으로써
    MySQL 사용자 계정이 localhost에만 액세스하도록 제한할 수 있습니다. 
    또한 MySQL 계정의 사용자 이름/비밀번호가 서버에 저장되므로(3단계) 시스템이 더욱 안전해집니다.
  • 데이터는 PHP 스크립트(3단계 및 4단계)에 의해 처리됩니다. 
    이것은 Arduino 및 MySQL 서버의 작업과 복잡성을 줄입니다. 
    PHP 코드를 사용하여 데이터를 처리하는 것은 Arduino 코드와 MySQL 스크립트보다 훨씬 쉽습니다.
  • PHP 스크립트는 데이터를 처리하고 Arduino의 메모리 부족을 방지하기 위해
    필요한 데이터만 Arduino에 보낼 수 있습니다(4단계).
  • 대부분의 이더넷/WiFi 라이브러리는 HTTPS 요청을 할 수 있는 TLS/SSL을 지원합니다. 
    HTTPS를 사용하여 데이터가 암호화되고 인터넷을 통해 안전하게 교환됩니다.

1단계에서 다른 사용자 이름/비밀번호를 사용하여 Arduino와 웹 서버 간의 인증을 수행할 수 있습니다.
 HTTP 사용자 이름/암호는 보안상의 이유로 MySQL 사용자 이름/암호와 달라야 합니다.

 

이러한 장점을 가지고 이 튜토리얼의 나머지 부분에서는 간접적인 방법을 통해
MySQL과 함께 Arduino를 사용하는 방법을 설명합니다.

 

 

Arduino - HTTP/HTTPS를 통한 MySQL

다음 단계를 수행해야 합니다.

  • PC에 MySQL 서버, 웹 서버, PHP 설치
  • MySQL 및 웹 서버 활성화
  • MySQL 사용자 계정 생성
  • MySQL 데이터베이스 생성
  • MySQL 테이블 생성
  • 하나 이상의 PHP 스크립트 파일 작성
  • 아두이노 코드 작성

이제 차근차근 해봅시다.

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

다행히 XAMPP 패키지에는 이 모든 것이 포함되어 있습니다. 한 번만 설치하면 됩니다.

  • 이 링크 에서 XAMPP 다운로드
  • 설치하십시오.

설치가 완료되면 PC에 C:\xampp\htdocs 폴더가 표시됩니다. 
이것은 PHP 코드를 넣는 곳입니다(나중에 참조).

 

2. MySQL 및 웹 서버 활성화

  • XAMPP 제어판 열기
  • 시작 버튼을 클릭하여 MySQL 및 웹 서버를 활성화합니다(아래 이미지 참조).

3. MySQL 사용자 계정 생성

localhost에서만 MySQL 데이터베이스에 연결할 수 있는 MySQL 계정을 생성합니다.

  • 사용자 이름/비밀번호가 노출되더라도
    공격자는 PC를 제어하지 않는 한 MySQL 데이터베이스에 액세스할 수 없습니다.
  • PHP와 MySQL이 같은 PC에 설치되어 있기 때문에
    PHP는 이 사용자 이름/암호를 사용하여 MySQL 데이터베이스에 연결할 수 있습니다.

사용자 이름이 Arduino 이고 암호가 ArduinoGetStarted.com인 MySQL 사용자 계정을 생성해 보겠습니다 .

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

  • 기본적으로 MySQL에는 루트 계정에 비밀번호가 없습니다. 비밀번호를 추가해야 합니다

명령 프롬프트에서 다음 명령을 입력하여 루트 계정에 비번을 추기할 수 있습니다.

 (예: your-root-password ):

mysqladmin -u root password your-root-password

  • 명령 프롬프트에 다음 명령을 입력합니다.
mysql.exe -u root -p
  • your-root-password를 입력하고 Enter 키를 누릅니다.

  • 아래 명령을 복사하여 명령 프롬프트에 붙여넣어 
    사용자 이름이 Arduino 이고 암호가 ArduinoGetStarted.com인 MySQL 사용자 계정을 만듭니다 .
CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com';
GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

이제 MySQL 사용자 계정을 성공적으로 만들었습니다. 
사용자 이름/비밀번호를 기억하십시오. PHP 스크립트에서 사용됩니다.

 

4. MySQL 데이터베이스 생성

명령 프롬프트에 다음 명령을 입력하여 db_arduino 라는 데이터베이스를 생성해 보겠습니다 .

CREATE DATABASE db_arduino CHARACTER SET = 'utf8' COLLATE = 'utf8_general_ci';

5. MySQL 테이블 생성

아래 명령을 복사하여 명령 프롬프트에 붙여넣어 tbl_temp 라는 데이터베이스를 생성해 보겠습니다 .

USE db_arduino;

CREATE TABLE tbl_temp (
	temp_id    INT UNSIGNED NOT NULL AUTO_INCREMENT,
	temp_value FLOAT DEFAULT 0.00,
	PRIMARY KEY (temp_id)
);

6. 하나 이상의 PHP 파일 작성

HTTP 요청에서 온도를 가져와 데이터베이스에 삽입하는 insert_temp.php라는 PHP 파일을 만듭니다.

<?php

if(isset($_GET["temperature"])) {
   $temperature = $_GET["temperature"]; // get temperature value from HTTP GET

   $servername = "localhost";
   $username = "Arduino";
   $password = "ArduinoGetStarted.com";
   $dbname = "db_arduino";

   // Create connection
   $conn = new mysqli($servername, $username, $password, $dbname);
   // Check connection
   if ($conn->connect_error) {
      die("Connection failed: " . $conn->connect_error);
   }

   $sql = "INSERT INTO tbl_temp (temp_value) VALUES ($temperature)";

   if ($conn->query($sql) === TRUE) {
      echo "New record created successfully";
   } else {
      echo "Error: " . $sql . " => " . $conn->error;
   }

   $conn->close();
} else {
   echo "temperature is not set";
}
?>
  • 이 파일을 C:\xampp\htdocs 폴더에 넣습니다 .
  • PC의 IP 주소를 가져옵니다. 방법을 모르시면 구글링 해보세요.
  • 웹 브라우저(예: Chrome)를 열고 다음 링크에 액세스하여 PHP 코드를 테스트합니다. 
    http://192.168.0.26/insert_temp.php?temperature=27.5 . 
    위의 IP 주소를 PC 주소로 바꿔야 합니다.
  • 웹 브라우저에서 출력

명령 프롬프트에서 다음 명령을 입력하여 데이터가 데이터베이스에 저장되어 있는지 확인합니다.

SELECT * from tbl_temp;​

보시다시피 27.5의 온도가 데이터베이스에 저장됩니다. 
다음 단계는 PC에 유사한 HTTP 요청을 하는 Arduino를 작성하는 것입니다.

 

7. Arduino 코드 작성

테스트를 위해 Arduino Uno와 Ethernet Shield  사용할 것입니다.

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

/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-mysql
 */

#include <SPI.h>
#include <Ethernet.h>

// replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

EthernetClient client;

int    HTTP_PORT   = 80;
String HTTP_METHOD = "GET";
char   HOST_NAME[] = "192.168.0.26"; // change to your PC's IP address
String PATH_NAME   = "/insert_temp.php";
String queryString = "?temperature=29.1";

void setup() {
  Serial.begin(9600);

  // initialize the Ethernet shield using DHCP:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to obtaining an IP address using DHCP");
    while(true);
  }

  // connect to web server on port 80:
  if(client.connect(HOST_NAME, HTTP_PORT)) {
    // if connected:
    Serial.println("Connected to server");
    // make a HTTP request:
    // send HTTP header
    client.println(HTTP_METHOD + " " + PATH_NAME + queryString + " HTTP/1.1");
    client.println("Host: " + String(HOST_NAME));
    client.println("Connection: close");
    client.println(); // end HTTP header

    while(client.connected()) {
      if(client.available()){
        // read an incoming byte from the server and print it to serial monitor:
        char c = client.read();
        Serial.print(c);
      }
    }

    // the server's disconnected, stop the client:
    client.stop();
    Serial.println();
    Serial.println("disconnected");
  } else {// if not connected:
    Serial.println("connection failed");
  }
}

void loop() {
}

 

빠른 단계

  • Arduino Uno 이더넷 쉴드 장착
  • 이더넷 쉴드에 이더넷 케이블 연결
  • USB 케이블을 통해 Arduino Uno를 PC에 연결
  • PC의 IP 주소로 코드의 IP 주소 변경
  • Arduino에 코드 컴파일 및 업로드
  • 직렬 모니터 열기
  • 직렬 모니터의 결과
  • 명령 프롬프트에서 다음 명령을 입력하여 데이터가 데이터베이스에 저장되어 있는지 확인합니다.
SELECT * from tbl_temp;

보시다시피 온도 29.1이 데이터베이스에 저장됩니다.

 

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

위의 예에서 우리는 MySQL 데이터베이스에 데이터를 삽입하는 방법을 배웠습니다. 
데이터베이스에서 데이터를 업데이트하고 가져오는 경우도 비슷합니다. 
PHP 스크립트에서 MySQL 쿼리만 변경하면 됩니다. 
W3Schools 에서 더 많은 것을 배울 수 있습니다.

고급 사용법

보안을 강화하려면

  • HTTP 대신 HTTPS를 만들기 위해 Arduino 코드를 변경할 수 있습니다. 
    Arduino - HTTPS 참조
  • 사용자 이름/비밀번호를 사용하여 Arduino와 웹 서버 간에 인증을 수행할 수 있습니다. 
    기본 액세스 인증 참조

 

※ 참고:

보안 수준이 가장 높은 완전한 시스템을 만들려면 더 많은 작업을 수행해야 합니다
(예: MySQL 주입 방지, HTTPS를 REST API로 만들기, 데이터에 Json 형식 사용...). 
그러나 이 튜토리얼은 Arduino를 배우는 초보자를 위한 것입니다. 
최대한 간단하게 만들었습니다. 이 튜토리얼을 학습한 후 사용자는 이를 확장할 수 있습니다.

 

 

[참조 인용번역] https://arduinogetstarted.com/tutorials/arduino-mysql