Verstehen von ESP32-Rust-Dokumentation

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Abend zusammen,

ich bitte euch mal wieder um Hilfe abseits von Python. Kürzlich hatte ich zwischen einem Laptop und einem ESP32 mittels `Socket` Bytes ausgetauscht. Dafür hatte ich MicroPython verwendet. Zeitbedingt, aber schon seit längerem versuche ich immer wieder mit Rust und dem ESP32 Fuß zu fassen. Also dachte ich mir, da der MicroPython-Code nicht sonderlich umfangreich ist, übersetze ich den jetzt in Rust.
Wie immer habe ich mir das leichter vorgestellt, als es ist.

Wenn ich in der Doku von Rust nach `Socket` suche, dann komme ich da drauf:
https://docs.rs/socket/latest/socket/

Ok erstmal "Bahnhof", wenn ich die `Struct socket::Socket` öffne, dann sehe ich zwar die ganzen Funktionen, aber muss ich durch versuchen rausfinden, was ich zum Beispiel an `new` übergeben muss? Ich sehe schon dass das vom Typ i32 sein muss, aber was ist `socket_family` usw?

Dann weis ich gar nicht, läuft das auch auf dem ESP32?
Wenn ich speziell in der Suche der Dokumentation nach "ESP32" suche und dann die Ergebnisse durchgehe, komme ich irgendwann auf `easy_sockets`:
https://docs.rs/easy-sockets/latest/easy_sockets/

Aber leider bin ich auch hier irgendwie sehr planlos.
Woher weis man den als Anfänger, was und wie man die Sachen nutzt?
Ich bin bis jetzt sowas gewöhnt:
https://docs.micropython.org/en/latest/ ... #functions
und finde, damit bekommt man einen Eindruck, wie man mit dem Modul umgeht.

Bin ich zu doof um die richtige Seite für Rust zu finden, ist das in anderen Sprachen normal, dass das nicht so ausführlich ist und "richtige" Programmierer kommen damit problemlos klar?

Falls jemand Lust hat, mir etwas abseits von Python zu helfen, wäre ich sehr dankbar.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
DeaD_EyE
User
Beiträge: 1219
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Schau mal hier: https://docs.rs/socket/latest/socket/struct.Socket.html

Das ist eine 1:1-Kopie der C-API für Sockets.
Easy_sockets nutzt Tokio und Tokio ist sowas wie asyncio für Rust.

Ein getaddrinfo gibt es bei Rust Sockets nicht.
Wenn man das in der Suche eingibt, bekommt man unter anderem das hier vorgeschlagen: https://docs.rs/dns-lookup/latest/dns_lookup/
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dennis89: Das sieht nach der üblichen BSD-Socket-API aus. Einfach die Dokumentation für C lesen. Ich wäre wahrscheinlich auch zu faul die noch mal für eine andere Programmiersprache abzuschreiben. 😈
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für eure schnellen Antworten.

@DeaD_EyE dein erster Link ist das, was ich mit
wenn ich die `Struct socket::Socket` öffne, dann sehe ich zwar die ganzen Funktionen, aber muss ich durch versuchen rausfinden, was ich zum Beispiel an `new` übergeben muss? Ich sehe schon dass das vom Typ i32 sein muss, aber was ist `socket_family` usw?
meinte.

@__blackjack__ Natürlich, wie konnte ich das übersehen 😱
Ne Spaß beiseite, ich will ja auch nicht anspruchsvoll sein, aber ein Link in der Rust Doku zur entsprechenden C-Doku wäre ja nett. Ich schau mal was ich finde und versuche mein Glück.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
DeaD_EyE
User
Beiträge: 1219
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ohne jetzt in die Rust-Doku zu sehen, nehme ich mal an, dass i32 signed Integer mit 4 Byte ist.

Bei den BSD-Sockets gibt es folgende Argumente:

Adress-Familie: AF_INET (ipv4), AF_INET6 (ipv6), AF_UNIX (unix socket)
Socket-Typ: SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
Protokoll: Hier fehlt offensichtlich IPPROTO_UDP, aber IPPROTO_TCP ist vorhanden

Möglicherweise hilft dieses Repo weiter: https://github.com/ivmarkov/rust-esp32-std-demo
Die benutzen was völlig anderes. socket scheint das Low-Level-Interface in Rust zu sein, dass niemad nutzen will. Ich habe zumindest auf die Schnelle keine Beispiele explizit für create socket gefunden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Danke, von deinem verlinkten Repository hab ich mich auf ein aktuelles durch geklickt und bin letztendlich bei diesem Beispielt gelandet:
https://github.com/esp-rs/esp-idf-svc/b ... les/tcp.rs

TCP hört sich schon mal gut, ich hoffe dass ist der richtige Anhaltspunkt.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

@Dennis89: Die Seiten, die du verlinkt hast, sind nicht in der Rust-Doku, sondern Dokus von irgendwelchen Crates. Und da hast du erfolgreich zwei wirklich obskure gefunden: Die erste ist 9 Jahre alt (!) und beschreibt sich selbst so:
https://github.com/jstasiak/rust-socket hat geschrieben: This was an experiment. It's useless. It's abandoned
Und die zweite ist einen Monat alt und die meisten Commit-Messages sind „.“. Also beides nichts, was man benutzen will.

Die Rust-Doku (nicht die Dokus von irgendwelchen Crates) findet man unter https://doc.rust-lang.org/stable/std/index.html. Auf einem Mikrocontroller musst du aber immer auch aufpassen, ob du die Standardlib (`std`) überhaupt benutzen kannst, oder ob du nur `core` und `alloc` hast. In `std` sind so Sachen drin wie Dateioperationen und Netzwerkzeugs, die ein Betriebssystem brauchen.

Für ESP32 bist du bei deinem letzten verlinkten Repo und dem dazugehörigen Buch https://docs.esp-rs.org/book/ richtig. Damit scheint man dann auch `std` benutzen zu können, hier ist die Doku für `std::net`.
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

oh danke, das ist mir nicht aufgefallen. Bei meiner Suche waren dass die einzigen Seiten die "ESP32", "Rust" enthalten und nach einer Dokumentation aussahen.

Die allgemeine Rust-Doku ist mir bekannt und da es extra auch ein Rust Buch für Mikrokontroller gibt, dachte ich mit meinen ersten Links hätte ich die passende Doku dazu gefunden. Bin irgendwie nicht davon ausgegangen das `std` bei Mikrokontroller das gleiche ist wie bei einem PC. Aber sehr schön, dann bin ich jetzt auf dem richtigen Weg.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten