Arduino - MySQL

Arduino kann Sensordaten sammeln und in die MySQL-Datenbank speichern. Arduino kann auch Daten (Befehle) aus der MySQL-Datenbank abrufen und LEDs, Motoren, Aktuatoren und Geräte steuern.

In diesem Tutorial werden wir lernen:

Arduino MySQL

Das Tutorial stellt den Arduino-Code für zwei Fälle bereit:

Arduino - MySQL

Wenn Sie nicht viel über die Systemarchitektur wissen, können zwei Begriffe: MySQL Database und MySQL Server als dasselbe verstanden werden. Sie werden die Unterschiede später erkennen, sobald Sie viel über die Systemarchitektur wissen.

Es gibt zwei Möglichkeiten, wie Arduino mit der MySQL-Datenbank interagieren kann:

  • Arduino interagiert direkt mit dem MySQL-Server über eine MySQL-Verbindung (genannt direkter Weg)
  • Arduino interagiert indirekt mit dem MySQL-Server über eine HTTP-Verbindung (genannt indirekter Weg)

Lass uns das Beste finden.

Arduino interagiert direkt mit dem MySQL-Server

Arduino direkt zu MySQL

Das klingt einfacher, aber es gibt viele Nachteile:

  • Dies ermöglicht einem MySQL-Benutzerkonto den Fernzugriff auf die MySQL-Datenbank ⇒ Dies ist aus Sicherheitsgründen gefährlich, auch wenn dem Benutzerkonto eingeschränkte Privilegien gewährt wurden.
  • Die Daten MÜSSEN in Arduino und/oder dem MySQL-Server verarbeitet werden. Dies erhöht die Komplexität des Arduino-Codes und des MySQL-Skripts. Insbesondere verbraucht es viele Arduino-Ressourcen (Speicher und CPU-Auslastung).
  • Der MySQL-Server kann in einigen Fällen eine sehr große Datenmenge an Arduino zurücksenden. Das kann dazu führen, dass dem Arduino der Speicher ausgeht.
  • Die meisten verfügbaren MySQL-Bibliotheken unterstützen kein SSL/TLS. Die Daten, einschließlich Benutzername und Passwort, werden im Klartext gesendet ⇒ ein weiteres Sicherheitsproblem.

Arduino interagiert indirekt mit dem MySQL-Server über HTTP/HTTPS

Dieser indirekte Weg löst alle Probleme, die der direkte Weg hat. Bevor wir sehen, wie der indirekte Weg die Nachteile des direkten Weges überwindet, schauen wir zunächst, wie er funktioniert.

Wie es funktioniert

  • Schritt 1: Arduino macht eine HTTP-Anfrage an den Webserver
  • Schritt 2: Der Webserver führt ein PHP-Skript aus
  • Schritt 3: Das PHP-Skript holt Daten aus der HTTP-Anfrage, verarbeitet die Daten und interagiert dann mit der MySQL-Datenbank.
  • Schritt 4: Das PHP-Skript verarbeitet das Ergebnis und gibt das Ergebnis via HTTP-Antwort an Arduino zurück
Arduino MySQL HTTP

In diesem Tutorial werden der Webserver und der MySQL-Server auf dem PC installiert.

Es sieht kompliziert aus, ist es aber nicht. Nun sehen wir uns an, wie der indirekte Weg die Nachteile des direkten Weges überwindet.

  • Indem wir den MySQL-Server und den HTTP-Server auf demselben physischen Server installieren, können wir den Zugriff eines MySQL-Benutzerkontos ausschließlich auf localhost beschränken. Darüber hinaus werden der Benutzername und das Passwort des MySQL-Kontos auf dem Server (Schritt 3) gespeichert; dies erhöht die Sicherheit des Systems.
  • Daten werden von einem PHP-Skript (Schritt 3 und Schritt 4) verarbeitet. Dies reduziert den Aufwand und die Komplexität für Arduino- und MySQL-Server. Die Verarbeitung von Daten mit PHP-Code ist viel einfacher als der Arduino-Code und das MySQL-Skript.
  • Ein PHP-Skript kann die Daten verarbeiten und nur notwendige Daten an Arduino (Schritt 4) senden, um zu verhindern, dass dem Arduino der Speicher ausgeht.
  • Die meisten Ethernet-/WLAN-Bibliotheken unterstützen TLS/SSL, wodurch wir HTTPS-Anfragen stellen können. Durch die Verwendung von HTTPS werden die Daten verschlüsselt und sicher über das Internet ausgetauscht.

