PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Signalstärke von verbundenem Client rausfinden?



Rabenauge
17.12.2018, 00:25
Hallöle.
Ich wurstele auch mit den NodeMCU's rum, seit neuestem-die Teile haben was!

Grad bastele ich an einer Fernsteuerung (die läuft schon), und zwar macht der NodeMCU einen Zugangspunkt auf.
Dort kann sich ein Client (mein Handy, aus verschiedenen Gründen _will_ ich das per App machen) einklinken, und den NodeMCU veranlassen, Dinge zu tun.
Soweit funktioniert das auch, nur möchte ich das Ganze bidirektional haben: ein bisschen Telemetrie.
Wie ich Daten an die App so sende, dass ich die dann dort vernünftig anzeigen kann, krieg ich wohl noch raus, aber als erstes hätte ich gerne die Signalstärke der Verbindung angezeigt.
Und genau das klappt nicht.
Hängt man das Teil an nen Router, ist es ja kein Problem:

long rssi = WiFi.RSSI();
Serial.print("RSSI:");
Serial.println(rssi);
Das funktioniert auch.
Nur nicht, wenn der NodeMCU als Zugangspunkt arbeitet.Eigentlich sollt es doch trotzdem möglich sein, da eine Aussage machen zu können-funktechnisch ist es doch Wurst..?Hat jemand eine Idee?

Moppi
17.12.2018, 06:16
Guten Morgen Rabenauge,

