ESP01S: TCP Server und UDP Multicast

OP #7488908
Lesenswert?

Hallo,

ich habe mehrere ESP01S im Einsatz und möchte eine Erweiterung einführen, bin aber nicht sicher ob das funktioniert.

Bisher betreibe ich die WiFi Module einfach via TCP Server(CIPSERVER). Das alles via AT+ Kommandos mit kleinen MSP430. Klappt soweit einwandfrei.

Mittlerweile habe ich im lokalen Netzwerk mehrere Geräte die sich mittels Multicast miteinander unterhalten. Es wäre schön, wenn ich mit den ESP01S einige dieser Datensätze mit verwenden könnte.

Bin quasi Neuling mit dem ESP01S und habe jetzt folgende Frage: könnte der ESP01S meinen TCP Server bedienen wie bis jetzt, aber gleichzeitig auf einem anderen Port UDP Multicast Message mitlesen?

Danke für sachdienliche Hinweise.

#7490344
Lesenswert?

Rahul D. schrieb:

Bot N. schrieb:

Zeig mir mal bei Google wo man da was über Multicast beim ESP8266 mit AT-Kommandos findet, was funktioniert!!!

Ich weiß nicht, ob es funktioniert, aber es kommt vom Controller-Hersteller: https://www.espressif.com/sites/default/files/4b-esp8266_at_command_examples_en_v1.3.pdf

Rahul, in dem von dir verlinkten Espressiv-Dokument ist UDP Multicast allerdings nicht erwähnt ...

LG, Sebastian

OP #7490397
Lesenswert?

Danke für die Rückmeldungen. Wenn es so einfach wäre.

Die Dokumente kenne ich alle.

Bin kein Experte aber meine Experimente mit dem ESP01S zeigen, dass einfaches UDP sicher kein Problem ist, aber Multicast scheint anscheinend doch etwas komplizierter zu sein. Im Moment suche ich nach einer Möglichkeit "to Join the Multicast group" mit AT Commandos meiner AT-FW (1.7.5) zu bewerkstelligen. Irgendwie muss man wohl eine IGMPv2 "Membership report message" schicken um an der Multicast Gruppe teilzunehmen.

#7490443
Lesenswert?

Bot N. schrieb:

Irgendwie muss man wohl eine IGMPv2 "Membership report message" schicken um an der Multicast Gruppe teilzunehmen.

Ich bin ebenfalls kein kein großartiger Experte auf diesem Gebiet, aber so wie ich Multicast bisher verstanden habe, ist die "Membership report message" nur für die Router auf dem Wege bis zu den Sendern wichtig, damit sie die Pakete weiterleiten und nicht verwerfen. Die Sender von Multicastmessages haben ja keine Ahnung davon, wer alles diese Pakete empfängt, die senden blind an eine Port/Class-D-Adress-Kombi. Da aber die Teilnehmer alle innerhalb Deines Subnetzes liegen und kein Router durchquert werden muß, braucht es m.M.n diese Anmeldung nicht. Es muß lediglich ein UDP-Socket auf dem benutzten Port und der benutzten Class-D-Adresse aufgemacht werden. Dafür gibt es wohl auch Protokolle, aber ein wiresharc-mitschnitt sollte die ebenso sichtbar machen. (Mein Stand des Wissens ohne jede Garantie)

Gruß Klaus (der soundsovielte)

OP #7490552
Lesenswert?

Danke für den Hinweis, dann brauche ich in diese Richtung nicht weiter zu suchen. Hatte nur in Wireshark besagte Message gelegentlich von meinem PC als Sender gesehen.

Irgendwie klappt es aber nicht mit dem passenden Setup beim ESP01S. Irgendwie sehe ich schon was multicastmäßiges, aber das ist eben nur eine Teil dessen was man sehen müsste. Da gibt auch für mich Wireshark nicht viel mehr her.

Vermute immer mehr, dass die AT-FW das doch nicht unterstützt. Werde mich mal bei AI-Thinker erkundigen.

Gast #7490556
Lesenswert?

Als ich vor ein paar Jahren Multicast probiert habe ging es auf dem ESP8266 nicht. Weder mit der AT Firmware noch mit Arduino.

Inzwischen gibt es jedoch einige Arduino Beispiel Sketche im Netz, die angeblich funktionieren.

Vielleicht musst du dich von der AT Firmware lösen oder zu einem ESP32 wechseln.

