MySQL connection "Timeout waiting for client"

Hallo Zusammen,

nach einer kleinen Änderung gab es ein Problem mit MySql_connection (siehe ab #19).

Siehe hier https://forum.arduino.cc/t/datum-wird-nicht-mehr-richtig-angezeigt/913778

Ich habe die Änderung im MySQL_Encrypt_Sha1.cpp wie folgt gemacht.

size_t Encrypt_SHA1::write(uint8_t data) {
  ++byteCount;
  addUncounted(data);
  return 1;
}

size_t Encrypt_SHA1::write(uint8_t* data, int length) {
  for (int i=0; i<length; i++) {
    write(data[i]);
  }
  return length;
}

Dadurch wird kein Fehler mehr beim kompilieren angezeigt.

Allerding wird kommt im Programm jetzt eine Fehlermeldung:

ERROR: Timeout waiting for client.
Error: -1 = Connection failed.
ERROR: Class requires connected server.

Das Programm lief bisher einwandfrei!!!

Unter IE und HeidiSQL kann ich den SQL-Server mit dem User und Password öffnen.

Hier der Test-Skretch:

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

// Data for WiFi access
const char* ssid = "***";
const char* pass = "***";

WiFiClient client;


IPAddress server_addr(192,168,178,33);  // IP of the MySQL *server* here
char user[] = "***";              // MySQL user login username
char password[] = "***";        // MySQL user login password


MySQL_Connection conn((Client *)&client);



void setup() {
  Serial.begin(115200);

    WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
 
  Serial.println(F("Connected to the WiFi network"));
  

}

void loop() {
  while (!Serial); // wait for serial port to connect
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
    // You would add your code here to run a query once on startup.
  }
  else
    Serial.println("Connection failed.");
  conn.close();
  delay(5000);
}

hier die Fehlermeldung:

Connecting...
...trying...
ERROR: Timeout waiting for client.
Error: -1 = Connection failed.
Connecting...
...trying...
ERROR: Timeout waiting for client.
Error: -1 = Connection failed.

Ich hoffe, Ihr könnt mir helfen

Hosrt

Welche Version der MySQL-Lib verwendest Du?

Gruß Tommy

Hallo Tommy56,

MySQL_Connector_Arduino-1.2.0

Horst

Ok, die verwende ich auch. Ich habe gerade mal einen Test mit einer DB bei meinem Provider gemacht, das funktioniert mit diesem Sketch:

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

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

// <= 31 Zeichen
const char *ssid = "wlanSSID";
// >= 8 oder <= 63 Zeichen oder NULL
const char *password = "wlanPwd";

char stmt[256];

char dbuser[] = "DB-Username";               // MySQL user login username
char dbpassword[] = "DB-Passwort";         // MySQL user login password

char db[] = "Datenbankname";          // DB-Name

uint32_t lastMillis;

void setup() {
  int counter = 0;  // Counter für Verbindung zum WLAN
  Serial.begin(115200);
  Serial.println("\nStart");

  WiFi.persistent(false);
  // Betrieb als Station
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay (500);
    Serial.print(".");
    counter++;
    if (counter > 100) {
      Serial.println("Kein WLAN. Restart!");
      ESP.restart();
    }
  }
  Serial.print("\nConnected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
	
  IPAddress remote_addr;
  if (WiFi.hostByName("DB-Server-name", remote_addr)) {
	Serial.print("Remote-DB: ");
	Serial.println(remote_addr);
  }
  Serial.println("\nConnecting to database . . .");
  if (conn.connect(remote_addr, 3306, dbuser, dbpassword)) {
    Serial.println("DB-Connection ok.");
    delay(500);
  }
  else {
    Serial.println("DB-Connection failed.");
    delay(10000);
    ESP.restart();
  }  
}

void loop() {

}

Das ergibt ein:

.......
Connected to ......
IP address: 192.168.178.28
Remote-DB: 178.254.0.226

Connecting to database . . .
...trying...
Connected to server version 5.7.24-0ubuntu0.18.04.1-log
DB-Connection ok.

Gruß Tommy

Edit: Ich habe gerade eine lokale DB angelegt, damit läuft es auch.

Hallo Tommy56,

