albert Geschrieben December 29, 2023 at 10:28 Geschrieben December 29, 2023 at 10:28 Hallo zusammen, ich bin gerade dabei die Firmware des ESP32 Ethernet Bricks um ein Modul zu erweitern, welches die Anbindung über Ethernet an einen PC ermöglicht. Dabei sollen folgende Funktionalitäten umgesetzt werden: - PC sendet über eine Anwendung Kommandos über Ethernet an den ESP32 Ethernet Brick - Brick empfängt die Kommandos nacheinander, speichert sie in eine Variable und reagiert entsprechend darauf An welcher Stelle der Firmware könnte man da aufsetzten und wie würde dies grob (Schritte) aussehen? MfG Albert Zitieren
MatzeTF Geschrieben January 2, 2024 at 10:17 Geschrieben January 2, 2024 at 10:17 Hast du dir schon das Tutorial zur ESP32 Firmware angesehen? Fast die gesamte Firmware verwendet das Konzept, dass Config-Objekte angelegt und unter bestimmten URLs registriert werden. Als Konvention wird "/config" für speicherbare Einstellungen, die einen Neustart überleben sollen, verwendet, und "/state" für Laufzeit-Zustände. Im Tutorial wird eine Config unter "tutorial_phase_#/config" und "tutorial_phase_#/config_update" registriert und enthält den Wert "color", der ein String sein muss. Über HTTP übertragen wird das Ganze als JSON. Du könntest dir also eine Config bauen, die die von dir benötigten Werte enthält, und mit api.addCommand() einen Handler dafür registrierten, der beim Setzen der Config ausgeführt wird. Daten schickst du dann einfach JSON-formatiert an die entsprechende URL. PC-seitig verwendest du entweder auch eine JSON-Bibliothek oder du baust dir triviales JSON selbst zusammen. Wie das aussehen muss, siehst du, wenn du die per api.addState() registrierte Adresse im Browser öffnest. Falls dein Browser das hübsch formatiert, musst du noch die Rohansicht im Browser auswählen. Zitieren
albert Geschrieben January 3, 2024 at 10:46 Autor Geschrieben January 3, 2024 at 10:46 Alles klar, ich habe mir das Tutorial zur ESP32 Firmware angeschaut. In meinem Anwendungsfall finden sich noch zwei Herausforderungen dazu, die durch die vorliegende Anwendung PC-seitig bedingt und nicht abänderbar sind: - man kann nicht an eine URL, sondern nur an eine IP-Adresse mit Port versenden - die Kommandos liegen als String und nicht als JSON vor Kann man mit diesen Einschränkungen ebenfalls auf euerem Konzept mit Config-Objekten aufbauen und wenn ja wie würde man da grob vorgehen? Zitieren
MatzeTF Geschrieben January 3, 2024 at 11:13 Geschrieben January 3, 2024 at 11:13 On 1/3/2024 at 11:46 AM, albert said: - man kann nicht an eine URL, sondern nur an eine IP-Adresse mit Port versenden - die Kommandos liegen als String und nicht als JSON vor Kann man mit diesen Einschränkungen ebenfalls auf euerem Konzept mit Config-Objekten aufbauen und wenn ja wie würde man da grob vorgehen? Mit reinen Strings statt JSON könnte man das ggf. machen, aber wenn du einfach nur einen Port mit Daten bewerfen willst, kannst du die Config-Objekte nicht nutzen. Läuft das Ganze überhaupt über TCP oder UDP? Vermutlich wirst du nach einer TCP- oder UDP-Server Lösung mit dem Arduino ESP32-Framework suchen müssen, das wir verwenden. Für UDP kannst du auch einen Blick in cm_protokoll.cpp werfen und nach „recvfrom“ suchen. Das ist aber nicht sehr einsteigerfreundlich. Zitieren
albert Geschrieben January 3, 2024 at 11:24 Autor Geschrieben January 3, 2024 at 11:24 Am 3.1.2024 um 12:13 schrieb MatzeTF: Mit reinen Strings statt JSON könnte man das ggf. machen, aber wenn du einfach nur einen Port mit Daten bewerfen willst, kannst du die Config-Objekte nicht nutzen. Es handelt sich bei den Kommandos um einen String, wobei dieser auch Daten (integer) enthalten kann, welche dann (wenn vorhanden) extrahiert und in eine Variable gespeichert werden sollen. Am 3.1.2024 um 12:13 schrieb MatzeTF: Läuft das Ganze überhaupt über TCP oder UDP? Das Ganze läuft über TCP. Zitieren
MatzeTF Geschrieben January 3, 2024 at 13:05 Geschrieben January 3, 2024 at 13:05 On 1/3/2024 at 12:24 PM, albert said: Es handelt sich bei den Kommandos um einen String, wobei dieser auch Daten (integer) enthalten kann, welche dann (wenn vorhanden) extrahiert und in eine Variable gespeichert werden sollen. Wenn das kein Standardformat wie z. B. JSON ist, wirst du das selbst auseinandernehmen müssen. On 1/3/2024 at 12:24 PM, albert said: Das Ganze läuft über TCP. Dafür haben wir aktuell nichts. Es gibt vom Arduino ESP32-Framework aber sicherlich einen TCP-Server, den du dafür benutzen kannst. Du musst dann ein Modul in unserer Firmware anlegen und in der (pre_)setup-Phase den TCP-Server starten und entweder per Callbacks oder polling in der loop-Funktion eingehende Daten behandeln. Zitieren
albert Geschrieben January 4, 2024 at 09:41 Autor Geschrieben January 4, 2024 at 09:41 Bestünde nicht die Möglichkeit, sich in der Firmware in einen bereits vorhandenen Teil (z.B. proxy, webserver, o.Ä.) mit TCP-Server mit entsprechender IP und Port einzuklinken und daran ansetzend dann einen eigenen "Kommando-Parser" zu nutzen, um die dorthin ankommenden Strings umzuwandeln bzw. zu verarbeiten? Zitieren
MatzeTF Geschrieben January 4, 2024 at 10:04 Geschrieben January 4, 2024 at 10:04 Klar kann man das machen. Ich halte das allerdings für sehr viel aufwändiger und fehleranfälliger, als einfach die dafür vorgesehene Komponente vom Arduino ESP32-Framework zu nutzen. Schau doch mal hier und anschließend hier unter „Client class“. Wenn du dir WiFiServer-Beispiele von irgendwelchen anderen Webseiten ansiehst, musst du nur bedenken, dass die loop()-Funktion in unseren Modulen nicht blockieren darf. Es darf also nirgends ein „while (client.connected())“ vorkommen. 😉 Zitieren
albert Geschrieben January 10, 2024 at 09:15 Autor Geschrieben January 10, 2024 at 09:15 Alles klar, danke. Stimmt, so funktionierts einfacher. Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.