Як виявити мобільний пристрій під час підключення до домашньої мережі Wi-Fi?


10

Що було б найкращим способом розпізнати сервер, коли певний мобільний пристрій (стільниковий телефон, iPad тощо) підключається до мережі (бездротово, звичайно)?

Як приклад ситуації, людина має свою домашню мережу Wi-Fi належним чином налаштована на своєму мобільному телефоні. Коли він потрапить у зону дії маршрутизатора, він підключиться (нічого нового в цьому немає). Після підключення до цього маршрутизатора його домашній сервер запустить певну програму (або викине сповіщення, запише у файл тощо).

Я думав, що можливим рішенням може бути мережевий користувальницький "веб-додаток", який запускатиметься з телефону, щоб сервер розпізнавав сторінку, яку називали. Однак якщо це можна зробити, коли телефон підключається автоматично, це було б найкраще.

Будь-які думки чи альтернативні рішення будуть дуже вдячні, тому заздалегідь дякую!


Якщо це андроїд-телефон, робота з хроніки на місцевому веб-сайті буде найпростішою. Щоб зробити це з мережевої сторони, вам доведеться використовувати протокол RADIUS та мати належним чином налаштований сервер RADIUS.
Геккл

Чому б просто не переглянути свої журнали маршрутизаторів. Оскільки ці журнали є текстовими, було б легко запитувати журнали та отримувати лише потрібну інформацію. Звичайно, хтось написав код для цього, але якщо ні, то це було б простою вправою.

Відповіді:


4

Я думаю, що це можна легко досягти arp-scan.

Встановити arp-scan: sudo apt-get install arp-scan
виявити всіх хостів у локальній мережі:sudo arp-scan -l

Ви можете налаштувати crontab, щоб періодично (кожні 2 хвилини) запускати сценарій, який сканує мережу за допомогою arp-сканування та аналізує його вихід, щоб виявити активних хостів.

Іноді мені потрібен був -r 3прапор, який його тричі триває; працює набагато краще, ніж за замовчуванням у 2 рази, які іноді пропускають деякі пристрої. Таким чином:

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

для мене краще працює LG V30 +.


Слід зазначити, що деякі пристрої можуть не відображатися, якщо вони не увімкнено. Мій зв’язок 4 не з’явиться, якщо екран не увімкнено.
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!"

Таким чином ви можете сканувати MAC свого пристрою :)


2

Я насправді задумуюсь реалізувати для цього рішення, яке відповідає наступним вимогам:

  1. Телефон не повинен мати призначену IP-адресу в мережі.
  2. Телефон не потребує періодичної розсилки сигналів, які б розряджали його акумулятор.
  3. Якщо в мережі є багато телефонів, усі вони будуть виявлені.

Мій намір - встановити файлову систему телефонів за допомогою ssh, але її можна використовувати для будь-якого.

Скажімо, локальна мережа 192.168.1.0 ...

Тому я хотів би реалізувати програму , яка прослуховує UDP віщає з широкомовної адреси: 192.168.1.255. Ця програма не розряджатиме акумулятор, оскільки він повністю пасивний. (він стає активним лише після отримання пакету).

Демон на комп’ютері періодично надсилатиме трансляції на адресу мовлення 192.168.1.255. Телефон відповість на такі сигнали, вказавши своє ім’я, ідентифікатор, ip-адресу тощо.

Тепер комп’ютер знає, що телефон існує в мережі, і в моєму випадку може викликати кріплення sshfs.

Звичайно, це потребує великої роботи, включаючи роботу з програмування, і це непросто. Але я думаю, це було б найбільш надійним і розумним рішенням.


1
Нічого так, звичайно нестандартний протокол ... можна було б подумати, що щось подібне вже існує.
Михайло

1

Найкращий спосіб, який я можу придумати, - це надавати вказаному пристрою статичну IP-адресу та використовувати простий скрипт, щоб пінг пристрою кожні X секунд та запускав програму / сповіщення.

Що слід зазначити: Багато телефонів не підключаться до мережі Wi-Fi, поки не прокинуться зі сну. Ваш сценарій повинен мати можливість визначити різницю між телефоном, який лягає спати, і телефоном, який виходить з дому, можливо, враховуючи час доби. Після цього наявність запуску скрипту для запуску програми або повідомлення з’являється тривіально.


0

Я написав сценарій, який робить щось подібне, використовуючи Arp-сканування та статичну IP-адресу на iPhone.

Ви можете знайти код тут: https://github.com/blackairplane/pydetect

