Hi Leute,
also erstmal so grob die Situation:
Hab mehrere ESP8266 im Einsatz. Die sollen über 'ESPAsyncWebServer.h' Daten / Befehle empfangen können.
Im ESP8266 ist folgendes:
Das funktioniert mit Firefox, Chrome, einem anderem ESP8266 und einem C# Sender ziemlich gut, allerdings bleibt der Apache/PHP8 leider irgendwie hängen.
Die Anfrage geht durch, der ESP tut das, was da drin steht, aber die Antwort passt nicht.
Die Antwort ist aber in dem Fall vollkommen egal - trotzdem bleibt der Apache/php in 'Warte auf Antwort' und blockiert damit alles andere. Obwohl der ESP das gewünschte tat.
Der Workarround bei php:
bei gleichzeitigen Abfragen summiert sich das jedoch und fühlt sich träge an, da die darauffolgende abfrage erst nach dem ablaufen des 1 sek Timers abgesendet wird.
Die http-Querkommunikation mit Shelly <=> C#, C# <=> ESP, ESP <=> Shelly, C# <=> PHP, Shelly <=> PHP funktioniert einwandfrei. Wo es hackt ist nur das: ESP <=> PHP.
Hat von euch schonmal jemand damit Probleme oder erfahrungen machen können?
zum Analysieren wirst da einen kurzen (aber vollständigen) Sketch für den ESP benötigen und ein entsprechendes PHP Script . Dann können sich das andere eventuell auch ansehen.
Nur eine Zeile vom ESP und einem Zeile PHP - da werden sich auch die Spezialisten schwer tun nachzuvollziehen, was in deinen Systemen falsch läuft.
Hi @noiasca ,
das ganze hochladen ist ein wenig schwierig, da sich mehrere Dateien im kompletten sketch befinden. Hier mal die wichtigsten, zum Thema passenden Zeilen: helperWebServer.h
namespace request\system;
use system\std;
use Exception;
d1Mini::$ip = std::posts('ip');
class d1Mini {
public static $ip;
const c_setDebugWiFi = 'setDebugWiFi';
public static function setDebugWiFi() {
try {
$cmd = 'cmd=changeDebugWiFi';
file_get_contents('http://' . d1Mini ::$ip . '/setCmd?' . $cmd, 0, self::getContext());
} catch(Exception $e) {
// Fail silently
}
}
private static function getContext() {
return stream_context_create([
"http" => [
"method"=>"GET",
"timeout" => 1
]
]);
}
}
switch(std::gets('param1')) {
//###################################################################################
case d1Mini ::c_setDebugWiFi :
d1Mini ::setDebugWiFi();
break;
}
'file_get_contents' läuft hier ins leere / timeout. Bei std Einstellungen 30 sec, deshalb der workarround mit dem 'getContext()'. Der ESP fürhrt die Aktion auch aus...
Da streickt nur die Verbindung Apache <=> ESP
und du meintest doch,
Ich kann also die ESP's per http performant kommandieren, wenn ich den Umweg:
Apache <=> C# <=> ESP nehme, nicht aber den direkten weg: Apache <=> ESP. Das kommando geht zwar durch, aber der Apache wartet danach dann noch 30 sek. bis das timeout greift ohne eine antwort auswerten können.
Irgendwie habe ich bisher nicht verstanden, was Du eigentlich machen willst.
ESP als HTTP-Client greift auf Apache Webserver zu? Funktioniert problemlos, ebenso auf PHP auf Apache.
soll der auf commands reagieren. das tut der auch. allerdings läuft der apache dann beim warten auf eine antwort in ein timeout.
http://[ip]/[cmd]
mein workarround daraufhin war, dass ich einen c# server aufsetzte, der auf die anfrage:
http://[c#server]/set?ip=[ip]&cmd=[cmd]
reagiert, das dann weiter schickt:
http://[ip]/[cmd]
die antwort wird vom C# server entgegen genommen und weiter geleitet.
das ist aber für den zweck umständlich, da an zwei stellen programmcode geschrieben werden muss und zwei diesnte laufen müssen.
sodenn versuchte ich es wieder mit der direktverbindung von apache/php zu ESP.
Der Apache / webseite bleibt aber bis zum Timeout hängen.
da mir die antwort auf den cmd egal ist, reduzierte ich mit dem context die zeit des timeouts auf 1 sek.
bei 20 Lichtern, 'alles aus' sind das jedoch auch noch 20 Sekunden wartezeit, was sich extrem träge anfühlt.
Nö, ich möchte nur per http einen einfachen befehl übermitteln.
der ESP tut daraufhin was.
eigentlich fertig, aber das PHP Script wartet auf Antwort und bleibt hängen.
die antwort ist:
In 50% der Fälle finde ich dann selber meinen Fehler wenn ich mich auf das eigentliche Problem konzentrieren kann.
Wenn nicht, poste ich Dinge die "jeder" hier einfach ausprobieren kann.
So bin ich hier die letzten Jahre gut gefahren und 8 Tage hat kaum eine Lösung gedauert.