Arduino Wifi SQL hilfe

Warum sollte ein Webserver Internet-Zugang voraussetzen?
Wie ich bereits schrieb: Windows XAMPP (ist bereits weitgehend konfiguriert), Linux Apache (musst Du evtl. noch konfigurieren).
Du kannst dann über die IP des PC (oder wenn Du eine Fritz-Box hast) über den Rechnernamen) zugreifen.
Nochmal: Den Weg über die VM mit Linux kannst Du Dir sparen.

Gruß Tommy

Ich habe jetzt eine Testtabelle und alles angelegt
das Ergebnis sieht so aus:

Screenshot 2024-07-13 111918

Auf dem Laptop sieht das ganze so aus.

also scheint der Fremdzugriff grundsätzlich zu funktionieren.

mein print vom ESP sieht so aus:

11:16:55.255 -> Start
11:16:55.835 -> .......Connectet to: Fluffelwuff
11:16:59.578 -> Try to Ping Server
11:16:59.578 -> 192.168.178.65 response time : 4/23.00/91 ms
11:17:03.646 -> Connecting to database . . .
11:17:04.615 -> ping 5, timeout 0, total payload 160 bytes, 5023 ms
11:17:04.680 -> Connection failed.   On: 192.168.178.65  As: test4  with PW: test4

Das pingen zeigt mir ja das er den Server Grundsätzlich erreichen kann.
Die anmelde daten sind auch richtig.

was mich ein bisschen stutzig macht, ich sage ihm ja im code nirgends auf welche datenbank (GA_MK23) er eig. zugreifen soll. sondern nur die Serveradresse und die Logindaten. Ist da vllt der fehler?

Welche DB kannst Du mit dem USE-SQL-Kommando festlegen. Dazu brauchst Du aber erst mal eine Anmeldung.

Gruß Tommy

Ich habe mir nochmal Deinen Sketch in #18 angeschaut. Der passt nicht zu der von mir benutzten MySQL-Connector-Lib.
Schau Dir dort mal das connect.ino Beispiel an.

In der Lib gibt es kein MySQL.h. Du scheinst eine andere Lib zu nutzen oder eine veraltete Version.

Gruß Tommy

Ich habe das gnaze jetzt auf die #include <MySQL_Connection.h> umgemünzt bekomme aber irgendwelche Compiler errors die ich nicht ganz verstehe.

Mein Code

#include <ESP8266WiFi.h>
#include <ESPping.h>
#include <MySQL_Connection.h>

// weil ich faul bin
#define sp Serial.print
#define spn Serial.println

// WLAN
// das bitte ändern
// <= 31 Zeichen
char ssid[]= "Fluffelwuff";
// >= 8 oder <= 63 Zeichen oder NULL
char password[] = "mathrimsPW";

// DB
IPAddress server_addr  (192,168,178,65); 
 char user[] = "test4"; // SQL-Nutzer
 char dbpassword[] = "test4"; // SQL Kennwort
//static char db[] = "amselNeu";
char INSERT_SQL[] = "INSERT INTO test_arduino.hello_arduino (message) VALUES ('Hello, Arduino!')";

WiFiClient client;                 // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);


void setup() {
  WiFi.hostname(user);
boolean erg;  
  Serial.begin(74880);
  spn("\nStart");
  WiFi.begin(ssid,password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    sp(".");
  }
  if(WiFi.status()==WL_CONNECTED){sp("Connectet to: ");spn(ssid);}

spn("Try to Ping Server");
  // Ping IP
  const IPAddress remote_ip(192,168,178,65);
  Serial.print(remote_ip);

  if (Ping.ping(remote_ip) > 0){
    Serial.printf(" response time : %d/%.2f/%d ms\n", Ping.minTime(), Ping.averageTime(), Ping.maxTime());
  } 
  else {
    Serial.println(" Error !");
  }
delay(50);


Serial.print("Connecting to SQL...  ");
  if (conn.connect(server_addr, 3306, user, password))
    Serial.println("OK.");
  else
    Serial.println("FAILED.");
}
void loop() {
  
}

