Forum: Mikrocontroller und Digitale Elektronik esp8266: keine Verbindung zu Apache-Server


von Oliver V. (japili)


Lesenswert?

Hallo,

ich möchte einen ESP8266 benutzen, um Sensordaten in eine Datenbank zu 
übertragen. Zum Programmieren nutze ich einen "ESP8266-Programmer" (mit 
Widerstand zwischen GPIO0 und GND) am USB meines Rechners. Auf demselben 
Rechner läuft ein Apache-Server (Ports 80, 443) und die MySQL-Datenbank. 
Diese kann ich über ein einfaches "test4.php"-Skript problemlos mit 
meinem Smartphone "beschreiben". Folgender Sketch läuft auf dem ESP8266:
1
#include <ESP8266WiFi.h>
2
3
#define DEBUG true // true = Ausgabe im Seriellen Monitor
4
5
const char* ssid       = "Wifiname";
6
const char* password   = "Wifipasswort";
7
//const char* host       = "google.de";       // <- funktioniert mit esp8266!
8
//IPAddress host(172, 217, 30, 9);            // <- funktioniert mit esp8266 (Google-IP)!
9
IPAddress host(192, 168, 178, 41);            // <- funktioniert nicht mit esp8266, mit Smartphone schon!
10
const int httpPort = 80;                      // Apache-Server auf Laptop: Port 80, 443, wie gesagt: php-Skript mit Smartphone erreichbar!
11
12
char email[20];
13
char vorname[20];
14
char nachname[20];
15
16
void connectAndSendData()
17
{
18
  if (DEBUG) {
19
    Serial.println("");
20
    Serial.print(F("Verbinde zu '"));
21
    Serial.println(host);
22
  }
23
24
  WiFiClient client;
25
  if (!client.connect(host, httpPort)) {
26
    if (DEBUG) {
27
      Serial.println(F("[FEHLER]"));
28
      Serial.println();
29
    }
30
    return;
31
  }
32
  Serial.println("Ok");
33
34
  // Aufbau der URL
35
  String url = "/MyPages/test4.php?";
36
  url += "email=";
37
  url += email;
38
  url += "&vorname=";
39
  url += vorname;
40
  url += "&name=";
41
  url += nachname;
42
43
  if (DEBUG) {
44
    Serial.print("Requesting URL: ");
45
    Serial.println(url);
46
  }
47
48
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
49
               "Host: " + host + "\r\n" +
50
               "Connection: close\r\n\r\n");
51
  unsigned long timeout = millis();
52
  while (client.available() == 0) {
53
    if (millis() - timeout > 5000) {
54
      if (DEBUG) Serial.println("[Client Timeout]");
55
      client.stop();
56
      return;
57
    }
58
  }
59
60
  // Serverantwort auf Serial
61
  if (DEBUG) {
62
    while (client.available()) {
63
      String line = client.readStringUntil('\r');
64
      Serial.print(line);
65
    }
66
    Serial.println("");
67
    Serial.print(F("Verbindung zu '"));
68
    Serial.print(host);
69
    Serial.println(F("' beendet."));
70
  }
71
}
72
73
void setup()
74
{
75
  if (DEBUG)
76
  {
77
    Serial.begin(4800);
78
    delay(10);
79
80
    Serial.println("");
81
    Serial.print(F("Verbinde zu WLAN-Netzwerk '"));
82
    Serial.print(ssid);
83
    Serial.print("' ");
84
  }
85
  WiFi.begin(ssid, password);
86
87
  while (WiFi.status() != WL_CONNECTED) {
88
    Serial.print('.');
89
    delay(500);
90
  }
91
  Serial.println("");
92
93
  if (DEBUG) {
94
    Serial.println(F("[VERBUNDEN]"));
95
    Serial.print(F("IP Adresse: "));
96
    Serial.print(WiFi.localIP());
97
    Serial.println("");
98
  }
99
}
100
101
void loop() {
102
  
103
  if (Serial.available()) // Pruefen: Nutzereingabe
104
  {
105
    while (Serial.available())
106
    {
107
      // Auslesen der Nutzereingabe: "Email,Vorname,Nachname"
108
      Serial.readBytesUntil(',', email, 20); // Einlesen der Daten
109
      Serial.readBytesUntil(',', vorname, 20); // Einlesen der Daten
110
      Serial.readBytesUntil('\0', nachname, 20); // Einlesen der Daten
111
112
      // Ausgabe der Nutzereingabe auf Serial
113
      Serial.println("esp8266:");
114
      Serial.println(email);
115
      Serial.println(vorname);
116
      Serial.println(nachname);
117
      Serial.flush();
118
119
      // Daten an Server senden
120
      connectAndSendData();
121
      delay(500);
122
      memset(email, 0, sizeof(email));
123
      memset(vorname, 0, sizeof(vorname));
124
      memset(nachname, 0, sizeof(nachname));
125
      
126
    }
127
  }
128
}

