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

9

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 situação exemplificativa, uma pessoa tem sua rede wifi doméstica configurada corretamente em seu celular. Quando ele fica dentro do alcance do roteador, ele se conecta (nada de novo sobre isso). Com a conexão a esse roteador, seu servidor inicial acionaria um determinado programa (ou lançaria uma notificação, gravaria em um arquivo etc.).

Pensei que uma possível solução seria um "aplicativo da Web" hospedado na rede e que seria lançado do telefone para que o servidor reconheça que a página foi chamada. No entanto, se isso pudesse ser feito quando o telefone se conectasse automaticamente, seria melhor.

Quaisquer pensamentos ou soluções alternativas seriam muito apreciados, então, obrigado antecipadamente!

    
por Ivan I. 28.05.2012 / 00:51

7 respostas

4

Acho que isso pode ser facilmente realizado por arp-scan .

Instalar arp-scan : sudo apt-get install arp-scan
Detectar todos os hosts na rede local: sudo arp-scan -l

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

Às vezes, eu precisava do sinal -r 3 , que é executado três vezes; funciona muito melhor como o padrão 2 vezes, o que às vezes falta alguns dispositivos. Assim:

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

funciona melhor para mim no LG V30 +.

    
por Eric Carvalho 27.07.2012 / 16:38
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!"

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

    
por ZaBiC 01.03.2014 / 18:30
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 sinais periodicamente para drenar 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 o ssh, mas ele pode ser usado para qualquer coisa.

Digamos que a rede local seja 192.168.1.0 ...

Portanto, eu implementaria um aplicativo que ouve transmissões UDP do endereço de difusão: 192.168.1.255 . Este aplicativo não drenaria bateria como totalmente passivo. (só fica ativo quando um pacote é recebido).

Um daemon no computador enviará periodicamente transmissões para o endereço de transmissão 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, no meu caso, pode invocar o sshfs mount.

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

    
por d_inevitable 21.07.2012 / 18:49
1

A melhor maneira que posso pensar é dar ao dito dispositivo um endereço IP estático, e usar um simples script para fazer ping no dispositivo a cada X segundos e acionar seu programa / notificação.

Coisas a serem notadas: Muitos telefones não se conectam à rede Wi-Fi até o despertar. Seu roteiro precisará ser capaz de dizer a diferença entre o telefone indo dormir e o telefone saindo de casa, possivelmente considerando a hora do dia. Depois disso, fazer com que o script dispare um programa para ser executado ou uma notificação apareça é trivial.

    
por Jeff Welling 28.05.2012 / 02:50
0

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

Você pode encontrar o código aqui: link

Ele precisa ser limpo, já que sou novo no Python, mas acho que ele ilustra o conceito.

    
por JamieHoward 11.04.2013 / 03:22
0

Eu tropecei nisso e como fiz uma vez, algo semelhante decidiu 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. Por isso, enviei apenas uma solicitação HTTP HEAD para praticamente nada na porta 80. Se o dispositivo respondeu e o cabeçalho do servidor está corretamente nomeado, este é o meu dispositivo.

Mas eu não pude ir rápido sem primeiro pingar. O HTTP é TCP e a solicitação é grande, portanto, os tempos limite precisam ser de 4 segundos para o Wi-Fi. Fazendo isso por 253 endereços é lento como o inferno. Mas você não teria 253 dispositivos (provavelmente) menos servidores HTTP. (ou no seu caso, telefones)

Considerar os registros do roteador é uma boa ideia e fácil. E ainda mais rápido do que pingar tudo. Alguns roteadores nem precisam se conectar para acessá-los.

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

Existe outra possibilidade interessante. Você pode pescar pacotes DHCP e ver quando um roteador está dando um novo endereço IP a um novo dispositivo. Mas isso não funcionaria para dispositivos com IPs estáticos. Eles nem sequer tocariam na rede até precisarem de alguma coisa. Conectar-se ao WiFi em si é em outra camada e não pode ser facilmente detectado, a menos que você deseje agir como um sniffer. Não tenho certeza, mesmo que seja possível com o adaptador de rede em um modo promisquous. Acho que hardware adicional seria necessário para isso.

Para conseguir ping em Python, sem subprocessar o programa ping e perder velocidade, você precisa criar um socket bruto e construir o pacote ICMP manualmente. Não é difícil. Há um exemplo disso em algum lugar na web. Claro, 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.

    
por Dalen 07.01.2017 / 16:13
0

Eu tive duas soluções que usei. (Python)

Solução 1

Primeiro foi arping ipnumbers conhecidos que eu quero acompanhar. 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 sairá com sucesso 2 # use "-c3" agora dê 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 é realmente mau sinal wifi. (Notado o velho iPad precisa de cerca de 10 tentativas para responder) Para acelerar as coisas, criei Processos separados para cada número de ip que quero rastrear.

Eu também alterei os intervalos de ping dependendo se é um sucesso ou não. Se encontrar o dispositivo, ele aguardará mais tempo até verificar novamente. Se for uma falha, ele tentará novamente em 60 segundos. (Eu quero a luz acesa quando eu entrar na minha casa), então 60s é o suficiente para me encontrar na rua

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

Solução 2

O arping pode não ser pesado na rede, mas eu mudei a solução para pular todos os pings e criar meu próprio servidor DHCP no meu pi de framboesa.

Em seguida, adicionei "on commit", que aciona um script assim que um dispositivo recebe um ipnumber. Esse script usa uma 'chamada de API HTTP curl' para notificar meu servidor www (Flask) assim que um dispositivo receber ou renovar seu ipnumber.

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

A primeira solução também incluiu a digitalização Bluetooth para um Mac específico. Portanto, mesmo que o meu WiFi esteja desligado no meu telefone, ele ainda sentirá o Bluetooth. Usar o endereço Mac não precisa emparelhá-lo ou disponibilizá-lo para que todos possam ver.

    
por Christian Grenfeldt 05.08.2017 / 09:40