Jak wykryć urządzenie mobilne, gdy łączy się z domową siecią Wi-Fi?

10

Jaki byłby najlepszy sposób, aby serwer rozpoznał, gdy określone urządzenie mobilne (telefon komórkowy, iPad itp.) Łączy się z siecią (oczywiście bezprzewodowo)?

Na przykład osoba ma poprawnie skonfigurowaną domową sieć Wi-Fi na swoim telefonie komórkowym. Gdy znajdzie się w zasięgu routera, łączy się (nic nowego na ten temat). Po podłączeniu do tego routera jego serwer macierzysty uruchomi określony program (lub wyśle ​​powiadomienie, zapisze do pliku itp.).

Pomyślałem, że możliwym rozwiązaniem będzie niestandardowa „aplikacja sieciowa” hostowana w sieci, która zostanie uruchomiona z telefonu, aby serwer rozpoznał, że strona została wywołana. Jeśli jednak można to zrobić, gdy telefon łączy się automatycznie, byłoby najlepiej.

Wszelkie przemyślenia i alternatywne rozwiązania będą mile widziane, więc z góry dziękuję!

Ivan I.
źródło
Jeśli jest to telefon z Androidem, najłatwiejszym zadaniem byłoby załatwienie lokalnej witryny internetowej. Aby to zrobić od strony sieci, musisz użyć protokołu RADIUS i mieć poprawnie skonfigurowany serwer RADIUS.
Huckle
Dlaczego nie po prostu przejrzeć dzienniki routera. Ponieważ te dzienniki są oparte na tekście, łatwo byłoby wyszukiwać je i uzyskiwać tylko potrzebne informacje. Z pewnością ktoś napisał kod, aby to zrobić, ale jeśli nie, byłoby to proste ćwiczenie.

Odpowiedzi:

4

Myślę, że można to łatwo osiągnąć arp-scan.

Zainstaluj arp-scan: sudo apt-get install arp-scan
Wykryj wszystkie hosty w sieci lokalnej:sudo arp-scan -l

Możesz skonfigurować crontab, aby okresowo (co 2 minuty) mógł uruchamiać skrypt, który skanuje sieć za pomocą arp-scan i analizuje jego wyniki w celu wykrycia aktywnych hostów.

Czasami potrzebowałem -r 3flagi, która uruchamia ją trzy razy; działa znacznie lepiej niż domyślnie 2 razy, czasem brakuje niektórych urządzeń. A zatem:

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

działa lepiej dla mnie do LG V30 +.

Eric Carvalho
źródło
Należy zauważyć, że niektóre urządzenia mogą się nie pojawiać, chyba że są włączone. Mój nexus 4 nie pojawi się, chyba że ekran jest włączony.
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!"

W ten sposób możesz wyszukać MAC swojego urządzenia :)

ZaBiC
źródło
2

Zastanawiam się nad wdrożeniem rozwiązania spełniającego następujące wymagania:

  1. Telefon nie musi mieć przypisanego adresu IP w sieci.
  2. Telefon nie musi okresowo wysyłać sygnałów, które rozładowałyby jego baterię.
  3. Jeśli w sieci jest wiele telefonów, wszystkie zostaną wykryte.

Moim zamiarem jest zamontowanie systemu plików telefonu za pomocą ssh, ale można go używać do wszystkiego.

Powiedzmy, że sieć lokalna to 192.168.1.0 ...

Więc chciałbym wdrożyć aplikację, która słucha UDP transmituje z adresu broadcast: 192.168.1.255. Ta aplikacja nie rozładowuje baterii, ponieważ jest całkowicie pasywna. (staje się aktywny dopiero po odebraniu pakietu).

Demon na komputerze będzie okresowo wysyłać transmisje na adres emisji 192.168.1.255. Telefon odpowie na takie sygnały, podając swoją nazwę, identyfikator, adres IP itp.

Teraz komputer wie, że telefon istnieje w sieci i w moim przypadku może wywołać sshfs mount.

Z pewnością wymaga to dużo pracy, w tym programowania, i nie jest łatwe. Myślę jednak, że byłoby to najbardziej niezawodne i rozsądne rozwiązanie.

d_inevitable
źródło
1
Wow, więc w zasadzie niestandardowy protokół ... można by pomyśleć, że już istnieje coś takiego.
Michael
1

Najlepszy sposób, jaki mogę wymyślić, to nadanie temu urządzeniu statycznego adresu IP i użycie prostego skryptu do pingowania urządzenia co X sekund i wyzwalania programu / powiadomienia.

Ważne uwagi: wiele telefonów nie połączy się z siecią Wi-Fi, dopóki nie obudzisz się ze snu. Twój skrypt będzie musiał rozpoznać różnicę między telefonem do snu a telefonem wychodzącym z domu, być może biorąc pod uwagę porę dnia. Następnie uruchomienie skryptu w celu uruchomienia programu lub wyświetlenia powiadomienia jest banalne.

Jeff Welling
źródło
0

Napisałem skrypt, który robi coś podobnego za pomocą arp-scan i statycznego adresu IP na iPhonie.

Kod można znaleźć tutaj: https://github.com/blackairplane/pydetect

Musi zostać oczyszczony, ponieważ jestem nowy w Pythonie, ale myślę, że ilustruje to pojęcie.

