Jump to content

Recommended Posts

Geschrieben

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

Geschrieben

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.

Geschrieben

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?

Geschrieben
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.

Geschrieben
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.

Geschrieben
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.

Geschrieben

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?

 

Geschrieben

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. 😉

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...