Como detectar um dispositivo móvel quando ele se conecta a uma rede wifi doméstica?


10

Qual seria a melhor maneira de reconhecer um servidor quando um dispositivo móvel específico (telefone celular, iPad etc.) se conecta à rede (sem fio, é claro)?

Como exemplo de situação, uma pessoa tem sua rede wifi doméstica configurada corretamente em seu telefone celular. Quando ele fica dentro do alcance do roteador, ele se conecta (nada de novo nisso). Após a conexão com esse roteador, seu servidor doméstico inicia um determinado programa (ou lança uma notificação, grava em um arquivo etc.).

Eu pensei que uma possível solução seria um "aplicativo da web" hospedado em rede que seria lançado a partir do telefone para que o servidor reconhecesse que a página foi chamada. No entanto, se isso puder ser feito quando o telefone se conectar automaticamente, seria melhor.

Quaisquer pensamentos ou soluções alternativas serão muito apreciados, por isso agradeço antecipadamente!


Se for um telefone Android, um trabalho cron com a criação de um site local seria mais fácil. Para fazer isso do lado da rede, você teria que usar o protocolo RADIUS e ter um servidor RADIUS configurado corretamente.
Huckle

Por que não apenas revisar os logs do roteador. Como esses logs são baseados em texto, seria fácil consultá-los e obter apenas as informações necessárias. Certamente alguém escreveu o código para fazer isso, mas se não, seria um exercício simples.

Respostas:


4

Eu acho que isso pode ser facilmente realizado por arp-scan.

Instalação arp-scan: sudo apt-get install arp-scan
detecte todos os hosts na rede local:sudo arp-scan -l

Você pode configurar um crontab para executar periodicamente (a cada 2 minutos, talvez) um script que varre a rede com arp-scan e analisa sua saída para descobrir os hosts ativos.

Às vezes eu precisava da -r 3bandeira, que a executa três vezes; funciona muito melhor como o padrão 2 vezes, que às vezes perde alguns dispositivos. Portanto:

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

funciona melhor para mim para LG V30 +.


Note-se que alguns dispositivos podem não aparecer a menos que estejam ligados. Meu nexus 4 não será exibido a menos que a tela esteja ligada.
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!"

Dessa forma, você pode procurar o MAC do seu dispositivo :)


2

Na verdade, estou pensando em implementar uma solução para isso que atenda aos seguintes requisitos:

  1. O telefone não precisa ter um endereço IP atribuído na rede.
  2. O telefone não precisa enviar periodicamente sinais que esgotariam sua bateria.
  3. Se houver muitos telefones na rede, todos eles serão detectados.

Minha intenção é montar o sistema de arquivos do telefone com ssh, mas poderia ser usado para qualquer coisa.

Digamos que a rede local seja 192.168.1.0 ...

Assim, gostaria de implementar um aplicativo que escuta UDP transmite a partir do endereço de broadcast: 192.168.1.255. Este aplicativo não drenaria a bateria, pois é totalmente passiva. (somente fica ativo quando um pacote é recebido).

Um daemon no computador enviará periodicamente transmissões para o endereço de broadcast 192.168.1.255. O telefone responderá a esses sinais fornecendo seu nome, identificação, endereço IP etc.

Agora o computador sabe que o telefone existe na rede e, para o meu caso, pode invocar o sshfs mount.

Certamente isso precisa de muito trabalho, incluindo trabalho de programação, e não é fácil. Mas acho que seria a solução mais confiável e razoável.


1
Uau, então basicamente um protocolo personalizado ... alguém poderia pensar que já existisse algo assim.
Michael

1

A melhor maneira de pensar é fornecer ao dispositivo um endereço IP estático e usar um script simples para executar ping no dispositivo a cada X segundos e acionar seu programa / notificação.

O que deve ser observado: muitos telefones não se conectam à rede wifi até que acorde do modo de suspensão. Seu script precisará saber a diferença entre o telefone que entra em suspensão e o telefone que sai de casa, possivelmente considerando a hora do dia. Depois disso, fazer o script acionar um programa para executar ou uma notificação aparecer é trivial.


0

Eu escrevi um script que faz algo semelhante usando o arp-scan e um endereço IP estático em um iPhone.

Você pode encontrar o código aqui: https://github.com/blackairplane/pydetect

Ele precisa ser limpo, porque eu sou novo no Python, mas acho que ilustra o conceito.