JamieHoward
źródło
0

Natknąłem się na to i jak kiedyś zrobiłem coś podobnego, postanowiłem opublikować odpowiedź.

Zrobiłem następujące:

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.

W moim przypadku na moim urządzeniu działał serwer HTTP. Właśnie wysłałem żądanie HTTP HEAD w zasadzie o nic na porcie 80. Jeśli urządzenie odpowiedziało, a nagłówek serwera został poprawnie nazwany, to jest to moje urządzenie.

Ale nie mogłem iść szybko bez pingowania. HTTP to TCP, a żądanie jest duże, dlatego limity czasu muszą wynosić 4 sekundy dla WiFi. Robienie tego dla 253 adresów jest powolne jak diabli. Ale nie byłoby 253 urządzeń (prawdopodobnie) mniej serwerów HTTP. (lub w twoim przypadku telefony)

Rozpatrywanie dzienników routera jest bardzo dobrym pomysłem i łatwe. A nawet szybciej niż pingowanie wszystkich. Niektóre routery nawet nie wymagają logowania, aby się do nich dostać.

Warto również sprawdzić, czy Twoje urządzenie obsługuje UPNP. Jeśli tak, możesz użyć UPNP do wykrycia jego obecności. Byłoby to oficjalne rozwiązanie (słuchanie w transmisji dla UDP UPNP). Ale wszystkie urządzenia go nie obsługują. Ale wszystkie urządzenia nie obsługują również ICMP. (nie chcą niepotrzebnie bombardować).

Jest jeszcze jedna interesująca możliwość. Możesz wyszukiwać pakiety DHCP i sprawdzać, kiedy router nadaje nowemu urządzeniu adres IP. Nie działałoby to jednak w przypadku urządzeń ze statycznymi adresami IP. Nie dotkną nawet sieci, dopóki czegoś nie będą potrzebować. Samo połączenie z Wi-Fi odbywa się na innej warstwie i nie można go łatwo wykryć, chyba że chcesz działać jako sniffer. Nie jestem pewien, nawet jeśli jest to wykonalne z kartą sieciową w trybie promisquous. Myślę, że do tego potrzebny byłby dodatkowy sprzęt.

Aby uzyskać ping w Pythonie, bez podprocesowania programu ping i utraty prędkości, musisz utworzyć surowe gniazdo i ręcznie zbudować pakiet ICMP. To nie jest trudne. Jest to przykład gdzieś w sieci. Oczywiście, aby go wysłać, potrzebujesz uprawnień roota, podobnie jak ping. To jest wada. Jeśli rozpowszechnisz oprogramowanie, nie możesz oczekiwać, że użytkownicy będą chcieli go uruchamiać jako root.

Dalen
źródło
0

Miałem dwa rozwiązania, z których korzystałem. (Pyton)

Rozwiązanie 1

Pierwszym było zbieranie znanych numerów IP, które chcę śledzić. Zrobiłem to w trzech krokach. 1 # użyj „-c1”, aby wysłać tylko jeden ping. Jeśli urządzenie jest aktywne, odpowie i. Funkcja zakończy działanie z sukcesem 2 # użyj „-c3”, teraz daje więcej czasu na odpowiedź na jedną z trzech. Zazwyczaj wystarcza to, gdy jest słaby sygnał Wi-Fi. 3 # użyj „-c10”, może to być potrzebne, gdy jest to naprawdę zły sygnał Wi-Fi. (Zauważyłem, że stary iPad potrzebuje około 10 prób odpowiedzi) Aby przyspieszyć rzeczy, stworzyłem osobne procesy dla każdego numeru ip, który chcę śledzić.

Zmieniłem również interwały pingowania w zależności od tego, czy to sukces, czy nie. Jeśli znajdzie urządzenie, będzie czekać dłużej, aż sprawdzi ponownie. W przypadku niepowodzenia spróbuje ponownie za 60 sekund. (Chcę zapalić światło, kiedy wchodzę do domu), więc lata 60. wystarczą, by znaleźć mnie na ulicy

To działało idealnie! Kiedy wróciłem do domu, wyczułem mnie, zgasiłem światło i zgasłem, kiedy wyszedłem.

Rozwiązanie 2

Arping może nie być ciężki w sieci, ale zmieniłem rozwiązanie, aby pominąć wszystkie pingi i utworzyłem własny serwer DHCP na moim Raspberry Pi.

Następnie dodałem „przy zatwierdzeniu”, który uruchamia skrypt, gdy tylko urządzenie otrzyma numer ip. Ten skrypt używa „curl http API API”, aby powiadomić mój serwer www (Flask), gdy tylko urządzenie otrzyma lub odnowi swój numer ip.

Na moim Androidzie zmieniłem ustawienia, aby nigdy nie wyłączać Wi-Fi, gdy ekran jest wyłączony. Nie jestem pewien, czy jest to możliwe na iPhonie. Bez dużej różnicy na baterii (OnePlus 5)

Pierwsze rozwiązanie obejmowało również skanowanie Bluetooth dla konkretnego komputera Mac. Więc nawet jeśli moje Wi-Fi jest wyłączone w moim telefonie, nadal wykrywa Bluetooth. Używanie adresu Mac nie wymaga parowania ani udostępniania go wszystkim.

Christian Grenfeldt
źródło