Forum: Mikrocontroller und Digitale Elektronik ESP8266 im AP-Modus: Anzahl der Clients


von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich möchte gerne die Anzahl der Clients wissen, die an einem ESP8266 als 
Accesspoint hängen. Genau genommen interessiert mich der Fall, dass KEIN 
Client angemeldet ist.

Im Web findet man (für Adruino-IDE) die Befehle

number_client = wifi_softap_get_station_num();
stat_info = wifi_softap_get_station_info();

Erster liefert die Zahl direkt, zweiter liefert eine Struct, deren 
Elemente man zählen könnte. Das Problem: Bei beiden wird leider nicht 
auf Null aktualisiert, wenn sich der letzte Client verabschiedet hat. 
Das Web ist voll von diesem ungelösten Problem ...

Hat hier evtl. jemand eine funktionierende Idee?

Klar könnte ich den überschaubaren IP-Adressraum auch durchpingen und 
zählen, aber das würde ich aus Performance-Gründen nur als letzte 
Möglichkeit in Betracht ziehen. Ausserdem versendet der AP UDP-Messages 
mit Sensordaten und ich kann derzeit nicht abschätzen, was eine ICMP-Lib 
da für Nebenwirkungen mit sich bringt.

von Rüdiger B. (rbruns)


Lesenswert?

Frank E. schrieb:
> Klar könnte ich den überschaubaren IP-Adressraum auch durchpingen

Du hast doch die IP Adresse in der Station Info.
Vielleicht den RSSI Wert abfragen ?

von Andree S. (amshh)


Lesenswert?

Frank E. schrieb:
> number_client = wifi_softap_get_station_num();

Merkwürdig. Ich benutze dafür
WiFi.softAPgetStationNum()

Und das funktioniert auch mit 0 Clients am Software Access Point.

(Mit den folgenden Webservern:
1
#ifdef ARDUINO_ARCH_ESP8266
2
    #include  <ESP8266WebServer.h>
3
#endif
4
#ifdef ARDUINO_ARCH_ESP32
5
    #include  <WebServer.h>
6
#endif
)

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Andree S. schrieb:
> Frank E. schrieb:
>> number_client = wifi_softap_get_station_num();
>
> Merkwürdig. Ich benutze dafür
> WiFi.softAPgetStationNum()
>
> Und das funktioniert auch mit 0 Clients am Software Access Point.
>
> (Mit den folgenden Webservern:
>
>
1
> #ifdef ARDUINO_ARCH_ESP8266
2
>     #include  <ESP8266WebServer.h>
3
> #endif
4
> #ifdef ARDUINO_ARCH_ESP32
5
>     #include  <WebServer.h>
6
> #endif
7
>
> )

Die verwendeten Webserver sollten für den AP überhaupt keine Rolle 
spielen. Völlig unterschiedliche Protokollschichten.

Wenn, dann spielt die Implentierung des AP selber eine Rolle. Nämlich 
der Sachverhalt, ob er sich selber bei der "StationNum" mitzählt oder ob 
er das halt nicht tut. Und falls er es tut, dann stellt sich vielleicht 
noch die Frage, unter welchen Randbedingungen er das tut. Das alles 
sollte dokumentiert sein. Falls nicht: Im Quelltext letztlich ist es 
garantiert "dokumentiert".

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

Ob S. schrieb:
> Das alles sollte dokumentiert sein.

"sollte" haha. Es geht hier um Produkte von Espressif!

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

HTTP ist kein zustandsbehaftetes Protokoll. Pack Dir einfach den 
Zeitpunkt des letzten Zugriffs in eine Variable, wenn das länger als 
sagen wir eine Minute oder so her ist, ist mit hoher Wahrscheinlichkeit 
niemand mehr mit dem Server verbunden.

Oder baue Deine Seiten so, daß sie irgend eine Art keep-alive-Signal zum 
Server senden solange sie verbunden bzw. offen sind.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Sherlock 🕵🏽‍♂️ schrieb:
> Ob S. schrieb:
>> Das alles sollte dokumentiert sein.
>
> "sollte" haha. Es geht hier um Produkte von Espressif!

Recht ordentliche Doku gibt es inzwischen. Daraus läßt sich zumindest 
erst mal entnehmen, dass der AP selber nicht mitzählt und noch einige 
andere interessante Sachen:


SYSTEM_EVENT_AP_STADISCONNECTED

This event can happen in the following scenarios:

        The application calls esp_wifi_disconnect(), or 
esp_wifi_deauth_sta(), to manually disconnect the station.
        The Wi-Fi driver kicks off the station, e.g. because the SoftAP 
has not received any packets in the past five minutes, etc.
        The station kicks off the SoftAP.

When this event happens, the event task will do nothing, but the 
application event callback needs to do something, e.g., close the socket 
which is related to this station, etc.

Insbesondere der letzte Satz weist darauf hin, dass hier durchaus auch 
der Webserver eine Rolle spielen kann.

Es sollte eigentlich nicht so sein, dass der überhaupt wissen muss, ob 
eine Verbindung über Kabel oder WiFi läuft. Aber bei der 
Espressif-Lösung muss er das offensichtlich doch wissen und aktiv 
entsprechend reagieren.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.