Как обнаружить мобильное устройство, когда оно подключается к домашней сети Wi-Fi?

10

Каков наилучший способ, позволяющий серверу распознавать, когда конкретное мобильное устройство (мобильный телефон, iPad и т. Д.) Подключается к сети (конечно, по беспроводной сети)?

В качестве примера можно привести правильную настройку домашней сети Wi-Fi на своем мобильном телефоне. Когда он попадает в зону действия маршрутизатора, он подключается (ничего нового в этом нет). После подключения к этому маршрутизатору его домашний сервер запустит определенную программу (или выдаст уведомление, запишет в файл и т. Д.).

Я подумал, что возможным решением было бы размещенное в сети пользовательское «веб-приложение», которое будет запускаться с телефона, чтобы сервер распознал, что страница была вызвана. Однако, если это можно сделать при автоматическом подключении телефона, это будет лучше.

Любые мысли или альтернативные решения будут с благодарностью, так что спасибо заранее!

Иван Иванович
источник
Если это телефон на базе Android, проще всего будет заняться cron-работой и создать локальный веб-сайт. Чтобы сделать это со стороны сети, вам нужно будет использовать протокол RADIUS и правильно настроить сервер RADIUS.
Huckle
Почему бы просто не просмотреть журналы вашего роутера. Поскольку эти журналы основаны на тексте, было бы легко запросить журналы и получить только ту информацию, которая вам нужна. Конечно, кто-то написал код для этого, но если нет, то это будет простое упражнение.

Ответы:

4

Я думаю, что это может быть легко достигнуто arp-scan.

Установить arp-scan: sudo apt-get install arp-scan
Определить все хосты в локальной сети:sudo arp-scan -l

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

Иногда мне нужен -r 3флаг, который запускает его три раза; работает намного лучше по умолчанию 2 раза, что иногда пропускает некоторые устройства. Таким образом:

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

у меня лучше работает на LG V30 +.

Эрик Карвалью
источник
Следует отметить, что некоторые устройства могут не отображаться, если они не включены. Мой Nexus 4 не будет отображаться, если экран не включен.
Николас Булиан
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 своего устройства :)

ZaBiC
источник
2

На самом деле я собираюсь реализовать решение для этого, которое отвечает следующим требованиям:

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

Мое намерение состоит в том, чтобы смонтировать файловую систему телефонов с помощью ssh, но она может использоваться для чего угодно.

Допустим, локальная сеть 192.168.1.0 ...

Поэтому я хотел бы реализовать приложение , которое прослушивает UDP вещает из широковещательного адреса: 192.168.1.255. Это приложение не будет разряжать батарею, поскольку оно полностью пассивно. (активируется только при получении пакета).

Демон на компьютере будет периодически отправлять широковещательные сообщения на широковещательный адрес 192.168.1.255. Телефон ответит на такие сигналы, указав свое имя, идентификатор, IP-адрес и т. Д.

Теперь компьютер знает, что телефон существует в сети, и для моего случая может вызвать sshfs mount.

Конечно, это требует много работы, включая программирование, и это не просто. Но я думаю, что это будет самое надежное и разумное решение.

d_inevitable
источник
1
Вау, так что в основном пользовательский протокол ... можно подумать, что уже будет что-то подобное.
Майкл
1

Лучший способ, о котором я могу подумать, - это присвоить указанному устройству статический IP-адрес и использовать простой сценарий для проверки связи с устройством каждые X секунд и запуска вашей программы / уведомления.

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

Джефф Веллинг
источник
0

Я написал скрипт, который делает нечто подобное, используя arp-scan и статический IP-адрес на iPhone.

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

Это нужно исправить, поскольку я новичок в Python, но я думаю, что это иллюстрирует концепцию.

JamieHoward
источник
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 для обнаружения его присутствия. Это было бы официальным решением (прослушивание в широковещательном режиме для UDP UPNP). Но все устройства не поддерживают это. Но все устройства также не поддерживают ICMP. (они не хотят, чтобы их бомбардировали без необходимости).

Есть еще одна интересная возможность. Вы можете ловить DHCP-пакеты и видеть, когда маршрутизатор дает новому устройству IP-адрес. Но это не будет работать для устройств со статическими IP-адресами. Они даже не будут касаться сети, пока им что-нибудь не понадобится. Подключение к Wi-Fi само по себе находится на другом уровне и не может быть легко обнаружено, если вы не хотите действовать как сниффер. Я не уверен, даже если это выполнимо с сетевым адаптером в случайном режиме. Я думаю, что для этого потребуется дополнительное оборудование.

Чтобы достичь ping в Python, не обрабатывая программу ping и не теряя скорости, вы должны создать необработанный сокет и создать ICMP-пакет вручную. Это не сложно. Пример этого есть где-то в сети. Конечно, чтобы отправить его, вам понадобятся права доступа root, как и ping. Это недостаток. Если вы будете распространять программное обеспечение, вы не можете ожидать, что пользователи захотят запускать его как root.

Дален
источник
0

У меня было два решения, которые я использовал. (Python)

Решение 1

Сначала нужно было записать известные ipnumbers, которые я хочу отслеживать. Я сделал это в три этапа. 1 # используйте «-c1», чтобы отправить только один ping. Если устройство активно, оно ответит и. Функция завершится с успехом 2 # используйте «-c3», теперь дайте ей больше времени для ответа на один из трех. Этого обычно достаточно, когда это плохой сигнал Wi-Fi. 3 # используйте «-c10», это может понадобиться, когда это действительно плохой сигнал Wi-Fi. (Заметил, что старому iPad нужно около 10 попыток ответить) Чтобы ускорить процесс, я создал отдельные процессы для каждого ip-номера, который я хочу отслеживать.

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

Это сработало отлично! Когда я вернулся домой, он почувствовал меня, выключил свет и выключился, когда я ушел.

Решение 2

Возможно, Arping не сильно загружен в сети, но я изменил решение, чтобы пропустить все запросы, и создал свой собственный DHCP-сервер на моем raspberry pi.

Затем я добавил «on commit», который запускает скрипт, как только устройство получает ipnumber. В этом сценарии используется вызов curl http API для уведомления моего www-сервера (Flask), как только устройство получает или обновляет свой ipnumber.

На моем Android я изменил настройки, чтобы никогда не выключать Wi-Fi, когда экран выключен. Не уверен, что это возможно на iPhone. Нет большой разницы в батарее (OnePlus 5)

Первое решение также включало сканирование Bluetooth для конкретного Mac. Таким образом, даже если мой WiFi выключен на моем телефоне, он все равно обнаружит Bluetooth. Использование Mac-адреса не требует сопряжения или того, чтобы его могли видеть все.

Кристиан Гренфельдт
источник