Schritt 1: Wir können einen weiteren Benutzernamen und ein weiteres Passwort verwenden, um die Authentifizierung zwischen Arduino und Webserver durchzuführen. Bitte beachten Sie, dass der HTTP-Benutzername bzw. das HTTP-Passwort aus Sicherheitsgründen von dem MySQL-Benutzernamen bzw. dem MySQL-Passwort verschieden sein sollte.

Mit diesen Vorteilen wird der Rest dieses Tutorials erläutern, wie man Arduino indirekt mit MySQL verwendet.

Arduino - MySQL über HTTP/HTTPS

Wir müssen den folgenden Schritt durchführen:

  • Installieren Sie MySQL-Server, Webserver und PHP auf Ihrem PC.
  • Aktivieren Sie MySQL-Server und Webserver.
  • Erstellen Sie ein MySQL-Benutzerkonto.
  • Erstellen Sie eine MySQL-Datenbank.
  • Erstellen Sie eine MySQL-Tabelle.
  • Schreiben Sie ein oder mehrere PHP-Skripte.
  • Schreiben Sie Arduino-Code.

Jetzt machen wir es Schritt für Schritt.

1. Installieren Sie MySQL-Server, Webserver und PHP auf Ihrem PC

Glücklicherweise enthält das XAMPP-Paket all diese Dinge. Wir müssen sie nur einmal installieren.

Nach der Installation sehen Sie auf Ihrem PC den Ordner C:\xampp\htdocs. Hier legen Sie den PHP-Code ab (siehe später).

2. MySQL und Webserver aktivieren

  • Öffne das XAMPP-Kontrollzentrum
  • Klicke auf die Start-Schaltfläche, um MySQL und den Webserver zu aktivieren (Siehe unten stehendes Bild)
Arduino XAMPP

3. MySQL-Benutzerkonto erstellen

Wir erstellen ein MySQL-Konto, das sich nur vom localhost aus mit der MySQL-Datenbank verbinden kann.

  • Selbst wenn Benutzername und Passwort offengelegt werden, können die Angreifer nicht auf Ihre MySQL-Datenbank zugreifen, es sei denn, sie übernehmen die Kontrolle über Ihren PC.
  • Da PHP und MySQL auf demselben PC installiert sind, kann PHP diesen Benutzernamen und dieses Passwort verwenden, um eine Verbindung zur MySQL-Datenbank herzustellen.

Lassen Sie uns ein MySQL-Benutzerkonto erstellen, dessen Benutzername Arduino ist und dessen Passwort ArduinoGetStarted.com lautet:

  • Öffnen Sie die Eingabeaufforderung auf Ihrem PC. Schließen Sie sie nicht bis zum Ende des Tutorials.
  • Geben Sie den folgenden Befehl in die Eingabeaufforderung ein:
cd C:\xampp\mysql\bin
Command Prompt
C:\Users\youruser>cd C:\xampp\mysql\bin C:\xampp\mysql\bin>
  • Standardmäßig hat MySQL ein Root-Konto ohne Passwort. Sie sollten ein Passwort festlegen.

(z. B. your-root-password) für das Root-Konto, indem Sie den folgenden Befehl in der Eingabeaufforderung eingeben:

mysqladmin -u root password your-root-password
Command Prompt
C:\xampp\mysql\bin>mysqladmin -u root password your-root-password C:\xampp\mysql\bin>
  • Geben Sie den folgenden Befehl in die Eingabeaufforderung ein:
mysql.exe -u root -p
  • Geben Sie Ihr Root-Passwort ein und drücken Sie 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)]>
  • Erstellen Sie ein MySQL-Benutzerkonto mit dem Benutzernamen Arduino und dem Passwort ArduinoGetStarted.com, indem Sie die untenstehenden Befehle kopieren und in die Eingabeaufforderung einfügen:
CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
Command Prompt
MariaDB [(none)]> CREATE USER 'Arduino'@'localhost' IDENTIFIED BY 'ArduinoGetStarted.com'; Query OK, 0 rows affected (0.005 sec) MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'Arduino'@'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)]>

Sie haben nun erfolgreich ein MySQL-Benutzerkonto erstellt. Merken Sie sich den Benutzernamen und das Passwort; diese werden im PHP-Skript verwendet.

4. Eine MySQL-Datenbank erstellen

Erstellen Sie eine Datenbank mit dem Namen db_arduino, indem Sie den folgenden Befehl in der Eingabeaufforderung eingeben:

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

5. Eine MySQL-Tabelle erstellen

Erstellen wir eine Tabelle mit dem Namen tbl_temp, indem wir die untenstehenden Befehle kopieren und in die Eingabeaufforderung einfügen:

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) );
Command Prompt
MariaDB [(none)]> USE db_arduino; Database changed MariaDB [db_arduino]> MariaDB [db_arduino]> 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_arduino]>

