Wie erkenne ich ein mobiles Gerät, wenn es eine Verbindung zu einem WLAN-Heimnetzwerk herstellt?

10

Wie kann ein Server am besten erkennen, wenn ein bestimmtes mobiles Gerät (Mobiltelefon, iPad usw.) eine Verbindung zum Netzwerk herstellt (natürlich drahtlos)?

Als Beispielsituation hat eine Person ihr WLAN-Heimnetzwerk ordnungsgemäß auf ihrem Mobiltelefon konfiguriert. Wenn er sich in Reichweite des Routers befindet, wird eine Verbindung hergestellt (nichts Neues). Bei Verbindung mit diesem Router würde sein Heimserver ein bestimmtes Programm starten (oder eine Benachrichtigung auslösen, in eine Datei schreiben usw.).

Ich dachte, dass eine mögliche Lösung eine im Netzwerk gehostete benutzerdefinierte "Web-App" sein würde, die vom Telefon aus gestartet wird, damit der Server erkennt, dass die Seite aufgerufen wurde. Wenn dies jedoch möglich ist, wenn das Telefon automatisch eine Verbindung herstellt, ist dies am besten.

Alle Gedanken oder alternative Lösungen wären sehr dankbar, also danke im Voraus!

Ivan I.
quelle
Wenn es sich um ein Android-Handy handelt, ist es am einfachsten, eine lokale Website zu besuchen. Um dies von der Netzwerkseite aus zu tun, müssten Sie das RADIUS-Protokoll verwenden und über einen ordnungsgemäß eingerichteten RADIUS-Server verfügen.
Huckle
Überprüfen Sie einfach Ihre Router-Protokolle. Da diese Protokolle textbasiert sind, ist es einfach, die Protokolle abzufragen und nur die Informationen abzurufen, die Sie benötigen. Sicherlich hat jemand den Code dafür geschrieben, aber wenn nicht, wäre es eine einfache Übung.

Antworten:

4

Ich denke, das kann leicht erreicht werden durch arp-scan.

Installieren arp-scan: sudo apt-get install arp-scan
Ermitteln Sie alle Hosts im lokalen Netzwerk:sudo arp-scan -l

Sie können eine Crontab so einrichten, dass sie regelmäßig (möglicherweise alle 2 Minuten) ein Skript ausführt, das das Netzwerk mit Arp-Scan durchsucht und dessen Ausgabe analysiert, um die aktiven Hosts zu ermitteln.

Manchmal brauchte ich die -r 3Flagge, die dreimal läuft; funktioniert viel besser als die Standardeinstellung 2 mal, bei der manchmal einige Geräte fehlen. Somit:

 sudo arp-scan -l -r 3 | grep {Phone Static Assigned IP} 

funktioniert besser für mich zu LG V30 +.

Eric Carvalho
quelle
Es ist zu beachten, dass einige Geräte möglicherweise nur angezeigt werden, wenn sie eingeschaltet sind. Mein Nexus 4 wird erst angezeigt, wenn der Bildschirm eingeschaltet ist.
Nicolas Bouliane
3
import subprocess

if __name__ == '__main__':
    while True:
        sleep(5)
        p = subprocess.Popen("arp-scan -l | grep xx:xx:xx:xx:xx:xx", stdout=subprocess.PIPE, shell=True)
        (output, err) = p.communicate()
        p_status = p.wait()
        if output:
            print "Yay, the devine is connected to your network!"
        else:
            print "The device is not present!"

Auf diese Weise können Sie nach dem MAC Ihres Geräts suchen :)

ZaBiC
quelle
2

Ich denke tatsächlich darüber nach, eine Lösung dafür zu implementieren, die die folgenden Anforderungen erfüllt:

  1. Das Telefon muss keine IP-Adresse im Netzwerk zugewiesen haben.
  2. Das Telefon muss nicht regelmäßig Signale senden, die den Akku entladen würden.
  3. Wenn sich viele Telefone im Netzwerk befinden, werden alle erkannt.

Meine Absicht ist es, das Dateisystem des Telefons mit ssh zu mounten, aber es kann für alles verwendet werden.

