HTTP Request auswerten

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;



?>

Kannst und willst Du das näher beschreiben?

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?

Was gibt Dir phpMyAdmin für Rechte aus?

Das Freut mich, dass es Sinn ergibt Heidi SQL bringt mich nicht weiter da ich einen Mac habe - was wäre die Mac Alternative?

mysqladmin (Wenn ich richtig informiert bin unter : /usr/local/mysql/bin/mysqladmin)

das verstehe ich nicht -sorry-

... und ich hab keinen mac - auch sorry, aber dann mach halt php... - wo ich auch raus bin ;(

Aber wo vermutest du den Fehler?

Das will ich ergründen - weil hatten wir schon mal... MySQL connection "Timeout waiting for client"
.. in anderer Form. - gelöst aber ohne Angabe von Gründen.

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

Gerne - schade, das ich da nicht weitermachen kann, mir fehlt sowohl der mac, als auch der wifi ... (Mein Kabel funktioniert) :slight_smile:

dann viel erfolg....

Biste noch wach?
Eigentlich denke ich ist das wie auslesen aus der seriellen Schnittstelle :slight_smile:
Mir hat das keine Ruhe gelassen.

Möchstest mal ausprobierem ob der geht (ich kann den aktuell nicht mal kompilieren) und mal schreiben, ob es da Ausgaben gibt - und welche...

#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
const unsigned int anzahl = 100;
char temp[anzahl] ;
unsigned int zaehler = 0;


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);
  delay (5000);
}


void loop()
{
  Serial.println ("Ab in die Schleife");
  // 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
    zaehler = 0;
    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);
        if ((zaehler >= anzahl) || (c == '\n'))
        {
          temp[zaehler] = '\0';
          Serial.println(F("Zeile gefunden: "));
          Serial.println(temp);
          memset(temp, 0, anzahl);
          zaehler = 0;
        }
        else
        {
          temp[zaehler] = c;
          zaehler++;
        }
      }
      // the server's disconnected, stop the client:
      client.stop();
      Serial.println();
      Serial.println("disconnected");
    }
    else    // if not connected:
    {
      Serial.println("connection failed");
    }
  }
  delay(5000);
}

Sollte der erste Versuch nichts vernünftiges ausgeben, dann die Zeile

if ((zaehler >= anzahl) || (c == '\n'))

runterkürzen:

if (zaehler >= anzahl) 

Da habe ich doch gestern was übersehen!
Wenn Du den Zugriff auf den einizigen lokalen beschränkst, kann das nichts werden!
Aendern:

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 :wink:
Was meinst du mit zugriff auf den einzigen lokalen beschränken?
Wenn ich mich mit root anmelde habe ich doch alle Berechtigungen oder?

:wink: Schick.

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.

Hi der Code gibt egal bei welcher Variante die folgende Ausgabe (hilf mir auch nicht weiter:

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.