Це потрібно очистити, оскільки я новачок у Python, але я думаю, що це ілюструє концепцію.


0

Я наткнувся на це, і коли я робив щось подібне, вирішив опублікувати відповідь.

Я зробив наступне:

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.

У моєму випадку на моєму пристрої був запущений сервер HTTP. Тож я щойно надіслав запит HTTP HEAD практично нічого на порт 80. Якщо пристрій відповів і заголовок Сервера правильно названий, то це мій пристрій.

Але я не міг швидко піти, не спочатку пінг. HTTP - це TCP, а запит великий, тому час очікування повинен бути 4 секунди для WiFi. Робити це для 253 адрес повільно, як пекло. Але у вас не було б 253 пристроїв (напевно) більше HTTP-серверів. (або у вашому випадку, телефони)

Розгляд журналів маршрутизаторів - це дуже гарна ідея та легкість. І навіть швидше, ніж пінггінг усіх. Деякі маршрутизатори навіть не потребують входу в систему, щоб дістатися до них.

Крім того, варто перевірити, чи підтримує ваш пристрій UPNP. Якщо це так, ви можете використовувати UPNP для виявлення його присутності. Це було б офіційним рішенням (прослуховування в ефірі для UDPs UPNP). Але всі пристрої це не підтримують. Але всі пристрої також не підтримують ICMP. (вони не хочуть бомбардуватися без потреби).

Є ще одна цікава можливість. Ви можете ловити DHCP-пакети і бачити, коли маршрутизатор надає новому пристрою IP-адресу. Але це не працює для пристроїв зі статичним IP-адресою. Вони навіть не торкнуться мережі, поки їм щось не знадобиться. Підключення до самого Wi-Fi знаходиться на іншому шарі, і його неможливо легко виявити, якщо ви не хочете діяти як снайпер. Я не впевнений, навіть якщо це можливо з мережевим адаптером у безладному режимі. Я думаю, для цього знадобиться додаткове обладнання.

Щоб досягти ping в Python, не підробляючи програму ping і не втрачаючи швидкості, вам доведеться створити необроблений сокет і сконструювати пакет ICMP вручну. Це не важко. Є приклад цього десь в Інтернеті. Звичайно, для його надсилання вам знадобляться права доступу до root, як і ping. Це недолік. Якщо ви поширите програмне забезпечення, ви не можете очікувати, що користувачі захочуть запустити його як root.


0

У мене було два рішення, якими я користувався. (Пітон)

Рішення 1

Спочатку було скласти відомі ipnumbers, які я хочу відстежити. Я зробив це в три кроки. 1 # використовуйте "-c1", щоб надіслати лише один ping. Якщо пристрій активний, він відповість і. Функція завершиться з успіхом. 2 # використання "-c3" тепер надасть їй більше часу для відповіді на один із трьох. Зазвичай цього достатньо, коли це поганий сигнал Wi-Fi. 3 # використання "-c10" це може знадобитися, коли це дійсно поганий сигнал Wi-Fi. (Помітив, що старий iPad потребує приблизно 10 спроб відповісти) Для прискорення речей я створив окремі процеси для кожного ip-номера, який я хочу відстежувати.

Я також змінив інтервали пінгвінгу залежно від успіху чи ні. Якщо він знайде пристрій, він буде чекати довше, поки він ще раз перевірить. Якщо це невдача, вона спробує знову через 60 секунд. (Я хочу, щоб світло ввімкнуло, коли я заходжу додому), тому 60-х вистачає, щоб знайти мене на вулиці

Це спрацювало чудово! Коли я повернувся додому, він відчув мене і вимкнув світло, і вимкнув, коли я пішов.

Рішення 2

Арпінг може бути не надто важким у мережі, але я змінив рішення, щоб пропустити всі пінг-файли і створив власний сервер DHCP на своєму малиновому пі.

Потім я додав "на фіксацію", який запускає сценарій, як тільки пристрій отримує ipnumber. Цей скрипт використовує "завиток http виклику API", щоб сповістити мій www-сервер (колбу), як тільки пристрій отримає або оновить його ipnumber.

На своєму Android я змінив налаштування, щоб ніколи не вимикати Wi-Fi, коли екран вимкнено. Не впевнений, чи можливо це на iPhone. Немає великої різниці в акумуляторі (OnePlus 5)

Перше рішення також включало сканування Bluetooth для конкретного Mac. Тож навіть якщо мій WiFi вимкнено на моєму телефоні, він все одно відчує Bluetooth. Використовуючи Mac-адресу, не потрібно її з'єднувати або мати доступну для всіх.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.