Hallo Zusammen,
Ich speichere in einer mysql Datenbank, die auf meiner Synology im lokalen Netzwerk läuft Informationen ab.
Nun würde ich gerne Teile der Informationen mit einem Arduino UNO Wifi Rev 2 auslesen (Serieller Monitor reicht für den Start) und den Wert in eine Variable schreiben.
Der direkte Zugriff über die MySql_Connector Library hat bei mir nicht funktioniert daher habe ich mich für einen "HTTP-Request" entschieden.
Nun kann ich zwar im Seriellen Monitor die Temperatur sowie den entsprechenden Zeitstempel sehen, aber nicht weiter verarbeiten.
Daher meine Frage, wie kann ich die Temperatur, sowie den Zeitstempel in eine separate Variable speichern. Der Versuch mit der If abfrage hat nicht geklappt.
Bin jetzt seit 2 Monaten dabei und habe mich bis jetzt mittels Foren und YouTube durchgeschlagen komme nun aber nicht weiter.
Also Kentnisslevel eher im unteren Bereich und daher würde ich mich über detailliertes Feedback freuen.
Hier der Arduino Code:
#include "arduino_secrets.h"
#include <WiFiNINA.h>
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS;
int status = WL_IDLE_STATUS; // the Wifi radio's status#
WiFiClient client;
// Vorbereitung HTTP anfrage
int HTTP_PORT = 80;
String HTTP_METHOD = "POST";
char HOST_NAME[] = "192.168.178.35"; // change to your PC's IP address
String PATH_NAME = "/iot/data/select.php";
String queryString = " ";
//Ausgabe Paramenter
char temp [100] ;
void setup() {
Serial.begin(115200);
//Definition WLAN Name
WiFi.setHostname("ERKIS IOT");
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("You're connected to the network");
// Ausgabe IP Adresse
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}
void loop() {
Serial.println ("Ab in die Schleife");
delay (5000);
// 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("Content-Type: application/x-www-form-urlencoded");
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.println ( "Die Temperatur beträgt: ");
Serial.print(c);
if (c == "Temperature") {
char temp = c;
}
}
}
// the server's disconnected, stop the client:
client.stop();
Serial.println();
Serial.println("disconnected");
} else {// if not connected:
Serial.println("connection failed");
}
delay (5000);
Serial.println ("Auswertung");
Serial.print (temp);
delay (5000);
}
Das führt am Seriellen Monitor zu folgender Ausgabe:
20:09:32.945 -> Attempting to connect to WPA SSID: XXXX
20:09:44.685 -> Attempting to connect to WPA SSID: XXXX
20:09:54.885 -> You're connected to the network
20:09:54.885 -> IP Address: 192.168.178.71
20:09:54.885 -> Ab in die Schleife
20:10:05.632 -> Connected to server
20:10:05.665 -> HTTP/1.1 200 OK
20:10:05.665 -> Server: nginx
20:10:05.665 -> Date: Sun, 26 Dec 2021 19:10:05 GMT
20:10:05.665 -> Content-Type: text/html; charset=UTF-8
20:10:05.665 -> Transfer-Encoding: chunked
20:10:05.665 -> Connection: close
20:10:05.665 -> Vary: Accept-Encoding
20:10:05.699 ->
20:10:05.699 -> 55
20:10:05.699 ->
20:10:05.699 -> Datenbank Verbindung hat geklappt
20:10:05.699 -> Temperatur: 20°C
20:10:05.699 -> Zeitpunkt: 2021-12-26 20:01:52
20:10:05.699 -> 0
20:10:05.699 ->
20:10:05.699 ->
20:10:05.699 -> disconnected
20:10:10.700 -> Auswertung
Zum Schluss noch das dazugehörige PHP Script:
<?php
$mysqli = new mysqli ('localhost' , 'root' , '1234', 'Beispiel');
if($mysqli->connect_error){
echo 'Fehler bei der Verbindung: ' . mysqli_connect_error();
exit();
}
echo "Datenbank Verbindung hat geklappt \n";
//Überprüfung Zeichensatz
if(!$mysqli->set_charset('utf8')) {
echo 'Fehler beim Laden von UTF-8: ' .mysqli_error();
}
$sql = 'SELECT * FROM iotdaten ORDER BY ID DESC LIMIT 1'; // Letzte zeile abfragen --> Sortieren nach absteigender ID und gebe einen Datensatz aus.
$ergebnis = $mysqli->query($sql);
//print_r($ergebnis);
//$zeile = $ergebnis -> fetch_array();
//print_r ($zeile);
$zeile = $ergebnis->fetch_array();
$TempC = ($zeile ['temperatur']) ;
echo "Temperatur: ";
echo $TempC . "°C \n";
$Zeitunkt = ($zeile ['Zeitpunkt']) ;
//echo "<br>";
echo 'Zeitpunkt: ' . $Zeitunkt;
?>
Danke für die schnelle Antwort klar:
Verbindung hat nicht geklappt.
Die PHP Variante funktioniert einwandfrei --> Daraus schließe ich dass der Webserver/DB funktionieren
Serieller Monitor:
20:23:41.861 -> Attempting to connect to WPA SSID: XXXXX
20:23:45.066 -> Attempting to connect to WPA SSID: XXXXX
20:23:56.896 -> You're connected to the network
20:23:56.896 -> IP Address: 192.168.178.71
20:23:56.896 -> Connecting to MYSQL
20:23:56.896 -> ...trying...
20:24:00.515 -> ERROR: Timeout waiting for client.
20:24:00.515 -> Error: -1 = Connection failed.
Code:
#include <WiFiNINA.h>
#include<WiFi.h>
#include "arduino_secrets.h" //Zur Sicherheit Passwort auslagen in neuen TAB
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
//char ist eine Zeichenvariable
//WIFI
char ssid[] = SECRET_SSID; // your network SSID (name)
char pass[] = SECRET_PASS; // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS; // the Wifi radio's status#
//SERVER
IPAddress server_addr (192, 168, 178, 35);
char user[] = "root";
char password [] = "1234";
//Client creation to connect to a specific IP
WiFiClient client;
MySQL_Connection conn((Client *)&client);
void setup() {
//Serille Schnittstelle zum PC, um die Messwerte zu beobachten
Serial.begin(115200);
//Definition WLAN Name
WiFi.setHostname("ERKIS IOT");
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("You're connected to the network");
// Ausgabe IP Adresse
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.println("Connecting to MYSQL");
if (conn.connect(server_addr, 3306, user, password)) {
delay(1000);
}
else
Serial.println("Connection failed.");
conn.close();
}
void loop() {
Serial.println ("Ab in die Schleife");
delay (5000);
}
Schick.
Das ergibt Sinn, wenn der Datenbankserver nicht auf Anfragen von ausserhalb antwortet.
Kannst Du mit z.B. HeidiSQL von einer beliebigen IP-Adresse direkt auf die DB zugreifen?
Danke den hatte ich auch gefunden, bei mir hat der Neustart aller Systeme leider nichts gebracht. Habe jetzt auch nochmal andere Hardware verwendet, das Problem besteht weiterhin.
Trotzdem vielen Dank für die schnelle Rückmeldung
Ist der MySQL-Server vielleicht nur an localhost (127.0.0.1) gebunden? Mach mal ein Portscan auf deine Synology (z.B. mit nmap)
Ansonsten bin ich kein Fan davon wenn ein MySQL-Server übers Netzwerk erreichbar ist. Daher würde ich das PHP-Skript etwas umbauen. Und zwar das es die Temperatur mit JSON formatiert ausgibt. Auf Arduinoseite würde ich den ArduinoHttpClient nehmen und die Response mit ArduinoJson parsen.
Jetzt bin ich wieder wach
Was meinst du mit zugriff auf den einzigen lokalen beschränken?
Wenn ich mich mit root anmelde habe ich doch alle Berechtigungen oder?
So mein lieber...
Also: Du hast auf Deinem Synology die DB.
Den Zugriff darauf hast Du aber begenzt auf die Adresse des Synology.
Ein user der nicht auf dem Synology abfragt, wird abgewiesen.
Die Geschichte geht sogar noch weiter...
Wenn Du mySQL nicht sagst, das auf der lokalen Adresse gehorcht werden soll, dann bekommst Du nicht mal eine Fehlermeldung auf dem anfragendenm System - sondern nur ein timeout.
Nu weiss ich nciht, was Du da hast.
Als Einstieg, wenn das mySql auf dem Syn im lokalen Netzwerk lauschen soll, musst Du in der Config festlegen, das das im lokalen Netzwerk ist.
Es gibt mehrere Varianten - je nach Versionen.
Variante1: /etc/mysql/my.cnf
Variante2: /etc/mysql/mariadb.conf.d/50-server.cnf
Dort muss das Binding vom loopbackadapter auf die Netzwerkadresse gelegt werden:
bind-address = 192.168.178.35
den Mysql-Server neu starten.
Und dann im phpmyadmin einen User anlegen, der nur auf diese DB Zugriff bekommt (bitte nicht root...)
Dieser user bekommt dann Zugriff von Host 192.168.% - fertig.
Mir ja - siehe vor Dir...
Wenn DU sicher stellst, das der Arduino immer 192.168.178.71 hat, dann kannst Du bei der Einrichtung (siehe oben) aus 192.168.% ein 192.168.178.71 machen.