mein Output Log

c:\Users\Mathrim\Documents\Arduino\libraries\MySQL_Connector_Arduino\src\MySQL_Encrypt_Sha1.cpp: In member function 'virtual size_t Encrypt_SHA1::write(uint8_t)':
c:\Users\Mathrim\Documents\Arduino\libraries\MySQL_Connector_Arduino\src\MySQL_Encrypt_Sha1.cpp:89:1: error: no return statement in function returning non-void [-Werror=return-type]
   89 | }
      | ^
c:\Users\Mathrim\Documents\Arduino\libraries\MySQL_Connector_Arduino\src\MySQL_Encrypt_Sha1.cpp: In member function 'virtual size_t Encrypt_SHA1::write(uint8_t*, int)':
c:\Users\Mathrim\Documents\Arduino\libraries\MySQL_Connector_Arduino\src\MySQL_Encrypt_Sha1.cpp:95:1: error: no return statement in function returning non-void [-Werror=return-type]
   95 | }
      | ^
cc1plus.exe: some warnings being treated as errors

exit status 1

Compilation error: exit status 1

In der aktuellen Version auf github ist das bereinigt.
Das war in früheren Versionen des C++-Compilers zulässig.

Gruß Tommy

ah ok, dachte weil die standartmäßig installiert ist, ist die auch aktuell. hab sie manuell aktualisiert jetzt habe ich keine errors mehr

SOOOOO ich habe wieder einen ERROR aber diesmal eine n schönen, nämlich einen der mir sagt warum es nicht geht (hoffentlich)

13:06:58.020 -> Connecting to Fluffelwuff.......
13:07:02.344 -> Connected to network
13:07:02.344 -> My IP address is: 192.168.178.64
13:07:02.375 -> Connecting to SQL...  ...trying...
13:07:02.697 -> Error: 109 = Client does not support authentication protocol requested by server; consider upgrading MySQL client.
13:07:02.729 -> FAILED.
13:07:06.002 -> ERROR: Timeout waiting for client.

Die Frage ist, was will mir der Künstler hier sagen?

Dazu steht etwas im Wiki.
Wie bereits geschrieben, verwende ich keinen Direktzugriff mehr auf eine lokale DB (seit ca. 5 Jahren).

Gruß Tommy

Das stimmt und was da steht stimmt auch. XD

19:41:03.564 -> Connecting to Fluffelwuff.......
19:41:07.888 -> Connected to network
19:41:07.888 -> My IP address is: 192.168.178.64
19:41:07.923 -> Connecting to SQL...  ...trying...
19:41:08.309 -> Connected to server version 8.0.35
19:41:08.309 -> OK.

Danke für deine Hilfe ich werde nochmal eine Zusammenfassung der Schritte unten posten und das als Lösung markieren, auch wenn du die Lösung eig. geliefert hast.

Schön, dass es jetzt funktioniert. :smile: Du hast Ausdauer bewiesen.

Dadurch dass sich manche Gegebenheiten im Laufe der Versionen ändern, ist Hilfe aus der Ferne immer schwer möglich.
Beschäftige Dich intensiv mit SQL, das zum Glück weitgehend standardisiert ist. (Ich komme eigentlich aus der ORACLE Ecke)
Man kann mit Datenbankabfragen sehr viele Infos aus seinen Daten heraus holen. Auch grafische Darstellungen sind möglich.

Ich benutze den DB-Server/Webserver beim Provider, um auch von unterwegs auf die Daten zugreifen zu können. Dafür dann HTTPS. Im lokalen Netz brauchst Du HTTPS nicht wirklich. Falls Du mit dem ESP8266 auf beliebige Server über HTTPS zugreifen willst, habe ich hier ein Tutorial geschrieben.
Wenn Du Fragen zu SQL hast, melde Dich ruhig.

