Guten Tag Forumsgemeinde,
mich plagt seit langer Zeit ein großes Problem. Ich habe einen ESP8266
der mit UDP läuft. Der ESP funktioniert, ich kann via HTerm Kommandos
per Uart senden, dieser schickt die Nachrichten raus und empfängt auch
welche. Getestet mit dem PacketSender. Alles super.
Jetzt aber das Problem. ich möchte in meinem eigenen PC Programm in VB
geschrieben gerne auch etwas empfangen können - das senden klappt auch
hier problemlos.
Beim Empfangen geht nichts, ich bin ratlos. Die Funktionen laufen
erstmal so durch aber ich bekomme nur leere Antworten. Hier die
Funktionen:
Gusi schrieb:> Was könnte das Problem sein?
Wie so oft: du. Genauer gesagt, deine Faulheit, die dich davon
abgehalten hat, die Beschreibung der verwendeten Klasse und deren
Methoden zu lesen, bevor du sie benutzt.
Konkret:
1) Du verpasst der Receive-Methode einen falschen Parameter. Das ist ein
"byref" Parameter, der dazu dient, etwas zurück zu geben. Und das, was
da zurück gegeben wird, müsste sinngemäß im Stil deiner Nomenklatur
"sendingPoint" heissen. Vielleicht wird dir mit dieser Information klar,
warum es totaler Schwachsinn ist, hier "receivingPoint" zu
referenzieren...
2) Du setzt einen Timeout, dir ist aber scheinbar nicht klar, dass das
bedeutet, dass die blockierende Funktion immer nach Ablauf des Timeout
zurückkehren wird und zwar auch dann, wenn sie nix empfangen hat. Dann
halt ohne, sprich: mit leerem Ergebnis.
3) Das Gehampele mit einer blockierenden Funktion in einem zusätzlichen
Thread kannst du dir sparen. Der UDPClient unterstützt nämlich von Hause
aus asynchrone Zugriffsmethoden. Da macht das System das Gehampele mit
den zusätzlichen Threads. Sehr viel effizienter als du das kannst...
c-hater schrieb:> Gusi schrieb:>>> Was könnte das Problem sein?>> Wie so oft: du. Genauer gesagt, deine Faulheit, die dich davon> abgehalten hat, die Beschreibung der verwendeten Klasse und deren> Methoden zu lesen, bevor du sie benutzt.
Ich bin kein Experte und komme einfach nicht mehr weiter. Ich habe viel
gelesen, im Netz und auch in den Klassen. Ich weiß es einfach nicht mehr
an diesem Punkt, sonst würde ich nicht fragen. Ich sitze da bereits 2
Monate dran.
>> Konkret:>> 1) Du verpasst der Receive-Methode einen falschen Parameter. Das ist ein> "byref" Parameter, der dazu dient, etwas zurück zu geben. Und das, was> da zurück gegeben wird, müsste sinngemäß im Stil deiner Nomenklatur> "sendingPoint" heissen. Vielleicht wird dir mit dieser Information klar,> warum es totaler Schwachsinn ist, hier "receivingPoint" zu> referenzieren...
Verstehe ich leider nicht. receivingPoint ist ja nur der IP Endpunkt,
von dem ich Daten erwarte. Wie muss das denn aussehen? Beispiele wären
hilfreich.
> 2) Du setzt einen Timeout, dir ist aber scheinbar nicht klar, dass das> bedeutet, dass die blockierende Funktion immer nach Ablauf des Timeout> zurückkehren wird und zwar auch dann, wenn sie nix empfangen hat. Dann> halt ohne, sprich: mit leerem Ergebnis.
Korrekt. Den habe ich gesetzt, weil er die Funktion nie beendet hat.
Auch wenn ich daten Sende. Nach einem Timeout ist schon klar das das
Ergebnis leer ist, wenn nichts empfangen wurde, aber ich sende ja alle
100ms etwas mit 10 bytes. Es ist immer leer, resp. ohne Timeout kommt er
nie aus der Funktion
> 3) Das Gehampele mit einer blockierenden Funktion in einem zusätzlichen> Thread kannst du dir sparen. Der UDPClient unterstützt nämlich von Hause> aus asynchrone Zugriffsmethoden. Da macht das System das Gehampele mit> den zusätzlichen Threads. Sehr viel effizienter als du das kannst...
Okay und die wären? BeginRecieve und EndReceive? Das hatte ich getestet,
bekomme da nichts, kann aber auch sein das ich die falsch implementiert
habe. So oder so müsste ich aber doch was empfangen.
Wie geht es denn richtig?
Hallo,
sendet der ESP nur an die Adresse deines Rechners oder als Broadcast?
kommen die Pakete auf deinem Rechner an? Mit Wireshark prüfen.
welche Windowsversion?
die Windows Firewall blockt i.d.R. alle nicht zuordenbaren Eingehenden
Pakete, wenn du nicht zufällig vorher was von dem selben Port gesendet
hast kommt nix rein. Dann musst du das Programm in der Firewall
freigeben, manchmal fragt Windows auch beim ersten Start selbst danach.
Sascha
Der Grund warum das bei dir nicht funktioniert ist wahrscheinlich
folgender. Dein VB Socket Programm erstellt automatisch 2 Ports.
Einmal den remotePort und einen zufällig localPort
"Dynamically Allocated Ports (49.152 - 65.535)"
Jetzt sendest du an deinen remotePort deine Daten und dein remoteDevice
sendet Daten an dich zurück auf dem localPort den du aber nicht
abgefragt hast. Darum empfängst du auch nichts da du wahrscheinlich den
remotePort ansiehst.
Peter Z. schrieb:> Der Grund warum das bei dir nicht funktioniert ist wahrscheinlich> folgender. Dein VB Socket Programm erstellt automatisch 2 Ports.> Einmal den remotePort und einen zufällig localPort> "Dynamically Allocated Ports (49.152 - 65.535)"
Nein, sicher nicht. Das gezeigte Programm erstellt genau einen Socket
und bindet den an alle vorhandenen Interfaces. Außerdem erlaubt es den
Empfang von Broadcasts. Soweit ist das komplett richtig. Der Receiver
kann also Unicast- und Broadcast-Pakete aus allen angeschlossenen Netzen
empfangen, sofern sie an den UDP-Port "port" gerichtet sind, und
entweder eine korrekte Zieladresse haben oder eben eine
Broadcast-Adresse.
Peter Z. schrieb:> Naja, ich vermute mal das er nicht nur den Receiver Teil in seinem VB> Programm hat, sonder auch den TX Teil.
Dem Thread-Titel nach ist davon auszugehen das ein ESP8266 sendet.
Sascha
Peter Z. schrieb:> Naja, ich vermute mal das er nicht nur den Receiver Teil in seinem> VB> Programm hat, sonder auch den TX Teil.>> Wie auch immer bei mir funktioniert das Gehampel mit einem RX Thread> sehr gut.>> Hier noch ein Beispiel an dem man sich orientieren kann:> Seite 296, 297>> https://books.google.de/books?id=qWzgaTw2s3AC&pg=PA294&lpg=PA294&dq=localEP+udp+vb&source=bl&ots=QLWwFYyci0&sig=ACfU3U2pLE0btFkJuzenD365b-BTIPEkFA&hl=de&sa=X&ved=2ahUKEwiXj_7jr9HmAhVRPFAKHQy2CAMQ6AEwAnoECAoQBA#v=onepage&q=localEP%20udp%20vb&f=false>> Vielleicht hat ja c-hater auch noch ein Codebeipiel für eine Async> Lösung des Problems ala...>> Sub receive(ar As IAsyncResult)> Dim res() As Byte = UdpListener.EndReceive(ar, ep)> If ar.IsCompleted Then> UdpListener.BeginReceive(CallBack, "")> End If> End Sub>> usw...>> Aber egal "Gusi" scheint eh die Schnauze voll zu haben.
Hallo Peter,
könntest du mir deinen vollständigen RX-Teil bitte hier reinstellen? Das
wäre sehr hilfreich. Einen TX Teil habe ich, dort wird der Port
geöffnet, die Daten gesendet und der Port wieder geschlossen. Das klappt
sehr gut. Wie gesagt, mit dem Packet-Sender (PC Programm) sehe ich auch,
dass der ESP sendet. Klappt alles. Nur ich bekomme nichts.
Mein RX Teil besteht aus Seite 296 des Links,
angepasst an meine Bedürfnisse.
Damit solltest du eigentlich weiter kommen.
Was du noch machen kannst ist mit dem "Device Monitoring Studio"
die Pakete checken. Das würde ich dir sehr empfehlen.
Und den Log hier mal posten...
Du kannst dich auch hier anmelden und dein VB Projekt posten,
dann kann man es sich ja mal anschauen.
Peter Z. schrieb:> Mein RX Teil besteht aus Seite 296 des Links,> angepasst an meine Bedürfnisse.>> Damit solltest du eigentlich weiter kommen.>> Was du noch machen kannst ist mit dem "Device Monitoring Studio"> die Pakete checken. Das würde ich dir sehr empfehlen.> Und den Log hier mal posten...>> Du kannst dich auch hier anmelden und dein VB Projekt posten,> dann kann man es sich ja mal anschauen.
Hallo Peter und frohes neues Jahr!
Ich habe oben in der Classe wie folgt hinzugefügt:
Wenn ich jetzt vom ESP sende, empfange ich leider nichts. Er geht
nichtmal in die IF rein, wo "OK" kommen sollte. Der ESP sendet auf Port
21105, habe ich doch richtig gemacht, oder? Mit der Port angabe? Oder
muss ich dort meinen Port eintragen, sprich an den Port wo der ESP
hinsenden soll?
Ich habe nochmal einen Test gemacht.
VB Programm, ESP und PacketSender Programm.
Sende ich vom PacketSender was an den Port 21105 zum ESP, empfange ich
die Daten, der ESP sendet was zurück, wird empfangen. Okay.
Dann sende ich mal vom PacketSender was an den Port 1100 (den habe ich
mal bei dem Receiver eingetragen in meinem VB Programm). Empfange nichts
:(
Die Empfangsroutine sieht ok aus.
Wie wird dein ESP32 angesteuert?
Über Arduino? AT Befehle? ESP-IDF?
Wie sieht der Code dazu aus?
Empfängt dein VB Programm etwas wenn du mit dem packetsender etwas
sendest ohne ESP
Peter Z. schrieb:> Die Empfangsroutine sieht ok aus.> Wie wird dein ESP32 angesteuert?> Über Arduino? AT Befehle? ESP-IDF?> Wie sieht der Code dazu aus?>> Empfängt dein VB Programm etwas wenn du mit dem packetsender etwas> sendest ohne ESP
Nein, das ist es ja. Ich habe jetzt mal was anderes gemacht, damit geht
es jetzt komischerweise, und zwar wie foglt:
Dann habe ich die ReceiveUDP in einen Timer gepackt, der jede Sekunde
einmal pollt. Das finde ich aber nicht optimal. Mache ich das wieder mit
einem Thread (siehe auskommentierte Sachen), dann empfange ich wieder
nichts, verrückt irgendwie.
Leider zu früh gefreut. Ich kann zwar damit was empfangen wenn ich von
meinen PC an meinen PC sende (also über den PacketSender an meine locale
Ip mit dem Port 2000 wie angegeben) empfange ich Daten. Kein Problem.
Kommen die Daten von einem anderen Gerät, empfange ich wieder nichts.
Ich werde noch verrückt, was ist das?
Darum sagte ich ja installiere das Device Monitoring Studio und schau
dir die Datenpakete an was zum Device und vom Device gesendet wird, dann
bist vielleicht schlauer.
Gusi schrieb:> Ich habe nochmal einen Test gemacht.>> VB Programm, ESP und PacketSender Programm.>> Sende ich vom PacketSender was an den Port 21105 zum ESP, empfange ich> die Daten,
am ESP??
> der ESP sendet was zurück, wird empfangen. Okay.
deutet auf ein Problem mit der Win-Firewall hin - meine Fragen vom
25.12. hast du ja nicht beantwortet.
Sascha
Sascha W. schrieb:> Gusi schrieb:>> Ich habe nochmal einen Test gemacht.>>>> VB Programm, ESP und PacketSender Programm.>>>> Sende ich vom PacketSender was an den Port 21105 zum ESP, empfange ich>> die Daten,> am ESP??>> der ESP sendet was zurück, wird empfangen. Okay.> deutet auf ein Problem mit der Win-Firewall hin - meine Fragen vom> 25.12. hast du ja nicht beantwortet.>> Sascha
Ich war ein paar Tage weg, geht immer noch nicht. Ich empfange ja Daten.
Mit dem PacketSender Programm kann ich Daten an den ESP senden und
empfangen. Geht. Es liegt an meiner PC Software VB. Senden von dort geht
ebenso, aber ich bekomme nichts. Nichts von außerhalb des PCs. Komisch
ist, wenn ich mit dem PaketSender vom PC an mich selber sende, empfängt
das Programm was. Komisch oder?
Okay mir kam gerade die Erleuchtung. Wenn ich sende, dann schließe ich
danach den Port. Sprich der ESP sendet dann aber ins leere. Jetzt habe
ich es so gemacht, dass ich im VB Programm den gleichen Client für
Senden und Empfangen nutze, und siehe da, es geht mit der Variante wie
ich die hatte. Polle per Timer jetzt die Funktion und erhalte meine
Werte. Danke nochmals.
Zum Empfangen brauchst du einen Socket der an dein gewünschtes Port
gebunden ist. Dieses kannst du auch zum Senden nehmen, aber du kannst
auch jedes mal ein neues Socket öffnen.
Sascha