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!
fonte
Respostas:
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 3
bandeira, que a executa três vezes; funciona muito melhor como o padrão 2 vezes, que às vezes perde alguns dispositivos. Portanto:funciona melhor para mim para LG V30 +.
fonte
Dessa forma, você pode procurar o MAC do seu dispositivo :)
fonte
Na verdade, estou pensando em implementar uma solução para isso que atenda aos seguintes requisitos:
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.
fonte
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.
fonte
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.
fonte
Eu tropecei nisso e, uma vez que fiz algo semelhante, decidi postar uma resposta.
Eu fiz o seguinte:
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.
fonte
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.
fonte