Gruß Tommy

Edit: Falls Du öfter mit DB arbeitest und nicht alles auf der Kommandozeile erledigen willst, schau Dir mal das freie Tool DBeaver an.

Ich wollte gerade die Solving Nachricht absetzen aber leider bin ich mal wieder am verzweifeln.

Nachdem das ganze auf der Virtuellen Maschine lief, habe ich mir einen Raspi 3 zugelegt und wollte das ganze dir nochmals machen.

mit dieser Anleitung: Setup a Raspberry Pi MYSQL Database - Pi My Life Up

Leider ist jetzt wieder (nach anderen Problemen) das Problem da das der Esp sich nicht verbinden kann.

Diesmal gibt es aber keine ausführliche Fehlermeldung Sonden nur das hier

Connecting to Alice im WLan....................
Connected to network
My IP address is: 192.168.2.68
Connecting to SQL...  ...trying...
...got: 0 retrying...
...trying...
...got: 0 retrying...
...trying...
...got: 0 retrying...
FAILED.

Ich habe keine Ahnung was da schief gelaufen ist.

Aber mal zu Verständnis, MariaDB ist im Prinzip das gleiche und funktioniert auch identisch oder?

Die befehle habe mitunter eine andere Syntax wie mir scheint.

Iwi habe ich auch die Version

mariadb Ver 15.1 Distrib 10.11.6-MariaDB, for debian-linux-gnu (aarch64) using EditLine wrapper
und aktuell ist die ja bei 11.6. ich weis nicht ob das was macht aber wenn ich

mysql_upgrade

benutze alt er das wäre aktuell.

Ja

Nö.

Gruß Tommy

Ich bin ein Idiot...

My IP address is: 192.168.2.68
Connecting to SQL...  ...trying...
Connected to server version 5.5.5-10.11.6-MariaDB-0+deb12u1
OK.

Ich habe zwar die anmelde Daten angepasst... habe wenn man einen neuen Server Einrichtet dann braucht man auch eine neue IP für den ESP wo er sich anmelden soll...

Ja, aber aus solchen Fehlern lernt man (sollte man zumindest).
Was nimmst Du als Speichermedium für die DB und welchen RasPi hast Du?
Wie sicherst Du die DB?

Gruß Tommy

Ich benutze einen raspberry pi3. ein Sicherheitskozept gibt es noch nicht . Nicht weil ich das für nebensächlich erachte, sondern weil mir da jede Vorkenntnis fehlt. Ich habe aber jemanden in meinem Bekanntenkreis der sich damit,?beruflich bedingt, sehr gut auskennt. Mit dem werde ich in den nächsten Wochen ein Konzept erarbeiten. Danke für den Einwurf ich hatte das so garnicht auf dem Schirm.

Als ersten Ansatz

Gruß Tommy

So. nachdem die Datenbank nun fertig eingerichtet ist wollte ich heute mal ein par Testdaten in meine Tabelle schreiben und bin mit dem Ergebnis nur mäßig zufrieden. Es wurden nämlich keine Daten geschrieben.

das ist mein Code den ich verwende (weiter unten nochmal der für den Vorgang relevante teil)

#include <ArduinoWiFiServer.h>
#include <BearSSLHelpers.h>
#include <CertStoreBearSSL.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WiFiGeneric.h>
#include <ESP8266WiFiGratuitous.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266WiFiSTA.h>
#include <ESP8266WiFiScan.h>
#include <ESP8266WiFiType.h>
#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <WiFiClientSecureBearSSL.h>
#include <WiFiServer.h>
#include <WiFiServerSecure.h>
#include <WiFiServerSecureBearSSL.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>           
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <NTPClient.h>

//SensorValues

int humidity,moist,temperature,pressure,light;

//converters
char query[128];
String sendhum,sendmoi,sendtemp,sendpres,sendlig,postdata;

//Sensor Settings