OP #7490562
Lesenswert?

Stefan F. schrieb:

Als ich vor ein paar Jahren Multicast probiert habe ging es auf dem ESP8266 nicht. Weder mit der AT Firmware noch mit Arduino.

Das wäre wirklich schade!

Will aber im Moment noch nicht aufgeben. Zumal ich vielleicht nahe dran bin. Die Multicast Message die ich beim ESP01S sehe,ist die gleiche die ich auch in Wireshark sehe, bevor ich am PC ein bestimmtest Programm starte. Danach sind in Wireshark alle gewünschten Messages sichtbar. Also muss beim ESP8266 noch irgend was fehlen, denke ich.

Stefan F. schrieb:

Vielleicht musst du dich von der AT Firmware lösen oder zu einem ESP32 wechseln.

Müsste ich dann wohl, aber ungern!!

#7490565
Lesenswert?

Bot N. schrieb:

Will aber im Moment noch nicht aufgeben.

Dann mach doch eine eigene Firmware für den ESP, die nur die Kommunikation macht, und vorverarbeitet an den MSP weiterleitet. Dann hast du auf dem ESP alle Freiheiten bzgl. TCP, UDP, Multicast, kannst evtl. auch noch HTTP oder Modbus/UDP dahin auslagern, aber behältst die eigentliche Logik im MSP.

Protokoll zwischen ESP und MSP kannst du dann frei wählen, entweder an das AT-Kommand-Set angelehnt oder was eigenes, für den Anwendungsfall effizienteres...

#7490574
Lesenswert?

Bot N. schrieb:

Zumal ich vielleicht nahe dran bin.

Interessant. Einmal das Thema UDP Multicast auf dem ESP8266, und darüber hinaus das Thema UDP Multicast auf WiFi. Denn du wirst js zwischen PC und ESP01S noch einen AP haben, oder? Und die haben so ihre eigenen Schwierigkeiten mit echtem Multicast über Funk. Zum Beispiel, mit welcher Rate sie senden sollen ...

LG, Sebastian

OP #7490580
Lesenswert?

Sebastian W. schrieb:

Interessant. Einmal das Thema UDP Multicast auf dem ESP8266, und darüber hinaus das Thema UDP Multicast auf WiFi. Denn du wirst js zwischen PC und ESP01S noch einen AP haben, oder? Und die haben so ihre eigenen Schwierigkeiten mit echtem Multicast über Funk

Bin nicht sicher ob ich verstehe was damit gemeint ist.

Grundsätzlich muss MUlticast mit dem ESP funktionieren, zumindest nach AT-Command Doku:

"If the remote host over the UDP is an IPv4 multicast address (224.0.0.0 ~ 239.255.255.255), the ESP device will send and receive the UDPv4 multicast."

Kann aber sein, dass meine AT-FW etwas anders draus macht!

Meine Idee ist, Multicast Messages von Geräten in meinem Netzwerk (SMA Wechslerichter, SMA HomeManager, SMA-Energy Meter) nur mithören und nur bestimmte Daten daraus für eigene Zwecke zu verwerten. Selber "reden" möchte ich nicht. Es hat mit dem PC eigentlich nichts zu tun. Der fungiert im Moment nur als Wireshark Host zum Verfolgen des ETH Datenstroms und gleichzeitig ist da mittels USB-Adapter der ESP01S angeschlossen via Terminalprogram.

Gast #7490583
Lesenswert?

Bot N. schrieb:

Grundsätzlich muss MUlticast mit dem ESP funktionieren, zumindest nach AT-Command Doku:

Bist du sicher dass du diese Version der Firmware verwendest? Die AT Firmware vom ESP8266 wird (soweit ich das sehen kann) seit 2020 nicht mehr weiter entwickelt!

Aktuelle Version vom ESP32 ist 3.2, währen der ESP8266 bei 2.2 hängen geblieben ist.

https://docs.espressif.com/projects/esp-at/en/latest/esp32/index.html

Links oben kannst du die Version der Doku auswählen. Die 1.7.5 steht dort leider nicht zur Verfügung. Im oben verlinkten Dokument von Version 1.3 steht jedenfalls nichts von multicast.

OP #7490589
Lesenswert?

Stefan F. schrieb:

Bist du sicher dass du diese Version der Firmware verwendest?