Du lässt ein nodeMCU (#1) mit dem Router verbinden und WiFi.RSSI(); funktioniert.
Jetzt konfigurierst Du dieses nodeMCU (#1) als Server (Zuganspunkt) und WiFi.RSSI(); funktioniert auf diesem nodeMCU nicht.

Nimm mal ein zweites nodeMCU (#2) und verbinde mit #1. Schau, ob dann WiFi.RSSI(); auf #2 funktioniert.

Soll #1 seine eigene Signalstärke detektieren?

MfG

PS: Schade, dass die Teile nur einen ADC-Eingang haben.
https://www.arduino.cc/en/Reference/WiFiRSSI -> Description
vergleiche mit Beispielcode: https://github.com/tttapa/Projects/blob/master/ESP8266/WiFi/RSSI-WiFi-Quality/RSSI-WiFi-Quality.ino

Rabenauge
17.12.2018, 09:46
Nö- die vom verbundenen Handy hätt ich gerne.
Ich will das nutzen wie bei Drohnen: um rechtzeitig zu sehen, wann die Reichweitengrenze erreicht ist.
Später vielleicht dann, um bei Bedarf einen Satelliten (Wifi-Repeater) abzusetzen.

Die Beispiele, die ich gefunden habe (auch deines, auch die Doku)beziehen sich _immer_ nur auf den Station-Mode.
Da funktioniert das auch...
Wenn ich das aber, wie oben, im AP-Mode benutze, kommt immer "31" heraus, auch dann, wenn ich die externe Antenne abnehme, und das Handy hinter ne Stahlbetonwand lege(wo es, laut einer Wifi-Anzeige-App nur noch -57 dbm hat).

Wenn ich dem Baustein das hier zum nachdenken gebe:

Serial.begin(115200);

int numberOfNetworks = WiFi.scanNetworks();

for(int i =0; i<numberOfNetworks; i++){

Serial.print("Network name: ");
Serial.println(WiFi.SSID(i));
Serial.print("Signal strength: ");
Serial.println(WiFi.RSSI(i));
Serial.println("-----------------------");

bekomme ich ne glaubwürdige Ausgabe:
-----------------------
Network name: FRITZ!Box 7430 BJ
Signal strength: -84
-----------------------

Moppi
17.12.2018, 10:26
WiFi.RSSI zeigt die Signalstärke des Zugangspunktes, wo sich das nodeMCU angemeldet hat.
Baue einen Zugangspunkt mit dem Handy und melde das nodeMCU dort an, dann denke ich, wird WiFi.RSSI funktionieren.
Umgekehrt müsste das Handy die Signalstärke vom Zugangspunkt (was ja dann Dein nodeMCU ist) zeigen.

Ich glaube, ich verstehe Dich noch nicht so ganz - wirst auch schon gemerkt haben.

MfG


PS: bist Du nicht Ski fahren, bei dem Schnee? Liegt doch schon ordentlich.

Klebwax
17.12.2018, 10:35
Das ist möglicherweise nicht so einfach. An einem AP können sich viele Clients anmelden. Die haben natürlich alle eine unterschiedliche Feldstärke. Selbst wenn im Moment des Aufrufs der RSSI-Funktion nur einer angemeldet ist, kann sich jederzeit ein weiterer anmelden. Ohne einen Parameter für die RSSI-Funktion, das den Client angibt, kann es kein brauchbares Ergebniss geben.

- - - Aktualisiert - - -



Soweit funktioniert das auch, nur möchte ich das Ganze bidirektional haben: ein bisschen Telemetrie.
Wie ich Daten an die App so sende, dass ich die dann dort vernünftig anzeigen kann, krieg ich wohl noch raus, aber als erstes hätte ich gerne die Signalstärke der Verbindung angezeigt.

Machs umgekehrt, sende als erste Telemetriedaten die Feldstärke.

MfG Klebwax

Rabenauge
17.12.2018, 11:12
Du meinst sicher, die Verbindungsstärke direkt im Handy auslesen, oder?
Uff- mal gucken ob ich _das_ irgendwie hinkrieg.
Ich hätt die gerne deshalb vom NodeMCU ermittelt, weil der zweifellos die bessere Antenne hat (ne externe)- der kann das Handy sicher noch ne ganze Weile erreichen, wenn das Handy schon längst nicht mehr hin kommt.

Das Problem ist wohl tatsächlich, dass ich nicht weiss, was i hier ist:
WiFi.SSID(i)
wenn das Ding im AP-Modus läuft.Kann man die irgendwie ermitteln? Bekannt sein muss die dem AP ja...Moppi: eigentlich ist es so einfach, wie ich es ganz oben beschrieben hatte: es soll eine Fernsteuerung für nen kleinen (naja, klein..) Roboter werden.
Ich will das Ding per Handy losschicken, und natürlich auch steuern. Da er aber auch draussen unterwegs sein soll, kann es ja leicht passieren, dass er ausser Reichweite gerät- und _das_ wüsst ich gerne _vorher_ , um darauf ggf. angemessen reagieren zu können (eben umdrehen, oder aber nen Repeater absetzen).

Moppi
17.12.2018, 12:41
Ich hatte oben schon Links gepostet, da findet man das so: WiFi.RSSI(wifiAccessPoint);
damit wäre i=wifiAccessPoint.

Würde ich so sagen.

Ich habe noch was dazu gefunden: https://www.researchgate.net/publication/322877438_Estimate_distance_measurement_using_Node MCU_ESP8266_based_on_RSSI_technique
Und hier direkt zum nodeMCU eine Doku: https://nodemcu.readthedocs.io/en/master/en/modules/wifi/

Wenn das mit dem Handy nicht klappt, kann man ja ein Reichweitenmeßgerät mit einem zweiten nodeMCU bauen, dass dann mit RSSI die Qualtät/Signalstärke von dem Access Point des nodeMCU betimmt, an dem Du dich mit dem Handy anmeldest.


Das Problem ist, dass mit WiFi.RSSI(); die Signalstärke bestimmt wird, wenn Du zuvor mit dem nodeMCU in einem Netz drin bist. So habe ich das jedenfalls verstanden.

Ich beziehe mich mal auf: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266WiFi/examples/WiFiScan/WiFiScan.ino

Zuerst wird nach Netzwerken gesucht mit: WiFi.scanNetworks(); - hier wird die Anzahl der Netzwerke zurückgegeben, die gefunden wurde.
Dann kann man mit: WiFi.SSID(i) und WiFi.RSSI(i) die Netzwerk-ID und Signalstärke anzeigen lassen. Wobei >>i<< eine Nummer von 0 bis zu der zuvor ermittelten Anzahl an Netzwerken ist.
Man kann über >>i<< als Index per WiFi.SSID(i) die SSID des Netzwerks suchen, für das man die Signalstärke wissen möchte und fragt diese dann mit WiFi.RSSI(i) ab.

Also das wäre meine Idee dazu.

MfG