ESP8266 > Raspi MySQL

Hallo in Runde, ich versuche grad einen ESP8266 zu motivieren Messwerte an eine Raspi im lokalen WLAN zu senden.

#include <ESP8266WiFi.h>           // Use this for WiFi instead of Ethernet.h
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

IPAddress server_addr('127.0.0.1');  // IP of the MySQL *server* here
//IPAddress server_addr('192.168.178.43');  // nix funzt
// IPAddress server_addr('localhost');  // IP of the MySQL *server* here

char user[] = "admin";              // MySQL user login username
char password[] = "***";        // MySQL user login password

// Sample query
char INSERT_SQL[] = "INSERT INTO  pytest(txt, nbm) VALUES('Arduino', 1)";

// WiFi card example
char ssid[] = "***";         // your SSID
char pass[] = "***";     // your SSID Password

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

void setup()
{
  Serial.begin(115200);
 // while (!Serial); // wait for serial port to connect. Needed for Leonardo only

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

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

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

void loop()
{
  if (conn.connected())
    cursor->execute(INSERT_SQL);

  delay(5000);
}

Die Verbindung zum WLAN ist o.k. Aber die Verbindung zur Datenbank wird nicht hergestellt.
Benutzer und PW der Datenbank sind richtig eingetragen. Vom Raspi aus kann per Pythonscript auf die Datenbank zugegriffen werden. In dem Fall verwende ich als IP:'localhost'
Aber egal welche IP ich unter Arduino verwende - keine Verbindung zur Datenbank!

Wo kann der Fehler liegen? Kann wer helfen?

Danke und einen schönen Sonntag noch...
Stefan

Folgendes bei der Datenbankkonfiguration beachtet?

Im Beispiel steht:

MySQL_Connection conn((Client *)&client);

Das ist mit Sicherheit auch falsch.

Aufpassen: MySQL nimmt vom standrsd her nur anfragen von :localhost (127.0.0.1) an.

Der raspi muss zudem auch eine entsprechende portfreigabe (3306) für die Schnittstelle haben.

Alternativ könntest du auch die Daten per UDP zum Raspi schicken und dann dort mit nem kleinen Skript in die Datenbank lokal eintragen.
So hatte ich das mal gemacht:

Anleitung 1 - Daten mit UDP senden/empfangen:

Anleitung 2 - Daten in Datenbank schreiben (und ich wollte Daten auch mal als graf wieder auslesen, deshalb etwas mehr als du brauchst):

Und jeder andere auch.
Beim Connect auf mySql-Ebene hab ich wenigstens noch die Hürde der richtigen IP und der richtigen Zugangsdaten.

Oder hab ich was übersehen?

Man kann lokal problemlos vom ESP8266 direkt auf MySQL/MariaDB zugreifen. Die Verbindung ist unverschlüsselt, was im lokalen Netz in meinen Augen kein Problem ist.

Auf eine ferne Datenbank greife ich per HTTPS auf ein PHP-Script zu, dass die Daten per PDO oder mysqli in die Datenbank einträgt.
Die grafische Auswertung erfolgt mit chart.js, das per PHP "gefüttert" wird.

Gruß Tommy

Vom Prinzip her hast du nix übersehen. Ich halte im lokalen Netz nur die Wahrscheinlichkeit für extrem gering. Worst-case ist die app schmiert ab, wenn er etwas anderes schickt. Wenn er uns ärgern möchte schickt er ein gültiges Format mit falschen Werten :lying_face:
Risiko muß natürlich jeder für sich selber abwägen :v:

1 Like

Ok. :wink:
Ich wollt ja nur anmerken, das ein Zombie im eigenen Netz nichts Gutes verheisst.

1 Like

Danke für die vielen Hinweise - aber leider....
Ich habe Raspi neu aufgesetzt und die Pakete installiert:

sudo apt-get install apache2
sudo apt install mariadb-server php-mysql

Entsprechend der Seite mariadb.com

sudo nano /etc/mysql/mariadb.conf.de/50-server.cnf
      bind-address            = 192.168.178.39 #Addresse des ESP

kein Erfolg.

sudo nano /etc/mysql/mariadb.conf.de/50-server.cnf       
	[mysqld]
	Skip-Networking = 0
	Skip-Bind-Adresse

am Ende der Datei eingefügt.
sudo systemctl restart mariadb

pi@RP4:~ $ sudo systemctl restart mariadb
Job for mariadb.service failed because the control process exited with error code.
See "systemctl status mariadb.service" and "journalctl -xe" for details.
netstat -nlp
tcp        0      0 192.168.178.39:3306     0.0.0.0:*               LISTEN 

aber da steht nix, dass mariadb is listen - Fehler?

docs.rackspace ist da auch nicht so hilfreich:
mysql -u root -p
verlangt das Passwort von root. Das bei der Installation festgelegt Passwort wird nicht akzeptiert.

Am Ende 2 Tage viel Erfahrung gesammelt - Ergebniss: 0

Der ursprünglich Plan ist per Python Messwerte vom Arduino anzufragen.
Nach Aufforderung sendet der ESP8266 die Meßwerte an den Raspi auf welchem das Pythonscript dann weiter abgearbeitet wird und anschließend zu Thingsspeak als einen Datensatz senden.
Umsetzen wollte ich es mit einem MQTT-Broker: Public und Subscribe funzen. Aber die Antwort vom ESP kommt nicht im Pythonscript an.

Vielleicht kennt noch wer eine andere Lösung?
PS: mir wäre es sehr lieb die ganze Prozedur auf dem Raspi in Python abzuarbeiten :slight_smile:

Danke - Stefan

Die bind-Adresse ist die der Netzwerkverbindung, auf die die DB lauschen soll, nicht die des ESP.
Die des ESP muss beim User, der die Daten schreiben soll, eingetragen werden.

Gruß Tommy

Da gehört Deine lokale Raspi-Adresse

Nicht das vom raspi, sondern von der mysql-Installation.

Ich glaub in Deiner Liste gehört ncoh rein:

sudo mysql_secure_installation

Da wird das PW festgelegt...

Ok, jetzt hast du mich neugierig gemacht. Könnte ich in Zukunft ja vielleicht auch mal brauchen also würd ich das spätestens zum Wochenende mal probieren :slightly_smiling_face:

Aja, habe gestern noch bis spät gebastelt - bin zu doof dafür :slight_smile:

meine Lösung:

  • Auf dem Raspi werder per Python-Script die Messdaten in einen String gesammelt.
  • anschließend wird der Arduino angepingt.
  • Variante A: ESP ist im Netz: dann erhält er vom Raspi per MQTT-Broker den Topic mit den Messdaten, ergänzt diesen mit Aussentemperatur und Luftfeuchte, und sendet alles Richtung Thingspeak.
  • Variante B: ESP ist nicht im Netz: dann sendet Python die Messdaten direkt an Thingspeak.

Ich bin mir nur unsicher wie der ESP mit dem String umgehen kann.

Danke für jede Hilfe und Unterstützung, Jubel von den Tribünen :slight_smile: - man lernt noch immer dazu....

Danke - Stefan

glückwunsch wenn du zufrieden bist :slight_smile: . hatte es jetzt auch noch mal probiert. weiß zwar nicht ob es jetzt in die richtung geht wie du es dir vorstellst aber ich habe jetzt auf dem ESP ein topic subscribed wo ihm dann wiederum ein befehl geschickt werden kann auf den hin er dann seine messdaten published, die dann in dem python skript ankommen. ist glaub ich nicht exakt dein use case bzw. fehlt nur noch das weiterschreiben in die datenbank, aber vielleicht hilft es ja noch.
damit auch ich es in ein paar monaten noch wiederfinde hab ichs mir hier zusammen geschrieben:

Danke für die Lösung, das war der Plan.
Vielleicht noch ein Hinweis zum sehr schön erläuterten Tutorial:
Nach Installation des MQTT-Servers auf dem Raspie klappte das Senden und Empfangen auf dem Raspi in 2 Konsolen perfekt. Aber am ESP kam trotzdem nix an.
Erst nach dem Tip (gelesen im Elektronik-Kompedium)

Zuerst öffnen wir die Konfigurationsdatei von Mosquitto:
sudo nano /etc/mosquitto/conf.d/local.conf
In die Datei fügen wir folgende Zeilen ein:

listener 1883
allow_anonymous true

Anschließend die Datei speichern und schließen: Strg + O, Return, Strg + X.
Damit die Konfiguration wirksam wird, muss Mosquitto neu gestartet werden.
sudo systemctl restart mosquitto<

hat der ESP die Topics erfolgreich empfangen.

Danke - Stefan

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.