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
constchar*ssid="Wifiname";
6
constchar*password="Wifipasswort";
7
//const char* host = "google.de"; // <- funktioniert mit esp8266!
IPAddresshost(192,168,178,41);// <- funktioniert nicht mit esp8266, mit Smartphone schon!
10
constinthttpPort=80;// Apache-Server auf Laptop: Port 80, 443, wie gesagt: php-Skript mit Smartphone erreichbar!
11
12
charemail[20];
13
charvorname[20];
14
charnachname[20];
15
16
voidconnectAndSendData()
17
{
18
if(DEBUG){
19
Serial.println("");
20
Serial.print(F("Verbinde zu '"));
21
Serial.println(host);
22
}
23
24
WiFiClientclient;
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
Stringurl="/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
unsignedlongtimeout=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
Stringline=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
voidsetup()
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
voidloop(){
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!
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.
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?
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...
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.
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!
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?
> 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#esp01http://stefanfrings.de/esp8266/index.html#stabilityhttp://stefanfrings.de/esp8266/index.html#fwupdate
>> 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.