6. Schreibe eine oder mehrere PHP-Dateien

Erstellen Sie eine PHP-Datei mit dem Namen insert_temp.php, die die Temperatur aus der HTTP-Anfrage erhält und in die Datenbank einfügt.

<?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"; } ?>
  • Legen Sie diese Datei in den Ordner C:\xampp\htdocs ab.
  • Ermitteln Sie die IP-Adresse Ihres PCs. Falls Sie nicht wissen, wie das geht, googeln Sie es.
  • Testen Sie den PHP-Code, indem Sie einen Webbrowser (z. B. Chrome) öffnen und auf diesen Link zugreifen: http://192.168.0.26/insert_temp.php?temperature=27.5. Hinweis: Sie müssen die oben genannte IP-Adresse durch Ihre PC-Adresse ersetzen.
  • Die Ausgabe im Webbrowser.
MySQL-Test
  • Überprüfen Sie, ob Daten in der Datenbank gespeichert sind, indem Sie den folgenden Befehl in der Eingabeaufforderung eingeben:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | +---------+------------+ 1 row in set (0.001 sec) MariaDB [db_arduino]>

Wie Sie sehen, ist die Temperatur von 27,5 °C in der Datenbank gespeichert. Der nächste Schritt besteht darin, Arduino so zu programmieren, dass es eine ähnliche HTTP-Anfrage an Ihren PC sendet.

7. Arduino-Code schreiben

Wir verwenden Arduino Uno und Ethernet Shield oder Arduino Uno R4 WiFi für den Test.

Der untenstehende Arduino-Code sendet eine HTTP-Anfrage an Ihren PC, um eine Temperatur von 29,1 °C in die Datenbank einzufügen.

Arduino-Code für Arduino Uno R4 WiFi

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-mysql */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for WEP) WiFiClient client; int status = WL_IDLE_STATUS; 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); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // 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-Code für Arduino Uno/Mega und Ethernet-Shield

/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/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() { }

Schnelle Schritte

  • Wenn Sie das Ethernet Shield verwenden, legen Sie das Ethernet Shield auf den Arduino Uno
  • Verbinden Sie das Ethernet-Kabel mit dem Ethernet Shield
  • Schließen Sie den Arduino Uno über ein USB-Kabel an den PC an
  • Ändern Sie die IP-Adresse im Code auf die IP-Adresse Ihres PCs
  • Kompilieren Sie den Code und laden Sie ihn auf den Arduino hoch
  • Öffnen Sie den seriellen Monitor
  • Das Ergebnis im seriellen 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  
  • Überprüfen Sie, ob Daten in der Datenbank gespeichert sind, indem Sie den folgenden Befehl in der Eingabeaufforderung eingeben:
SELECT * from tbl_temp;
Command Prompt
MariaDB [db_arduino]> SELECT * from tbl_temp; +---------+------------+ | temp_id | temp_value | +---------+------------+ | 1 | 27.5 | | 2 | 29.1 | +---------+------------+ 2 rows in set (0.000 sec) MariaDB [db_arduino]>

Wie Sie sehen können, ist die Temperatur 29,1 in der Datenbank gespeichert.

Wie Arduino Daten in eine MySQL-Datenbank einfügt, aktualisiert oder abruft

Im obigen Beispiel haben wir gelernt, wie man Daten in die MySQL-Datenbank einfügt. Für das Aktualisieren und Abrufen von Daten aus der Datenbank ist es ähnlich. Sie müssen nur die MySQL-Abfragen im PHP-Skript ändern. Weitere Informationen finden Sie bei W3Schools

Fortgeschrittene Nutzung

Um die Sicherheit zu erhöhen.

  • Sie können den Arduino-Code ändern, um HTTPS statt HTTP zu verwenden. Siehe Arduino - HTTPS
  • Sie können einen Benutzernamen und ein Passwort verwenden, um eine Authentifizierung zwischen dem Arduino und dem Webserver durchzuführen. Siehe HTTP-Basis-Authentifizierung

※ Notiz:

Um ein vollständiges System mit dem höchsten Sicherheitsniveau zu erreichen, müssen wir mehr tun (zum Beispiel MySQL-Injektion verhindern, HTTPS zu einer REST-API machen, das JSON-Format für Daten verwenden usw.). Allerdings ist dieses Tutorial für Anfänger gedacht, um Arduino zu lernen. Wir haben es so einfach wie möglich gestaltet. Nachdem man dieses Tutorial durchgearbeitet hat, kann man es erweitern.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!