Angenommen, das lokale Netzwerk ist 192.168.1.0 ...

Ich würde also eine APP implementieren, die UDP-Broadcasts von der Broadcast-Adresse abhört : 192.168.1.255. Diese App würde den Akku nicht entladen, da sie völlig passiv ist. (Es wird nur aktiv, wenn ein Paket empfangen wird.)

Ein Daemon auf dem Computer sendet regelmäßig Broadcasts an die Broadcast-Adresse 192.168.1.255. Das Telefon antwortet auf solche Signale mit seinem Namen, seiner ID, seiner IP-Adresse usw.

Jetzt weiß der Computer, dass das Telefon im Netzwerk vorhanden ist und kann in meinem Fall sshfs mount aufrufen.

Dies erfordert sicherlich viel Arbeit, einschließlich Programmierarbeit, und ist nicht einfach. Aber ich denke, es wäre die zuverlässigste und vernünftigste Lösung.

d_inevitable
quelle
1
Wow, also im Grunde ein benutzerdefiniertes Protokoll ... man würde denken, dass es so etwas schon geben würde.
Michael
1

Der beste Weg, den ich mir vorstellen kann, besteht darin, dem Gerät eine statische IP-Adresse zu geben und das Gerät mit einem einfachen Skript alle X Sekunden zu pingen und Ihr Programm / Ihre Benachrichtigung auszulösen.

Zu beachtende Dinge: Viele Telefone stellen erst nach dem Aufwachen aus dem Ruhezustand eine Verbindung zum WLAN-Netzwerk her. Ihr Skript muss in der Lage sein, den Unterschied zwischen dem Einschlafen des Telefons und dem Verlassen des Hauses zu erkennen, möglicherweise unter Berücksichtigung der Tageszeit. Danach ist es trivial, wenn das Skript ein Programm zum Ausführen auslöst oder eine Benachrichtigung angezeigt wird.

Jeff Welling
quelle
0

Ich habe ein Skript geschrieben, das mit Arp-Scan und einer statischen IP-Adresse auf einem iPhone etwas Ähnliches macht.

Den Code finden Sie hier: https://github.com/blackairplane/pydetect

Es muss aufgeräumt werden, da ich neu in Python bin, aber ich denke, es veranschaulicht das Konzept.

JamieHoward
quelle
0

Ich stolperte darüber und als ich einmal etwas Ähnliches tat, beschloss ich, eine Antwort zu posten.

Ich habe folgendes gemacht:

1. Ping all addresses within given network and subnet (excluding network and broadcast addresses)
2. Wait for response has a timeout so that if device doesn't answer from furthest corner of your WiFi it is considered not present.
3. So we get all IPs on the net that answer to ICMP packets.
4. Then use each detected IP to ask for more and decide which device you like and which one you don't.

In meinem Fall lief auf meinem Gerät ein HTTP-Server. Also habe ich gerade eine HTTP-HEAD-Anfrage für praktisch nichts an Port 80 gesendet. Wenn das Gerät geantwortet hat und der Server-Header richtig benannt ist, ist dies mein Gerät.

Aber ich konnte nicht schnell gehen, ohne vorher zu pingen. HTTP ist TCP und die Anfrage ist groß, daher müssen die Zeitüberschreitungen für WiFi 4 Sekunden betragen. Dies für 253 Adressen zu tun ist höllisch langsam. Aber Sie hätten nicht 253 Geräte (wahrscheinlich) mehr weniger HTTP-Server. (oder in Ihrem Fall Telefone)

Das Betrachten von Router-Protokollen ist eine sehr gute Idee und einfach. Und noch schneller als alle zu pingen. Einige Router müssen sich nicht einmal anmelden, um zu ihnen zu gelangen.

Es lohnt sich auch zu prüfen, ob Ihr Gerät UPNP-Unterstützung bietet. In diesem Fall können Sie UPNP verwenden, um das Vorhandensein zu erkennen. Dies wäre eine offizielle Lösung (Abhören von UDPs von UPNP). Aber alle Geräte unterstützen es nicht. Aber nicht alle Geräte unterstützen auch ICMP. (Sie wollen nicht unnötig bombardiert werden).