0

Eu tropecei nisso e, uma vez que fiz algo semelhante, decidi postar uma resposta.

Eu fiz o seguinte:

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.

No meu caso, eu tinha um servidor HTTP em execução no meu dispositivo. Então, acabei de enviar uma solicitação HTTP HEAD para praticamente nada na porta 80. Se o dispositivo respondeu e o cabeçalho do servidor foi nomeado corretamente, esse é o meu dispositivo.

Mas não consegui ir rápido sem executar o ping primeiro. O HTTP é TCP e a solicitação é grande; portanto, o tempo limite deve ser de 4 segundos para o WiFi. Fazer isso para 253 endereços é lento como o inferno. Mas você não teria 253 dispositivos (provavelmente) mais menos servidores HTTP. (ou, no seu caso, telefones)

Considerando os logs do roteador é uma idéia muito boa e fácil. E ainda mais rápido do que executar ping em todos. Alguns roteadores nem precisam fazer login para acessá-los.

Além disso, vale a pena verificar se o seu dispositivo possui suporte para UPNP. Nesse caso, você pode usar o UPNP para detectar sua presença. Esta seria a solução oficial (ouvindo na transmissão os UDPs do UPNP). Mas todos os dispositivos não suportam isso. Mas todos os dispositivos também não suportam ICMP. (eles não desejam ser bombardeados desnecessariamente).

Há outra possibilidade interessante. Você pode procurar pacotes DHCP e ver quando um roteador está fornecendo um endereço IP a um novo dispositivo. Mas isso não funcionaria para dispositivos com IPs estáticos. Eles nem tocariam na rede até precisarem de algo. A conexão ao próprio WiFi está em outra camada e não pode ser facilmente detectada, a menos que você queira agir como um farejador. Não tenho certeza, mesmo que seja possível com o adaptador de rede em um modo promissor. Eu acho que seria necessário hardware adicional para isso.

Para obter o ping no Python, sem subprocessar o programa de ping e perder velocidade, é necessário criar um soquete bruto e construir o pacote ICMP manualmente. Não é difícil. Há um exemplo disso em algum lugar na web. Obviamente, para enviá-lo, você precisará de permissões de root, assim como o ping. Isso é uma desvantagem. Se você distribuir o software, não poderá esperar que os usuários o executem como root.


0

Eu tinha duas soluções que usei. (Pitão)

Solução 1

O primeiro foi armar números de ip conhecidos que eu quero rastrear. Eu fiz isso em três etapas. 1 # use "-c1" para enviar apenas um ping.se o dispositivo estiver ativo, ele responderá e. A função será encerrada com sucesso 2 # use "-c3" agora aguarde mais tempo para responder em um dos três. Isso geralmente é suficiente quando é um sinal wifi ruim. 3 # use "-c10" isso pode ser necessário quando o sinal wifi é muito ruim. (Observe que o iPad antigo precisa de cerca de 10 tentativas para responder) Para acelerar as coisas que criei Processos separados para cada número de ip que eu quero rastrear.

Eu também alterei os intervalos de ping, dependendo do sucesso ou não. Se encontrar o dispositivo, esperará mais tempo até verificar novamente. Se falhar, tentará novamente em 60 segundos. (Quero que a luz acenda quando entro em minha casa), então os anos 60 são suficientes para me encontrar na rua

Isso funcionou perfeitamente! Quando cheguei em casa, senti-me, apaguei a luz e apaguei quando saí.

Solução 2

O Arping pode não ser pesado na rede, mas mudei a solução para ignorar todos os pings e criei meu próprio servidor DHCP no meu raspberry pi.

Em seguida, adicionei "na confirmação", que aciona um script assim que um dispositivo obtém um número ip. Esse script usa uma 'chamada HTTP API de curvatura' para notificar meu servidor www (Flask) assim que um dispositivo obtém ou renova seu número ip.

No meu Android, alterei as configurações para nunca desligar o wifi quando a tela está desligada. Não tenho certeza se é possível no iPhone. Não há grande diferença na bateria (OnePlus 5)

A primeira solução também incluiu a digitalização Bluetooth para Mac específico. Assim, mesmo que meu Wi-Fi esteja desligado no telefone, ele ainda detectará o Bluetooth. O uso do endereço Mac não precisa emparelhá-lo ou tê-lo disponível para que todos possam ver.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.