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


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

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

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

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


8
2018-05-27 22:51


происхождения


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


ответы:


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

устанавливать arp-scan: sudo apt-get install arp-scan
Обнаружение всех узлов в локальной сети: sudo arp-scan -l 

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


3
2017-07-27 14:38



Следует отметить, что некоторые устройства могут не отображаться, если они не включены. Моя связь 4 не появится, если экран не включен. - Nicolas Bouliane


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-адрес вашего устройства :)


3
2018-03-01 17:30





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

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

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

Предположим, что локальная сеть 192.168.1.0 ...

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

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

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

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


2
2017-07-21 16:49



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


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

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


1
2018-05-28 00:50





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

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

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


0
2018-04-11 01:22





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

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

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, а запрос большой, поэтому для Wi-Fi требуется 4 секунды. Делать это для 253 адресов медленно, как черт. Но у вас не было бы 253 устройств (возможно) меньше серверов HTTP. (или в вашем случае, телефоны)

Рассмотрение журналов маршрутизатора - очень хорошая идея и легко. И даже быстрее, чем пинговать все. Некоторые маршрутизаторы даже не нуждаются в регистрации, чтобы добраться до них.

Кроме того, стоит проверить, поддерживает ли ваше устройство поддержку UPNP. Если это так, вы можете использовать UPNP для обнаружения своего присутствия. Это будет официальное решение (прослушивание в эфир для UDPs UPNP). Но все устройства не поддерживают его. Но все устройства не поддерживают ICMP. (они не хотят, чтобы их бомбардировали бесполезно).

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

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


0
2018-01-07 15:13





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

Решение 1

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

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

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

Решение 2

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

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

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

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


0
2017-08-05 07:40