Zugangsdaten mehrerer Wlans speichern

Ja, ich hab das schon verstanden, dass man den WiFi-Start im Normalfall kurz halten möchte.

Was mich nur etwas stört, ist dass ich mit dem zweiten Verbindungsversuch und einem Timeout von 3s mindestens 7.5s Verzögerung habe (+ neue Verbindung), sollte das alte WiFi ausfallen.
Aber vermutlich kann man das verkraften, wenn der Wechsel eigentlich selten stattfindet.

1 „Gefällt mir“

So ist es! Geräte sollten hier definitiv nie versuchen irgendwelche potentiell fehlerhaften Benutzereingaben zu korrigieren.

In dicht besiedelten Gebieten kann es schon mal passieren, dass es eine SSID „MeinWLAN“ und eine SSID „MeinWLan“ parallel gibt.

Die Software muss daher die SSID case-sensitive behandeln. Ich denke bisher hat sie das auch gemacht und es gibt m. E. keinen Grund das hier zu ändern.

2 „Gefällt mir“

Danke erstmal für’s Testen @tueddy.
Das deckt sich methodisch letztlich mit dem, was ich vorher (vor der Entwicklung) schon geschrieben hatte: Man sollte einfach das letzte WLAN als Default annehmen und versuchen, sich bevorzugt mit diesem zu befinden.

Auch oder genau weil…

Genau. Das finde ich in Kombination mit dem WLAN-Scan dann wirklich perfekt gelöst:
a) Zuerst annehmen, dass sich nichts geändert hat.
b) Schlägt a fehl, dann geht man in den Scan über.

Falls man jedoch tatsächlich mein, dass Leute ständig hin und herwechseln, könnte man in die settings.h auch noch ein Flag aufnehmen, mit dem man Schritt a direkt überspringen kann. Aber vielleicht ist das dann auch einfach „overdone“.

2 „Gefällt mir“

Ihr seid herzlich dazu eingeladen, die neuste Version zu testen.
Ich habe es jetzt so implementiert, dass zunächst das letzte verbundene Netzwerk versucht wird. Ist das (zwei mal) fehlgeschlagen, wird der Scan gestartet und alle bekannten Netzwerke werden durchprobiert.

Weiterhin hab ich eine grundlegende Weboberfläche implementiert: WiFis anzeigen, löschen und hinzufügen geht. Der hostname muss noch anders geregelt werden, da es nur einen hostname für alle Netzwerke gibt.

Die Web-API habe ich im Gegensatz zur bisherigen Websocket-API an Standard REST orientert:
GET /savedSSIDs: Liste aller gespeicherten Netzwerke abfragen
POST /savedSSIDs + JSON-Body: Neues Netzwerk hinzufügen
DELETE /savedSSIDs/{ssid}: Das angegebene Netzwerk löschen

Ein Problem für das mich noch eure Meinung interessieren würde:
Im Hotspot kann man aktuell nur neue Netzwerke hinzufügen. Sind aber schon 10 gespeichert, schlägt das fehl.
Man könnte dem Nutzer ermöglichen, alte zu löschen indem man das gleiche Interface wie im management anzeigt. Da man bei aktivem AP ohnehin recht einfach den ESPuino übernehmen kann, halte ich das für unproblematisch.
Alternativ kann man auch überlegen, einfach das letzte hinzugefügte pauschal zu löschen.

4 „Gefällt mir“

@SZenglein das sieht gut aus! Hab’s mal rauf & runter getestet & die verschiedenen WLAN’s klappen einwandfrei. Auch die Verbindungsgeschwindigkeit bei bestehenden WLAN ist jetzt einwandfrei.
Daumen hoch :+1:Aus meiner Sicht steht einem Merge in den DEV-Branch nichts im Wege. Kann das noch jemand bestätigen?

Eine Kritik & die ist jetzt wirklich nicht bös gemeint: Die Frontend Umsetzung ist nicht so geil:
Evt. als Aiufklappliste?

Egal, ready to merge

3 „Gefällt mir“

Danke für das Feedback. Freut mich, dass es gefällt.

Der PR ist noch als Draft markiert, und das ist auch so gewollt. Ich will noch etwas aufräumen (z.B. logging) und die UI anpassen, das sind aber Kleinigkeiten.

3 „Gefällt mir“

Ich muss mal ketzerisch fragen: Gehen wir dann jetzt den Weg, dass wir von Websocket nach REST umstellen? Weil das gemischt zu haben ist ja dauerhaft (temp. ok) kein wünschenswerter Zustand.

1 „Gefällt mir“

Gut, dass du es ansprichst. Ich finde, mit HTTP calls kann man vieles sehr viel unkomplizierter und ordentlicher machen, gerade das ändern von Einstellungen etc.

Websocket ist aber wesentlich besser geeignet, wenn es um Heartbeats oder live-Updates wie die Lautstärke geht.

Eine Mischung von Websockets und REST ist alles andere als unüblich. In der Regel werden Websockets verwendet um REST-APIs zu erweitern.
Es gab und gibt ja auch die Endpunkte für restart und info.

3 „Gefällt mir“

@SZenglein Danke für deinen Commit von gestern, jedoch ist mir ehrlich gesagt unklar, warum du jetzt anfängst, einen anderen Code-Style einzuführen.

Ich erwarte mind., dass…
…defines eingerückt werden. Warum das die halbe Welt anders macht als ich ist mir unklar - nicht eingerückt ist das sau unübersichtlich.
…öffnende geschweifte Klammern am Ende der Zeile mit dem Ausdruck, den man klammern will
…zB else if werden in einer Zeile geklammert ( } else if { )
…Leerzeichen zwischen if und runde Klammer gesetzt wird
…ein Leerzeichen vor einer geschweiften Klammer gesetzt wird

Ich habe hier in letzter Zeit einiges an Umbauten akzeptiert und mich offen gezeigt. Aber wir fangen keinen neuen Code-Style an.

1 „Gefällt mir“

Ich bin jetzt durch die ganzen cpp-Files gepfügt und habe die Sachen, die mir aufgefallen sind, angepasst, so dass das einheitlich ist in Sachen Codestyle.

Vor einiger Zeit wurde die .editorconfig ins Projekt eingecheckt.
Da ich am liebsten den auto-formatter anschmeiße, anstatt selbst zu formatieren, hab ich das alles von VS-Code formatieren lasen.

Wenn der style nicht passt, sollte eventuell die editorconfig angepasst werden bzw. generelle Richtlinien für den Style genannt werden. Die editorconfig ist dafur schon eine gute Lösung, finde ich.

Es gibt auch noch ein paar Stellen (spontan fällt mir html ein) wo sich nicht an den Stil gehalten wurde (Leerzeichen statt Tabs).

@bliepp Du hattest das glaube ich eingeführt. Bitte anpassen, was nicht übereinstimmt.

Ja, das ist korrekt.
Ich habe mir das jetzt auch eine Weile angesehen, aber musste jetzt mal intervenieren :slight_smile:

1 „Gefällt mir“

Ja, daher hab ich auch geschrieben „best-effort“. Es ist schwierig, vor allem bei so einem kleinen Projekt, dass jeder gleich formatiert. Um einen einheitlichen Stil zu gewährleisten, muss der Maintainer (du) eigentlich alle PRs ablehnen, bis der Stil passt.

Das ist natürlich ein riesen Aufwand. Daher ist es Sinnvoll, die Formatierung automatisiert zu validieren. Die .editorconfig ist dafür ein erster Schritt, aber auch nicht das Ende.

1 „Gefällt mir“

Ja genau, ich hatte vor einiger Zeit eine .editorconfig eingefügt, aber die sprachspezifischen Anpassungsmöglichkeiten sind recht begrenzt. Man kann so generelle Textverarbeitungsrichtlinien durchsetzen wie z.B. eine Leerzeile am Ende einer Datei, keine Leerzeichen am Ende einer Zeile, ob Tabs oder Leerzeichen verwendet werden sollen, etc. Ich habe die Einstellungen der EditorConfig-Datei auch nicht auf alle Dateien angewendet, sondern nur auf die C++ Dateien.

Dinge, die die Programmiersprache betreffen lassen sich meines Wissens nach nicht mit EditorConfig einstellen (z.B. das Setzen von Klammern, das Einrücken von Makros, etc.). Sowas müsste man einfach in einem Styleguide vorgeben und konsequent bei neuen PRs überprüfen und entsprechend vor dem Mergen durchsetzen (sollte mit entsprechend ausgeklügelten Github Actions automatisierbar sein).

Eigentlich hatte ich geplant die von dir oben genannten Regeln so beim Refactoring nach und nach umzusetzen, aber meine (vllt. etwas großkotzig angekündigten) Refactoringpläne wurden durch Nebenjob, Studium und Familie leider stark ausgebremst.

3 „Gefällt mir“

Hi, melde mich hier auch noch kurz zu Wort mit zwei Punkten. Können wir bei bedarf gene auch in separate Topics verschieben:

  • sollen wie die editorconfig entsprechend geradeziehen und gleichzeitig den Auto-Formater genrell aktivieren? Wir könnten den den einmalig über alles laufen lassen und anschließend sollte es dadurch zu keinen weiteren Format-Konflikten und Wildwuchs kommen…
  • Vermutlich sinnvoll in einem separaten Thema, da es hier aber auch schon um die Accesspoint-Seite ging: könnten wir im Hotspot-Modus auch über einen Reiter / Link die vollständige WebUI anbieten oder sind hier andere Faktoren limitierend? Könnte für lange Autofahrten oder Urlaub in Hotspot-Netzen sehr praktisch sein…