das kommt als Fehler.
Ich hatte schon mal ein Problem mit MySQL und damal habe ich die DB vollkommen neu aufgebaut.

Das werde ich morgen machen.

Oder kannst du mit der Fehlermeldung was anfangen?

Horst

.......
Connected to Topgun
IP address: 192.168.178.150

Connecting to database . . .
...trying...
...got: 0 retrying...
...trying...
...got: 0 retrying...
...trying...
...got: 0 retrying...
DB-Connection failed.

Er bekommt keine Antwort von der DB, z.B. weil die IP nicht stimmt oder die DB nicht läuft.

Wenn Username/Passwort falsch sind, erfolgt eine Fehlermeldung:
Error: 84 = Access denied for user

Gruß Tommy

Ich hätte vermutet, das der schon vorher nicht auflöst.
IP-Adress ist die eigene, aber es fehlt an der Gegenstelle. Und die sollte rauskommen, auch wenn es später keinen Connect gibt.

@topgun-811
Also die Gegenseite mal nicht mit DNS auflösen sondern fest vergeben:

remote_addr

Bei seinem Sketch ist die IP (lokales Netz) angegeben.

Wenn sie nicht auflöst, steht bei mir 255.255.255.255 drin. Das sollte man an der Ausgabe sehen.
Ich habe meinen Testsketch jetzt per #define wahlweise auf den lokalen oder den remote DB-Server umstelbar gemacht. Durch einen Fehler dabei habe ich diese Ausgabe gesehen.

Gruß Tommy

Ok, ich bin davon ausgegangen, das der Deinen genommen hat...
Na mal sehen... :wink:

Meiner sieht komplett jetzt so aus:

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

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

// <= 31 Zeichen
const char *ssid = "SSID";
// >= 8 oder <= 63 Zeichen oder NULL
const char *password = "wlanPwd";

char stmt[256];

//#define REMOTE 1  // wenn RemoteDB einkommentieren
#ifdef REMOTE
char dbuser[] = "rDBUser";               // MySQL user login username
char dbpassword[] = "rDBPwd";         // MySQL user login password
char hostname[] = "rDB-Hostname";
char db[] = "rDBName";          // DB-Name
IPAddress server_ip;
#else
char dbuser[] = "lDBUser";
char dbpassword[] = "lDBPwd";
IPAddress server_ip = {192,168,178,34};  // lokale IP des DB-Servers
char hostname[] = ""; // kein Hostname!
char db[] = "lDBname";
#endif

uint32_t lastMillis;

void printRes(int res) {
  if (res==1) Serial.println("OK");
  else Serial.println("NOT OK");
}

void setup() {
int counter = 0;  // Counter für Verbindung zum WLAN
  Serial.begin(115200);
  Serial.println("\nStart");

  WiFi.persistent(false);
  // Betrieb als Station
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay (500);
    Serial.print(".");
    counter++;
    if (counter > 100) {
      Serial.println("Kein WLAN. Restart!");
      ESP.restart();
    }
  }
  Serial.print("\nConnected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  
  if (hostname[0]) {  // hostname --> remote
      WiFi.hostByName(hostname, server_ip);
      Serial.print("Remote-DB: ");
  } else Serial.print("Local DB: ");
  Serial.println(server_ip);
  Serial.println("\nConnecting to database . . .");
  if (conn.connect(server_ip, 3306, dbuser, dbpassword)) {
    Serial.println("DB-Connection ok.");
    cursor = new MySQL_Cursor(&conn);
    strcpy(stmt,"use ");
    strcat(stmt,db);    // Auswahl der Datenbank
    int res = cursor->execute(stmt); // 1=ok
    Serial.print("Res: ");  
    printRes(res);
    delay(500);
  }
  else {
    Serial.println("DB-Connection failed.");
    delay(10000);
    ESP.restart();
  }  
}

void loop() {

}

Gruß Tommy

Hallo,

erst mal die gute Nachricht: ES GEHT WIEDER

Allerdings weiß ich nicht warum. Ich habe den Sketch von Tommy56 ausprobiert und es ging nicht.

Darauf hin, habe ich alle Geräte (Fritz-Box, PC, NAS) aus- und eingeschaltet. Und siehe da, es funktioniert alles wieder.

Vorerst an ALLE vielen, vielen Dank.
Horst