int ID=999;

//Sender
char INSERT_SQL[] = "INSERT INTO GA_MK23.Measurement (ID,Moist,Humidity,Airpressure,Temperature,Light) VALUES (%d,%d,%d,%d,%d,%d)";


//////////////////////////////////////
//     WLAN und SQL SERVERDATEN     //
//////////////////////////////////////
IPAddress server_addr(192,168,4,10);// 
char user[] = "Sensor";             // 
char password[] = "ESP8266";        //
//////////////////////////////////////

///////////////////
//NETWORKSETTINGS//
///////////////////
char ssid[] = "GA_MK23";         
char pass[] = "1234567890";    


// Sample query
WiFiClient client;                 
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

void setup()
{
  Serial.begin(9600);
  Serial.printf("\nConnecting to %s", ssid);                    //Debug Only
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  // print out info about the connection:
  Serial.println("\nConnected to network");                    //Debug Only
  Serial.print("My IP address is: ");                          //Debug Only
  Serial.println(WiFi.localIP());                              //Debug Only

  Serial.print("Connecting to SQL...  ");                      //Debug Only 
  if (conn.connect(server_addr, 3306, user, password))
    Serial.println("OK.");                                     //Debug Only
  else
    Serial.println("FAILED.");                                 //Debug Only
  
  // create MySQL cursor object
  cursor = new MySQL_Cursor(&conn);
}

void loop(){

//Messure//
 light=123;
 humidity=300;
 moist=87;
 pressure=10293;
 temperature =23,23;

//start query//
  if (conn.connected())
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
//Send Data//
sprintf(query, INSERT_SQL, ID,moist,humidity,pressure,temperature,light);
Serial.print("Send Data: ");Serial.println(sprintf(query, INSERT_SQL, ID,moist,humidity,pressure,temperature,light));
//Wait//
  delay (1000);
}

hier nochmal gekürzt

//SensorValues
int humidity,moist,temperature,pressure,light;
//converter
char query[128];
//Sensor Settings
int ID=999;
//command
char INSERT_SQL[] = "INSERT INTO GA_MK23.Measurement (ID,Moist,Humidity,Airpressure,Temperature,Light) VALUES (%d,%d,%d,%d,%d,%d)";
// Sample query
WiFiClient client;                 
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

...

void loop(){

...
//Messure//
 light=123;
 humidity=300;
 moist=87;
 pressure=10293;
 temperature =23,23;

//start query//
  if (conn.connected())
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
//Send Data//
sprintf(query, INSERT_SQL, ID,moist,humidity,pressure,temperature,light);
Serial.print("Send Data: ");Serial.println(sprintf(query, INSERT_SQL, ID,moist,humidity,pressure,temperature,light));
//Wait//
  delay (1000);
}

mein Output sieht so aus

Connected to network
My IP address is: 192.168.4.3
Connecting to SQL...  ...trying...
Connected to server version 5.5.5-10.11.6-MariaDB-0+deb12u1-log
OK.
Send Data: 114
Send Data: 114
Send Data: 114
Send Data: 114

und dann bin ich nochmal uf den Raspi und habe mir mal

SHOW PROCESSLIST

angeguckt, da kam dann das hier raus

Sorry ist grad nur n Foto vom Monitor aber das ging grad nicht anders.

Also er scheint irgendetwas zu schicken aber es sieht so aus als ob er entweder NULL sendet oder vllt passen die Datenformate nicht aufeinander? in meiner Tabelle af der DB sind alle werte INT.

Bildschirmfoto 2024-07-23 um 00.34.41

Lass Dir doch mal das Statement ausgeben:

Serial.print("Send Data: ");Serial.println(query);

Dein Send Data: 114 ist die Länge der Query in Deiner eigenen Ausgabe da ist noch nichts gesendet. Das fehlt noch. Schau noch mal in die Beispiele.

Gruß Tommy

Was soll das sein?

Gruß Tommy