Aber wirklich cooles Feature mit den mehreren WLANs!

Im Hotspot-Modus ist auf der Website das Einbinden von externen Ressourcen limitierend: Es werden Bootstrap und jQuery nachgeladen.
Meiner Meinung nach ein guter Punkt für die Roadmap, die Web-UI als ein Bundle komplett auf dem ESP abzulegen. Aber das ist viel Arbeit und bisherige Versuche dazu hängen ein bisschen im Limbo.

Darüber bin ich schon gestolpert, als ich die Listenansicht der WiFis im AP implementieren wollte: das ist ohne Bootstrap o.ä. viel umständlicher als die fertigen Elemente zu verwenden.

1 „Gefällt mir“

Hallo @SZenglein , @tueddy , @Joe91 (ich hoffe ich habe keinen vergessen)

Ich habe schon länger die Idee Wlan grundsätzlich nicht zu aktivieren. Das ist bei meinen 3 Boxen in Toronto und Kopenhagen schon so. Wenn es jemand benutzt dann ist es Opa. Die Tastenfunktion für WLAN ist nicht eingerichtet und somit ist es nur per Karte möglich Wlan zu aktivieren. Ich hoffe die Karten sind im „Tresor“, ansonsten habe ich noch fertige für den Notfall hier in Deutschland.

Nun hier mein Anliegen:
Wäre es möglich Wlan während des Reboot , für ca. 5-10 Sekunden, mittels TastenKombi zu aktivieren ( CMD_WIFI_ON) und zusätzlich immer mit jeder Radiokarte? Dann beim nächsten Reboot aber wieder auf aus. Ähnliches gibt es schon mit CMD_ENABLE_FTP_SERVER während der ersten 60 Sekunden
Das würde das Handling deutlich vereinfachen , auch wenn mal eine Karte weg ist.
Damit wäre auch dieser Wunsch erledigt.
Das müsste mittels #define als Leistungsmerkmal einrichtbar sein.

Die Idee habe ich schon länger , kann es aber selbst nicht umsetzen weil meine Kenntnisse dazu nicht reichen. und jetzt habt ihr auch wieder alles umgeändert.
Ich gehe davon aus das dies für euch ein Klacks ist , wenn ich sehe was ihr alles in so kurzer Zeit programmiert habt. Danke dafür und Hut ab.

VG

Hy @compactflash ich hatte da eher andere Karten im Sinn. Stopp nach dem Titel und LEDs dimmen. Ich denke aber über den Acesspoint im Handy ist die Weboberfläche auch erreichbar. Somit gibt es für meinen usecase einen workaround

Das Feature „Zugangsdaten mehrerer Wlans speichern“ ist ab sofort im DEV-Zweig verfügbar.

Vielen Dank an @SZenglein für Deine Arbeit!

4 „Gefällt mir“

Ja, die Funktion schaut sehr gut aus. Muss ich bei Zeiten testen und dann in meine Boxen einbauen. Macht das Leben einfacher wenn wir dann auf Urlaub fahren :slight_smile:.


Bei der Durchsicht ist mir aber die Frage mit der Warnung ins Auge gesprungen.

Diese ist wichtig, memmove funktioniert nur mit POD und TriviallyCopyable Objekten. Bei allen anderen darf memmove (und memcpy) nicht verwendet werden. Das kann bei komplexen Klassen (die zB shared_pointer verwenden) zu Fehlern führen!

Komplexe Klassen haben zB dem X operator= (const X&) überschrieben und führen bei der Zuweisung (bzw wenn die zerstört werden) Aktionen durch. Diese werden nicht aufgerufen, wenn die Klasse byteweise durch memmove (oder memcpy) verschoben wird. Damit muss ein „move“ über diesen Operator gehen.

Bei einem C-Array geht es mit einer Schleife:

for(size_t j=knownNetworks+i;j<numKnownNetworks-1;j++) {
    knownNetworks[j] = knownNetworks[j+1];
}

oder mit c++ für schreibfaule :smiley:

// std::copy(begin, end, dest_begin)
std::copy(&knownNetworks[i+1], &knownNetworks[numKnownNetworks], &knownNetworks[i]);

was überlicherweise dann hierzu führt:

for (; first != last; (void)++first, (void)++d_first)
    *d_first = *first;
3 „Gefällt mir“