Das Problem ist, dass der ESP8266 keine Verbindung zum Apache-Server 
aufbauen kann. Der Monitor bestätigt mir eine WLAN-Verbindung mit 
Ausgabe der IP. Wenn ich durch Dateneingabe eine Serververbindung 
veranlasse, scheitert dieser Verbindungsversuch ("[FEHLER]" im Monitor). 
Eine Verbindung zum "Google"-Server klappt.

In den Server-Logs ("acccess.log", "error.log") gibt es keine Hinweise 
auf einen Verbindungsversuch des ESP (Die Smartphone-Verbindungen werden 
natürlich angezeigt).
(XAMPP-Netstat-Einträge für die Ports
80: PID 5792, httpd.exe
443: PID 5792, httpd.exe)

Internetrecherche und das Lesen vergleichbare Beiträge hat mir leider 
nicht geholfen. Ich bin ratlos und freue mich wirklich sehr über 
hilfreiche Tipps!

von RP6conrad (Gast)


Lesenswert?

Du kansst auch gleich zugreifen auf MySQL mit den ESP (wen das ihres 
Ziel ist) : hier eines beispiel (download "Arduino sketch" unten auf 
diese page)
http://www.robotmc.be/joomla/index.php/artikels/19-wemos-d1-over-wifi-verbinden-met-mysql
Functioniert bei mir prima.

von Joachim S. (oyo)


Lesenswert?

Mal in's Blaue hinein geraten, weil ich keine Ahnung von Arduino-C++ 
habe, bislang aber auch noch niemand geantwortet hat:
Könnte der Fehler mglw. daran liegen, dass "host" eine IPAddress-Instanz 
ist, und im späteren client.print()-Aufruf nicht explizit nach String 
konvertiert wird?

Oliver V. schrieb:
> IPAddress host(192, 168, 178, 41);            // <- funktioniert nicht
>
> [...]
>
>   client.print(String("GET ") + url + " HTTP/1.1\r\n" +
>                "Host: " + host + "\r\n" +
>                "Connection: close\r\n\r\n");

Ich würde an Deiner Stelle einfach mal kurz probieren, ob es zufällig 
funktioniert, wenn Du
> const char* host = "192.168.178.41";
statt
> IPAddress host(192, 168, 178, 41);
schreibst.

von Oliver V. (japili)


Lesenswert?

Vielen Dank für die Beiträge!

RP6conrad schrieb:
> http://www.robotmc.be/joomla/index.php/artikels/19...

Ich werde versuchen, die Seiten zu lesen... (Sprachbarriere) und es ggf. 
ausprobieren.


Joachim S. schrieb:
>> const char* host = "192.168.178.41";

Die IP als String hatte ich auch versucht, hat aber nicht funktioniert 
mit dem gleichen Ergebnis.
Mein Problem beginnt auch schon vor der Übergabe der URL an den Server, 
es kommt keine Verbindung zustande.

Könnte das Problem mit Firewall-Einstellungen zusammenhängen?

von Jan L. (ranzcopter)


Lesenswert?

Oliver V. schrieb:
> Die IP als String hatte ich auch versucht, hat aber nicht funktioniert
> mit dem gleichen Ergebnis.
> Mein Problem beginnt auch schon vor der Übergabe der URL an den Server,
> es kommt keine Verbindung zustande.
>
> Könnte das Problem mit Firewall-Einstellungen zusammenhängen?

darauf würde ich wetten; OS war ja nicht angegeben, daher wäre alles 
weitere jetzt Spekulation...

von Stefan F. (Gast)


Lesenswert?

Ich sehe auf die Schnelle keinen Fehler in deinem Quelltext. Aber 
vielleicht hilft es, ein erprobtes Programm zum vergleich zu verwenden.

Probiere das mal aus: http://stefanfrings.de/esp8266/WifiMonitor.zip

Wenn das auch nicht geht, hast du vielleicht ein fehlerhaftes SDK 
(Arduino Plugin) oder es hängt an deinen Router/Firewall Einstellungen.