Sicher bin ich mir nicht, denn soweit ich das gesehen habe gibt es eigene Versionen für den ESP01S (auch älter).

In der Doku sehe ich aber keinen Unterschied was Multicast betrifft zu der die ich als gültig für mich erachte.

Die entsprechenden AT Kommandos werden auch vom Modul akzeptiert. Allein das Ergebnis gefällt mir nicht.

Ich warte jetzt mal ab was AI-Thinker sagt.

#7490596
Lesenswert?

Bot N. schrieb:

Meine Idee ist, Multicast Messages von Geräten in meinem Netzwerk (SMA Wechslerichter, SMA HomeManager, SMA-Energy Meter) nur mithören und nur bestimmte Daten daraus für eigene Zwecke zu verwerten

Sowas in der Art dachte ich mir schon. Funktioniert am PC problemlos, müsste ich mit dem ESP mal ausprobieren...

am PC in etwa: (nodejs)

1
const dgram =require('node:dgram');
2

3
const server = dgram.createSocket({ type: 'udp4', reuseAddr: true });
4

5
server.bind(9522,"239.12.255.254");
6

7
server.addMembership("239.12.255.254");
8

9
server.on('message', (msg, rinfo) => {...

Falls du Beispiel-Code zum Parsen Speedwire (EnergyMeter) -> OBIS-Kennzahlen brauchst, hab ich auch noch rumfliegen, aber ebenfalls NodeJS. Ist aber auch kein Hexenwerk.

#7490613
Lesenswert?

So, am ESP32 ausprobiert (lag grad am Tisch): Klappt problemlos, der kriegt die Broadcasts vom SMA-EM.

1
void setup() {
2
  Serial.begin(115200);
3
  Serial.println("");
4

5
  initWiFi();
6

7
  Udp.begin(multicastPort);
8
  Udp.beginMulticast(multicastIP, multicastPort);
9
}
10

11
void loop() {
12
  uint8_t buffer[1024];
13
  int packetSize = Udp.parsePacket();
14
  if (packetSize){
15
    Serial.print("RECEIVED: ");
16
    Serial.print(packetSize);
17
    Serial.println(" bytes");
18
    int rSize=Udp.read(buffer,1024);
19
    if (rSize != 600) {
20
      Serial.println("Not an SMA packet?");
21
      return;
22
    }
23
    Serial.print("First 3 Bytes: ");
24
    Serial.println(String(buffer,3));
25
  } else {
26
    delay(1000);
27
    Serial.println(".");
28
  }
29
}

Ausgabe auf der Seriellen:

1
RECEIVED: 600 bytes
2
First 3 Bytes: SMA

Ich kompilier das gleich nochmal für ESP8266.

Nachtrag: Läuft am ESP8266 genauso, kleine Code-Änderung:

1
#ifdef ESP8266
2
  Udp.beginMulticast(WiFi.localIP(), multicastIP, multicastPort);
3
#else
4
  Udp.beginMulticast(multicastIP, multicastPort);
5
#endif

und es gibt dort scheinbar keinen String-Konstruktor von Char* und Länge...

d.H. dort das Speedwire-Parsen ergänzen, und schon kriegt dein MSP auf der seriellen z.B. schön vorbereitete und leicht zu verabeitende Datenhäppchen "<OBIS-Kennziffer>=<Wert>\n"

#7490657
Lesenswert?

Bot N. schrieb:

Irgendwie muss man wohl eine IGMPv2 "Membership report message" schicken um an der Multicast Gruppe teilzunehmen.

Korrekt.

Klaus S. schrieb:

Da aber die Teilnehmer alle innerhalb Deines Subnetzes liegen und kein Router durchquert werden muß, braucht es m.M.n diese Anmeldung nicht.

Das stimmt nicht, selbst ein Switch muss die UDP Pakete für die Multicast Group Membership auswerten (IGMP snooping). Das klingt erstmal strange, da ein Switch normalerweise nur auf Layer 2 arbeitet, aber wenn es um Performance und Resource usage geht, dann wird das Layering eben manchmal durchbrochen.

Michael

#7490658
Lesenswert?

Sebastian W. schrieb:

PS: Über was für einen AP läuft das bei dir?

Der Stromzähler (im Keller) über Wlan an einem AmpliFi-Repeater (Consumer-Marke von Ubiquiti), Switch, langes Kabel, TP-Link-Router mit OpenWRT am Arbeitsplatz, dem ich auf die Schnelle noch eine SSID für das VLan gegeben habe an dem auch der AP im Keller hängt.

Wenn bei dir Stromzähler und ESP im selben Wlan hängen, darauf achten dass da keine "Client Isolation" konfiguriert ist. Wenn der Stromzähler per LAN-Kabel dran hängt, ist das natürlich egal.

Nachtrag, wg. dem IGMP-Snooping Hinweis: Der Switch ist auch nix besonderes, nicht managebar, irgendein Plaste-Consumer-Krempel eben. Ob der das macht oder nicht, kann ich nicht sagen.

OP #7490728
Lesenswert?

Recht herzlichen Dank für die unterschiedlichen interessanten Beiträge zu meinem Problem.

Da ich paar Tag mit anderen Dingen beschäftigt bin und deshalb mein Hobbyprojekt zur Seite legen muss, komme ich Mitte nächste Woche wieder darauf zurück und bitte speziell Εrnst B. mir dann paar Fragen zu seiner Lösung zu beantworten. Mir fehlen da noch paar Randbedingen.

Danke nochmals vorerst.

OP #7493960
Lesenswert?

Durch Zufall habe ich jetzt eine Lösung für mein Problem gefunden, dass möglicherweise weitere Nachfragen hier bei den Experten nicht mehr nötig macht.

Bei folgendem Link gibt es eine programmierbare AT-FW Version 2.2.0 . Sie lies sich sofort programmieren und liefert die Mulicast-Daten die ich erwarte.

https://github.com/CytronTechnologies/esp-at-binaries/blob/main/images/ESP8266_Download_Tool_ESP01.png

Habe aber nur kurz getestet und übernehme keine Garantie. Meine Testkommandos musste ich etwas umstellen, da es anscheinend die "..._CUR" AT-Kommandos nicht mehr gibt.

Werde weiter testen ob meine SW noch zu den anderen AT Kommandos passt.

Vielleicht hilft das anderen Interessierten weiter.

(Firma: Dem Ben seine Leiche) #7494040
Lesenswert?

Bot N. schrieb:

Bin quasi Neuling mit dem ESP01S und habe jetzt folgende Frage: könnte der ESP01S meinen TCP Server bedienen wie bis jetzt, aber gleichzeitig auf einem anderen Port UDP Multicast Message mitlesen?

Der ESP ist auch schon bald 10 Jahre auf dem Markt. Unter welchem Stein warste die letzte Zeit? Jo, erstemal das Rad neu erfinden.

#7495510
Lesenswert?

@botnec:

Ich pack dir mal meinen Test-Source hier rein, da haben ggfs. mehr Leute was davon als das per PN durchzugehen.

Ist "Arduino"-Sourcecode, würde aber empfehlen den per Platformio zu compilieren.

Ordner anlegen, platformio.ini reinlegen, src-Unterordner anlegen, main.cpp reinlegen.

dann "pio run" zum kompilieren, "pio run -t upload" zum Installieren auf dem ESP. Oder, falls du platformio als VSCode-Plugin benutzt, einfach die entsprechenden Knöpfchen drücken.

Source passt noch nicht 100%ig, Debugausgaben könnten den MSP430 stören, und die int64-Rechnung hat wohl noch irgendein Problem.

Angehängte Dateien:
OP #7495659
Lesenswert?

@Ernst B.

Vielen Dank für die Antwort!!

Habe alles mal schnell probiert und ich denke ich konnte das Firmware.elf File erzeugen.

Aber noch eine dumme Frage: wie und wo muss ich den ESP01S anschließen zum Programmieren der Firmware? Geht das mit dem USB Adapter ?

Nachtrag: Hat schon geklappt !!

Dank , prima.

#7495666
Lesenswert?

Bot N. schrieb:

Geht das mit dem USB Adapter

Entweder so ein Programmierstöpsel wie im Anhang, oder du verbindest RX, TX, GND mit einem USB->Seriell(TTL) Wandler, und stellst die nötigen Brücke zum Start im Bootloader-Modus her (GPIO0 auf LOW)

https://www.diyhobi.com/flash-program-esp-01-using-usb-serial-adapter/

Angehängte Dateien:
#7495729
Lesenswert?

Bot N. schrieb:

bzw. möchte ich eine fixe IP vergeben.

Entweder am DHCP-Server so einstellen, oder im Quelltext im setup() zwischen "WiFi.mode" und "WiFi.begin" eine Zeile einfügen:

1
WiFi.config(IPAddress(192,168,55,42), IPAddress(192,168,55,1), IPAddress(255,255,255,0), IPAddress(192,168,55,1),IPAddress(8,8,8,8));

(lokale ip, Gateway, Netmask, erster DNS, zweiter DNS)

Gast #7495759
Lesenswert?

Bot N. schrieb:

Aber noch eine dumme Frage: wie und wo muss ich den ESP01S anschließen zum Programmieren der Firmware? Geht das mit dem USB Adapter ?

http://stefanfrings.de/esp8266/index.html#fwupdate

Ernst hat dir einen Adapter gezeigt, den ich auch gerne benutze. Da sind nur zwei Haken (nicht immer aber oft):

  1. Dem Adapter fehlt der "Flash" Button an GPIO0. Denn kann man aber ganz leicht auf der Rückseite der Buchsenleiste nachrüsten.

  2. Der Spannungswandler ist oft zu schwach, um WLAN (stabil) zu nutzen. Aber für einen kurzen Firmware-Upload reicht es.

OP #7496070
Lesenswert?

Jetzt muss ich doch nochmals um Hilfe bitten.

Ich habe mittels Platformio einmal ein File erzeugt und mit UPLOAD in den ESP8266 programmiert. Wenn ich jetzt am Programm Änderungen durchführe wird zwar mit BUILD das File fehlerfrei compiliert, aber beim UPLOAD ist wieder das alte File programmiert. Ich habe nur zwei Print-Kommandos eingefügt für MAC und IP. Diese werden aber anscheinend nicht ausgeführt.

Muss ich da noch was machen dass das neue File übernommen wird?

Plattformio ist absolut neu für mich!!

OP #7496088
Lesenswert?

Ist dass das was gewünscht war?

NACHTRAG: Fehler gefunden!! Hatte main.cpp zweimal im PIO Verzeichnis.

Kompiliert wurde das File im Verzeichnis SRC, editiert aber das File im Verzeichnis über SRC. Typische Anfängerfehler.

Jetzt funktioniert alles soweit.

Danke sehr nochmals.

Angehängte Dateien:
OP #7496162
Lesenswert?

Noch eine Frage bitte:

Wo finde ich den die Beschreibung der z.B. WiFi Kommandos die hier verwendet werden? Ich habe zwar Dokumentation gefunden, aber die passt irgendwie nicht zu dem Code.

z.B. Code: wifi.config(ip, gateway, netmask, dns, dns2); Doku: wifi.config(ip, dns, gateway, netmask);

#7496171
Lesenswert?

Bot N. schrieb:

Ich habe zwar Dokumentation gefunden, aber die passt irgendwie nicht zu dem Code.

https://arduino-esp8266.readthedocs.io/en/3.1.2/esp8266wifi/station-class.html#config

WiFi.config(local_ip, gateway, subnet, dns1, dns2)

Die Arduino-Header/Schnittstellen/API ist zwar meistens zwischen verschiedenen µCs kompatibel, zumindest ist das die Idee, aber eben doch nicht immer.

Im Source hast du sicher auch die "#ifdef ESP8266" gesehen: Arduino für ESP32 ist halt wieder etwas anders.

#7498823
Lesenswert?

Aus aktuellem Anlass:

Ich habe den Code oben "als Gag" auf eine Viertelstunde zusammengestöpselt, und dabei einige JS->C++ Übersetzungsschritte per KI erledigen lassen.

Ich selber benutze keinen ESP zum Mitlesen von Speedwire, und habe es auch nicht vor.

Ich selber habe weder einen SMA Homemanger noch Ladesäule, nur einen "SMA EnergyMeter"-kompatiblen Stromzähler, der scheinbar manche Details doch anders macht.

Ich leiste keinen persönlichen Support für das Beispielprogramm oder SMA Anlagen. Nicht per PN, nicht per EMail, auch nicht gegen Geld.

Wenn ihr Fragen zum Code habt, stellt sie hier im Forum, und sendet mir Keine PN.

Danke.

Und vorher hier vorbeischauen, das Problem mit komischen Feldbezeichnern nach dem 144er-Versionsfeld ist da schon gelöst.

Beitrag "SMA Home-Manager Multicast-Messages Auswertung"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren