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

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

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

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

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

10
задан 28 May 2012 в 03:20

7 ответов

Я думаю, что это может быть легко достигнуто с помощью 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 +.

0
ответ дан 28 May 2012 в 03:20

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

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

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

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

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

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

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

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

0
ответ дан 28 May 2012 в 03:20
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 своего устройства:)

0
ответ дан 28 May 2012 в 03:20

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

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

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

0
ответ дан 28 May 2012 в 03:20

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

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

0
ответ дан 28 May 2012 в 03:20

У меня было два решения, которые я использовал. (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 call» для уведомления моего www-сервера (Flask), как только устройство получает или обновляет свой ipnumber.

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

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

0
ответ дан 28 May 2012 в 03:20

Я наткнулся на это, и когда я однажды сделал нечто подобное, решил опубликовать ответ.

Я сделал следующее:

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
ответ дан 28 May 2012 в 03:20

Другие вопросы по тегам:

Похожие вопросы: