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ę!
źródło
Odpowiedzi:
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 3
flagi, która uruchamia ją trzy razy; działa znacznie lepiej niż domyślnie 2 razy, czasem brakuje niektórych urządzeń. A zatem:działa lepiej dla mnie do LG V30 +.
źródło
W ten sposób możesz wyszukać MAC swojego urządzenia :)
źródło
Zastanawiam się nad wdrożeniem rozwiązania spełniającego następujące wymagania:
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.
źródło
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.
źródło
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.
źródło
Natknąłem się na to i jak kiedyś zrobiłem coś podobnego, postanowiłem opublikować odpowiedź.
Zrobiłem następujące:
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.
źródło
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.
źródło