Hallo zusammen,
ich möchte einen ESP32 und ein Raspberry Pi miteinander per TCP kommunizieren lassen. Der Raspberry soll dem ESP dann später eine Erlaubnis für eine bestimmte Aktion geben und dafür ist Node-Red auf dem Raspberry installiert.
Seit mehreren Wochen versuche ich nun ein einfaches Beispiel zum laufen zu bringen doch scheitere kläglich daran. Die Wlan verbindung funktioniert problemlos aber ich schaffe es nicht etwas per TCP zu senden. Jetzt habe ich mir hier einen Account gemacht und vielleicht findet ja jemand von euch meinen Fehler. Hier der Beispielcode (ohne meine Wlan-Daten):
Das Gesamtsystem besteht aus ESP32 und nodered.
Das bedeutet es könnte auch am nodered liegen.
Dazu wäre nützlich zu wissen ob denn das nodered auf eine möglichst einfach Art und Weise getestet wurde ob den nodered selbst TCP-Daten empfangen kann.
Und es wäre nützlich den seriellen Output den du bekommst hier als code-section zu posten
Hallo ,
Grundsätzlich kann Dein Problem ja auch auf der Pi Seite sein.
Ich nehme jetzt mal an das der ESP der client sein soll. Das bedeutet er baut eine Verbindung zu einem Server auf , wenn die Verbindung steht sendet er die Daten, und das war es dann, es erfolgt keine warten auf eine Antwort (Response) . Wenn das jedoch sein soll müsste das noch dahinter mit einem "Timeout" für den Fall das nichts kommt. siehe Beispiel zum ESP32. in der IDE
Wenn der ESP der Server sein soll fehlt da so einiges.
Lade dir zum Testen das Program "Paketsender" runter, dann hast Du nur eine Baustelle. Damit kannst Du einen Server oder Client simulieren.
Wenn es ein Client sein soll dann kannst Du das Beispiel aus meiner Bastelkiste versuchen. Das ist für einen ESP8266 , ich denke aber das betrifft nur den Namen der Lib.
Hallo und vielen Dank für die Ratschläge.
Ich bin bereits kräftig am testen und möchte euch einmal Antworten so gut es geht:
Im Nodered Lauscht das TCP-Node am Port 8088. Im Seriellen Monitor wird Connect Wlan .....connection failed connection failed connection failed ausgegeben. Deshalb meine Vermutung, dass das Wlan zwar ok ist aber die TCP Verbindung nicht. Was gibt es für Möglichkeiten, das Nodered zu testen? Für mein Verständnis ist die ESP-Nodered Verbringung schon sehr einfach (oder eben auch nicht).
In meinem Beispiel soll der ESP der Client sein richtig. Gestern habe ich es mal andersrum probiert mit dem ESP als Host und das hat sogar funktioniert. Doch ich möchte den ESP aus dem Beispiel eben als Client nutzen.
Weiter bin ich leider noch nicht gekommen. Das Programm Paketsender konnte ich mir noch nicht ansehen, das werde ich als nächstes versuchen.
Schreib/such Dir ein einfaches bash/Python/php Script, welches auf Port 8088 lauscht und alles ausgibt, was dort ankommt.
Wenn dort nichts ankommt liegt es wahrscheinlich am ESP, ansonsten vermutlich an NodeRed.
a) würde ich am Raspi einfach mal einen webserver installieren und den esp32 was abholen lassen.
ganz primitiv mit dem Beispiel Wifi / WifiClient.
Klappt das?
wenn ja - dann das ganze html weglassen und nur mehr tcp payload schicken - sollte ja auch noch funktionieren.
b) du bist zwar noch gar nicht so weit, aber dein Code ist auch nicht wirklich schön:
im else druckst zwar im erfolgsfall noch was auf die Serielle aber sonst nichts mehr.
Das arme client.print steht da ganz allein im loop. was soll das im loop machen. da fehlen noch ein paar klammern oder?
Hallo,
ich hab mir Deinen Sketch noch mal angesehen und mal mit dem Paketsender getestet. Lief auch nicht auf Anhieb.
ich habe Ihn etwas umgebaut, es macht ja auch Sinn die Verbindung wieder zu schließen. Ich hab Dann noch die Klammern für if.. else etwas geändert , dann lief es .
Hallo zusammen,
es ist sehr interessant geworden.
Deinen Code habe ich ausprobiert und der hat bei mir zunächst nicht funktioniert. Also habe ich im Nodered fehler gesucht. Als das nichts gebracht hat, habe ich die Nodered TCP beispiele einmal durchprobiert. Die laufen auf verschiedenen Ports und den ESP habe ich dementsprechend angepasst. Beim beispiel auf Port 1883 meldet mein ESP auf einmal "connecton succesfull". Ich freue mich zuerst sehr, merke dann aber, dass im Nodered nichts ankommt. Zuletzt habe ich herausgefunden, dass sich mein ESP mit einem älteren MQTT Projekt auf Port 1883 verbunden hat. Die Verbindung zum Raspberry funktioniert aber nach wie vor nicht.
Ich gehe also davon aus, dass bei meinem ESP alles in ordnung ist. Doch wo kann dann der fehler liegen? Offensichtlich beim Raspberry / Nodered, aber wie mache ich von hier weiter?
Herzlichen dank an alle, die mir bis hierhin weitergeholfen haben, ihr seid spitze.
Ui ! Das ist ja ein Ding. Das würde entweder bedeuten, dein ESP32-Code sucht nicht nur speziell nach dem einen Rechner auf dem dein nodered läuft sondern alles mögliche und verbindest sich dann mit dem nächstbesten.
Oder du hast auf diesem einen Raspi auch noch das MQTT am laufen.
Grundstrategie wenn es nicht läuft: Komplexität des Systems so weit wie möglich reduzieren.
Soll heißen nur der eine ESP32 der TCP-Nachrichten sendet und ein Raspi auf dem nur das nodered läuft und sonst nichts.
Wenn das nicht funkioniert das System noch weiter reduzieren.
Ich habe jetzt nicht mehr im Kopf warum es unbedingt nodered braucht.
Als ich mit UDP-Nachrichten senden angefangen habe, habe ich einfach nach einem Python-Demo-Script gesucht und bin da auch sehr schnell fündig geworden.
Das habe ich jetzt mal für TCP-IP gemacht
erste Fundstelle
Damit mal testen ob überhaupt eine TCP-IP-Verbindung zwischen ESP32 und Raspi funktioniert.
Tja und wenn dein ESP32 sich erst mal mit einem alten MQTT-projekt verbunden hat und du das nicht sofort gesehen hast vermute ich mal, dass du wenig bis keine Detailinformationen hast ausgeben lassen was denn auf dem ESP32 passiert.
Das soll heißen:
Auf dem seriellen Monitor ausgeben
IP-Adresse des ESP32
IP-Adresse und Port an den der ESP32 seine TCP-IP-Nachrichten sendet.
wenn die Send-function einen Wert zurückgibt den Wert auch ausgeben lassen
Wenn es per TCP-IP nicht funktioniert noch einen Schritt zurückgehen
und testen ob du vom ESP32 aus den Raspi anpingen kannst
ebenso umgekehrt kann dein Raspi den ESP32 anpingen?
Wenn das schon nicht geht braucht man "weiter oben" nicht zu suchen.
vgs
Muss ja wohl, ansonsten hätte der T0 ein Wenig Durcheinander mit seinen IP Adressen, zumindest gäbe es welche doppelt. Ich weiß auch nicht warum der T0 sich das antut und nicht schon längst den bereits mehrfach erwähnten "Paketsender" oder was Ähnliches installiert hat.
Heinz
Hallo und vielen Dank für eure vielen Nachrichten. Ich werde etwas Zeit benötigen, um das alles aufzuarbeiten und ja, das letzte MQTT-Projekt läuft auf dem selben Raspberry. Nach meinem Verständnis dürfte das kein Problem sein aber bitte korrigiert mich, falls ich mir irre.
Die Paketsender Software habe ich inzwischen heruntergeladen, doch ich komme damit noch nicht zurecht. Das Thema ist noch sehr neu für mich bzw es ist mein erstes Projekt zum Thema TCP. Ich werde also etwas brauchen, bis ich eure ganzen Vorschläge getestet habe.
Wirklich wissen tue ich das nicht ob das ein Problem ist. Aber dein Arduino hat sich schon mal mit dem MQTT verbunden. Was er ja nicht soll.
Wirklich wissen ob es ein Problem ist oder nicht tust du dann wenn du entweder ganz viel darüber gelesen hast oder durch das Auschlussverfahren herausgefunden hast.
Ganz allgemein nützliche Strategie: Wenn etwas nicht funktioniert mögliche Fehlerquellen herausnehmen in dem man die Anzahl der Systemkomponenten so weit wie möglich reduziert.
Von deinem "Glauben" es dürfte nicht stören wird sich dein Raspi nicht zum gleichen "Glauben" bekehren lassen. Dazu hat er einfach zu wenig KI
hast du eine weitere SD-Karte auf die du das Raspi Betriebssystem draufklonen kannst?
Dann kannst mit der zweiten SD-Karte mal alles runterschmeissen was nicht gebraucht wird für die TCP-IP-Tests. Wenn irgendwas nicht mehr funktioert.
Raspi herunterfahren. SD-Karte tauschen einschalten alter Zustand läuft wieder.
Die Packet Sender Software habe ich nun zum laufen gebracht. Dort läuft ein TCP Server und ich kann ohne Probleme Nachrichten vom ESP zum Packet Sender schicken. Ich würde nun gern eine Antwort empfangen, hatte aber noch nicht Zeit um viel zu testen. Das werde ich demnächst nachholen. Meine Loop sieht derzeit so aus:
void loop() {
WiFiClient client;
if (!client.connect(host, 54164)) {
Serial.println("connection failed");
}
else {
Serial.println("connection succesfull");
client.print("helloworld");
while (client.available())
{
char c = client.read();
Serial.print(c);
}
}
client.stop();
delay(5000);
}
Ich habe auch Nachrichten zum Nodered gesendet (hier Nodered als Server). Ich bekomme auch eine leere Rückmeldung vom Nodered an Packet Sender, doch leider kann ich weder im Nodered noch im Packet Sender eine Nachricht lesen. Im Packet Sender kommen Nachrichten ohne Inhalt zurück (also ohne ASCII und Hex) und im Nodered sehe ich gar nicht, dass irgendetwas passiert. Im Nodered nutze ich noch das TCP Beispiel mit Debug Node, ich würde also erwarten zumindest irgendetwas zu sehen.
Euren Ratschlag, das MQTT vom Raspberry runter zu werfen, habe ich befolgt. Leider bringt das keine Verbesserung.
Natürlich bleibe ich dran, doch entschuldigt bitte wenn es bei mir etwas länger dauert. Ich muss zu dem Thema noch viel verstehen und ausprobieren.
Wenn der nodered so viel Schwierigkeiten macht.
Was willste denn insgesamt machen? Kannst du das mal beschreiben?
Vielleicht ist für deinen Endzweck nodered überkandidelt.
Wenn es dann doch nodered sein muss. Es muss doch funktionierende Beispiele geben
Und wenn die schon nicht funktionieren muss man doch erst einmal herausfinden woran das liegt.
Dann ist alle Testen "weiter hinten" sinnlos.
vgs
Hallo,
Wenn der Server nicht schnell genug antwortet , kann es passieren das du nicht in die while Schleife kommst und die Verbindung beendet wird ohne das Du eine Antwort erkannt hast.
wenn Du vor die while schleife zwei Zeile einfügst kannst Du das verhindern.
Nachteil es kann dir passieren das Du 100 ms in der schleife hängen bleibst wenn der Server keine Antwort sendet. Da ist mir allerdings bisher auch noch nichts Gescheiteres zu eingefallen, ich hab aber auch noch nicht richtig drüber nachgedacht , bei mir läuft das so. Man müsste was mit if ... machen damit das nicht blockiert. Eventuell hat hier ja einer noch einen bessere Lösung.
Das Beispiel WiFiClentBasic löst das so.
//read back one line from server
Serial.println("receiving from remote server");
String line = client.readStringUntil('\r');
Serial.println(line);
Kurze Frage dazu:
Warum brauche ich da ein while()? Wäre es nicht angebrachter hinten das delay(5000) zu entfernen und ganz geschmeidig bei jedem Durchlauf zu schaun, was geht?
Hallo
Na ja , das delay gehört da schon weg . Eigentlich sollte der ganze Kram in eine function die dann auf die übliche Art z.B mit millis () einmalig aufgerufen wird. Siehe #5
Irgend wann muß dann ja mit client.stop die Verbindung beendet werden , allerdings ja erst nachdem die Antwort eingelesen worden ist.
Ja das ist noch nicht zu Ende gedacht. Senden und Empfangen getrennt bearbeiten dabei konnte die Zuordnung dann ein Problem werden.