Es gibt noch eine andere interessante Möglichkeit. Sie können nach DHCP-Paketen suchen und sehen, wann ein Router einem neuen Gerät eine IP-Adresse gibt. Dies würde jedoch nicht für Geräte mit statischen IPs funktionieren. Sie würden das Netzwerk erst berühren, wenn sie etwas brauchen. Die Verbindung zu WiFi selbst befindet sich auf einer anderen Ebene und kann nur dann leicht erkannt werden, wenn Sie als Sniffer fungieren möchten. Ich bin mir nicht sicher, ob es mit einem Netzwerkadapter in einem vielversprechenden Modus machbar ist. Ich denke, dafür wäre zusätzliche Hardware erforderlich.

Um Ping in Python zu erreichen, ohne das Ping-Programm zu unterarbeiten und an Geschwindigkeit zu verlieren, müssen Sie einen Raw-Socket erstellen und das ICMP-Paket manuell erstellen. Es ist nicht schwer. Irgendwo im Web gibt es ein Beispiel dafür. Zum Senden benötigen Sie natürlich Root-Berechtigungen, ebenso wie der Ping. Dies ist ein Nachteil. Wenn Sie die Software verteilen, können Sie nicht erwarten, dass Benutzer sie als Root ausführen möchten.

Dalen
quelle
0

Ich hatte zwei Lösungen, die ich verwendet habe. (Python)

Lösung 1

Das erste war, bekannte IP-Nummern zu arping, die ich verfolgen möchte. Ich habe das in drei Schritten gemacht. 1 # Verwenden Sie "-c1", um nur einen Ping zu senden. Wenn das Gerät aktiv ist, antwortet es und. Die Funktion wird mit Erfolg beendet. 2 # Verwenden Sie "-c3". Geben Sie jetzt mehr Zeit, um auf eine von drei Antworten zu antworten. Dies ist normalerweise ausreichend, wenn es sich um ein schlechtes WLAN-Signal handelt. 3 # Verwenden Sie "-c10". Dies kann erforderlich sein, wenn das WLAN-Signal wirklich schlecht ist. (Es wurde festgestellt, dass das alte iPad etwa 10 Versuche benötigt, um zu antworten.) Um die Arbeit zu beschleunigen, habe ich für jede IP-Nummer, die ich verfolgen möchte, separate Prozesse erstellt.

Ich habe auch die Ping-Intervalle geändert, je nachdem, ob es erfolgreich ist oder nicht. Wenn das Gerät gefunden wird, wartet es länger, bis es erneut überprüft wird. Wenn es ein Fehler ist, wird es in 60 Sekunden erneut versucht. (Ich möchte, dass das Licht an ist, wenn ich mein Haus betrete.) 60er Jahre reichen also aus, um mich auf der Straße zu finden

Das hat perfekt funktioniert! Als ich nach Hause kam, spürte es mich und machte das Licht aus und aus, als ich ging.

Lösung 2

Arping ist im Netzwerk möglicherweise nicht sehr schwer, aber ich habe die Lösung geändert, um alle Pings zu überspringen, und auf meinem Himbeer-Pi einen eigenen DHCP-Server erstellt.

Ich habe dann "on commit" hinzugefügt, das ein Skript auslöst, sobald ein Gerät eine IP-Nummer erhält. Dieses Skript verwendet einen "Curl http API-Aufruf", um meinen WWW-Server (Flask) zu benachrichtigen, sobald ein Gerät seine IP-Nummer erhält oder erneuert.

Auf meinem Android habe ich die Einstellungen so geändert, dass WLAN bei ausgeschaltetem Bildschirm niemals ausgeschaltet wird. Ich bin mir nicht sicher, ob es auf dem iPhone möglich ist. Kein großer Unterschied bei der Batterie (OnePlus 5)

Die erste Lösung umfasste auch das Bluetooth-Scannen für einen bestimmten Mac. Selbst wenn mein WLAN auf meinem Telefon ausgeschaltet ist, wird Bluetooth weiterhin erkannt. Die Verwendung der Mac-Adresse muss nicht gekoppelt oder für alle sichtbar sein.

Christian Grenfeldt
quelle