Kleine Anmerkung dazu: Nach dem Einschalten der Stromversorgung läuft 
der ESP 5 Minuten lang als AP. Verbinde deinen PC damit und rufe die 
Startseite auf (http://192.168.4.1/). Dann erscheitn ein Formular, wo du 
die Zugangsdaten zu deinem WLAN Netz eingibst, sowie den Hostnamen 
deines Apache Servers.

Danach sollte die LED an GPIO 0 (grün) an gehen.

von Oliver V. (japili)


Lesenswert?

Jan L. schrieb:
> OS war ja nicht angegeben

Ok, vergessen: Windows 10, PC-Schutz durch "Symantec Endpoint 
Protection"
Ich habe dort im Traffic Monitor erlaubte und abgelehnte Zugriffe 
angeschaut: Die Anzahl abgelehnter Zugriffe für httpd.exe (Port 80) ist 
trotz zahlreicher Zugriffsversuche durch den ESP Null, die Anzahl der 
erlaubten erhöht sich bei jedem Zugriff über das Smartphone (und bleibt 
erwartungsgemäß unverändert bei dem Versuch durch den ESP).
Für mich sieht es also so aus, dass der ESP vorher "hängen bleibt".
Bei den Einstellungen vom Server (Apache, XAMPP) habe ich nicht 
Einschlägiges gefunden.

Ich werde als nächstes versuchen, den Tipp von stefanus (Danke) zu 
befolgen, für weitere Tipps bin ich weiterhin sehr dankbar!

von Oliver V. (japili)


Lesenswert?

Stefan U. schrieb:
> Aber vielleicht hilft es, ein erprobtes Programm zum vergleich zu verwenden.
>
> Probiere das mal aus (...)

Ergebnis:
Solange der ESP in dem USB-Programmer (vgl. 
https://www.xgadget.de/anleitung/esp-01-esp8266-mit-adapter-programmieren-so-gehts/) 
am PC steckt, wird der AP "WiFi Monitor" bereitgestellt, ich erreiche 
die Eingabemaske durch Wahl der o.g. IP (natürlich ohne die für die 
Funktion notwendige LED-Beschaltung).
An einer externen 3.3V-Quelle mit der LED-Verdrahtung startet der AP 
nicht (ESP-Board-LED leuchtet).

Ich habe meinen zitierten Sketch auf einen bis dahin originalverpackten 
ESP geladen. Dieser wählt sich aber nicht mal ins WLAN, was der erste 
noch kann?!?

Noch was: Wenn ich den programmierten ESP erneut mit Programmer in den 
USB stecke, startet das Programm nicht, sondern erst nach erneutem 
Hochladen. Ich habe das bisher auf den zusätzlichen Widerstand im 
Programmer geschoben, den ich aber zwingend (wie auf der o.g. Webseite 
beschrieben) zum Programmieren benötige.

Stefan U. schrieb:
> Wenn das auch nicht geht, hast du vielleicht ein fehlerhaftes SDK
> (Arduino Plugin)

Kann hier die Ursache für meine Probleme liegen??? Wenn ja, steht eine 
Neuinstallation an?

von Stefan F. (Gast)


Lesenswert?

> An einer externen 3.3V-Quelle mit der LED-Verdrahtung startet der
> AP nicht (ESP-Board-LED leuchtet).

Es handelt sich also um ein ESP-01 Modul. Schön dass wir das nach 2 
Tagen auch mal erfahren dürfen.

Offensichtlich ist also deine Stromversorgung nicht in Ordnung. Hast du 
bedacht, dass der ESP Chip kurzzeitig bis zu 500mA aufnimmt? Die kann 
dieser Programmieradapter bekannterweise nicht liefern. Das wurde hier 
bereits öfters von anderen moniert. Er reicht gerade eben aus, um die 
Firmware hochzuladen. Für den Betrieb brauchst du aber eine stärkere 
Stromquelle.

> Wenn ich den programmierten ESP erneut mit Programmer in den
> USB stecke, startet das Programm nicht, sondern erst nach erneutem
> Hochladen.

Vermutlich, weil beim Einstellen der TxD Eingang des ESP Chips nocht 
nicht auf High Pegel liegt. Dann startet er nicht. Oder eben weil er 
nicht genug Strom liefert.

Lies die Tips auf meiner Homepage, vor allem diese Absätze:
http://stefanfrings.de/esp8266/index.html#esp01
http://stefanfrings.de/esp8266/index.html#stability
http://stefanfrings.de/esp8266/index.html#fwupdate

von Stefan F. (Gast)


Lesenswert?

>> Wenn das auch nicht geht, hast du vielleicht ein fehlerhaftes SDK
>> (Arduino Plugin)

> Kann hier die Ursache für meine Probleme liegen???

Ich sage mal so: Man kann zu 99,9% davon ausgehen, dass Software dieser 
Größe Fehler enthält.

Andererseits testen die Arduino Leute ihre Sachen gründlich, so dass 
derart gravierende Fehler eigentlich nicht vorkommen sollten.

Bevor Du die bereits getestete Software in Frage stellst, solltest du 
lieber deine Stromversorgung prüfen. Chinesische Produkte schlampen sehr 
häufig bei der Stromversorgung. Gerade dein Produkt ist dafür bekannt.

Hast du eventuell noch Kabel dazwischen? Dann könnten diese auch Schuld 
sein. Billige USB Kabel sind oft sehr dünn, so dass an ihnen zu viel 
Spannung abfällt. Beim Smartphone äußert sich das in einer längeren 
Ladezeit. Beim ESP bewirkt es Fehlfunktionen. Mit einem Oszilloskop kann 
man so etwas überprüfen.

Wer so ein gerät nicht hat, sollte damit anfangen, eine solide 
Stromversorgung bereit zu stellen. Denn das ist beim ESP8266 nach wie 
vor die Fehlerursache Nummer 1.

von Oliver S. (phetty)


Lesenswert?

Wieso baust Du nicht auf vorhandene Projekte auf wie espeasy oder 
tasmota auf und übermittelst die Daten per mqtt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.