Precisa de uma maneira de extrair endereços MAC do meu roteador para um projeto "Who's Home"

11

Esse tipo de projeto já foi feito com Bluetooth, mas o alcance de 30 pés e o consumo extra de bateria me fazem querer executar ping apenas no roteador, em vez dos telefones das pessoas. Eu sei que os roteadores controlam endereços MAC exclusivos para cada dispositivo. Esperava registrar o endereço de cada telefone e fazer com que o PI verifique periodicamente o roteador para atualizar uma página da web dinâmica para exibir quem está em casa.

Quero saber se existe uma maneira razoável de obter essas informações com o PI.

Codiush
fonte
e quanto ao wifi (execute o ping nos nomes de host dos telefones)?
user236012
2
Você também pode atribuir endereços IP estáticos do roteador e usar o nmap e os endereços IP para identificar os dispositivos.
ArtOfCode
Fiz algo semelhante em C # no Windows aqui: stackoverflow.com/questions/2567107/… - ficaria feliz em enviar o código da versão mais recente, se você desejar. Eu não sei o quão útil o C # é em um Raspberry Pi, mas ele deve indicar a direção certa. Detecta com segurança que estou em casa antes mesmo de entrar na garagem.
Aric TenEyck 24/02
Capto essas informações muito mais, colocando um script bash no roteador que publica os resultados em um servidor da web a cada minuto. Com este sistema, monitorei e gerencio o tempo de atividade na Internet, clientes conectados, IPs de WAN, atenuação de fibra e orçamento de energia, serviços VOIP, senhas de wifi etc. A milhagem difere da potência da CPU do seu roteador.
EDP
1
Raspagem de tela no roteador? Você também pode atualizar para um roteador baseado em Linux (openwrt) e simplesmente efetuar login e procurar no cache arp.
Thorbjørn Ravn Andersen

Respostas:

6

É possível. Sugiro que você forneça ao seu script credenciais de login e leia a página que exibe as informações. Então você pode analisar o conteúdo e preencher uma matriz com os dados que deseja. Como essas páginas às vezes contêm mais informações, como datas e horas, você pode criar um registro muito bom.

Aqui está um exemplo rápido de como eu iria proceder;

Na página do seu roteador, você pode encontrar algo como o seguinte;

<div id="flex">
 <div id="dm-name">
  name : Your_device_name
 </div>
 <div id="dm-ip">
  IP : 192.168.x.xxx
 </div>
 <div id="dm-mac">
  <span>MAC:D4:04:CD:FE:5A:17</span>
 </div>
</div>

Portanto, sabemos que todos os dispositivos serão listados dessa maneira. E que todos os endereços MAC terão o mesmo comprimento.

O script pode ser algo assim;

var string_to_parse = "file read from router.html";
cursor = 0;  // The position of your cursor;
i =0;
    while(cursor > 0){

    begin_at = string_to_parse.indeOf('MAC:');
    end_at = length_of_Mac; // this is standard for al mac

    mac[i] = string_to_parse.substring(begin_at, begin_at + end_at);
    cursor = begin_at + end_at;
i++;
    }

Esse código precisará de ajustes, mas a ideia está aí. É um loop que executa todo o arquivo para encontrar todos os endereços do Mac. até chegar ao final do arquivo.

MadeInDreams
fonte
Isto é o que eu faria. Ele tem o bônus adicional de detectar se o seu roteador está morto.
Slebetman
1
A raspagem do site +1 é uma escolha interessante. Estou um pouco irritada por não ter pensado nisso.
Jacobm001
@MadeInDreams A página do roteador que você refere é a página de concessão de DHCP do roteador? Ou existe uma página de conexão ativa do roteador?
Chetan Bhargava
Depende do seu roteador, mas a maioria deles possui uma página que lista todos os dispositivos conectados. Este exemplo é da página principal da minha rede
MadeInDreams
6

Para rastrear endereços Mac exclusivos no seu Raspberry Pi, você precisa de uma ferramenta (em vez de serviço) chamada arpwatch . Eu usei o arpwatch no BSD extensivamente e ele registra todas as solicitações do arp e rarp no syslog.

No Syslog, você pode analisar datas e horários e endereços mac.

O ARP funciona e a tabela existe apenas na rede física (palavra técnica: domínio de colisão). Quando um pacote sai para outra rede, o endereço mac de origem é substituído pelo endereço mac do roteador.

O arpcomando running no Raspberry Pi listará apenas os endereços mac + IP dos hosts que realizaram transações (comunicação IP) com o host no qual o comando é executado (Raspberry Pi). Ele vai não listar endereços MAC de outros hosts na rede.

Outra maneira avançada seria usar o nmap no seu Raspberry Pi para fazer uma descoberta de host. Você pode usar o nmap -sPping em todos os hosts da rede. Ele informará os endereços IP de todos os hosts ativos na sua rede. Em seguida, você pode executar o comando arp para descobrir o mac de quem está ativo.

chetan@Linux:~$ nmap -sP 192.168.100.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 16:08 PST
Nmap scan report for 192.168.100.4
Host is up (0.0087s latency).
Nmap scan report for 192.168.100.58
Host is up (0.0024s latency).
Nmap scan report for 192.168.100.160
Host is up (0.049s latency).
Nmap scan report for 192.168.100.164
Host is up (0.063s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.68 seconds
Chetan Bhargava
fonte
1
Penso que este é provavelmente um método muito mais robusto e flexível do que o método de raspagem da Web. Em muitos roteadores emitidos por ISP, a página que deve mostrar os dispositivos conectados com informações não será confiável.
goldilocks
@goldilocks +1, sim, pensei nisso depois de ter votado positivamente na resposta aceita. Suponho que eles tenham um roteador que tenha uma página para conexões ativas (status SPI ou similar). Bom roteador que eles têm.
Chetan Bhargava
4

Acabei de brincar com a versão da linha de comando do fing . Ele faz um trabalho decente em encontrar tudo na rede e cuspir arquivos CSV contendo:

  • endereço de IP
  • Nome Customizado do Nó (se você tiver designado nomes customizados no arquivo .properties)
  • O estado (PARA CIMA / PARA BAIXO)
  • O carimbo de data e hora da última alteração
  • O nome do host (se você tiver ativado o DNS)
  • O endereço de hardware (se você estiver descobrindo uma rede local)
  • O fornecedor de hardware

Pelas respostas anteriores, seria necessária alguma manipulação de texto para colocar o conteúdo dos CSVs em uma página da Web e tenha cuidado com o que você está publicando externamente.

Eu usei a versão do Android bastante extensivamente e ele faz um bom trabalho em encontrar tudo na minha rede doméstica (e divertido de brincar com o wifi público).

goobering
fonte
3

O comando arpfornecerá uma lista de dispositivos conectados à rede. Você precisará fazer alguma manipulação básica de strings para obter os dados que deseja, mas isso certamente seria mais fácil do que tentar obter as informações você mesmo.

Nota de funcionalidade :

Alguns roteadores bloqueiam esse tipo de funcionalidade por padrão, e o seu pode ser configurado como tal. Se não funcionar, procure um pouco na documentação para verificar como permitir.

NOTA DE SEGURANÇA :

Existem algumas implicações muito sérias na segurança de ter um site que mostre quem está atualmente em casa. Pense com muito cuidado na segurança em vigor e se ela é boa o suficiente para os riscos envolvidos.

Jacobm001
fonte
Boa ideia, acho que retiro meu comentário anterior.
Ghanima
1
Existem algumas advertências interessantes sobre o uso do arp aqui . Eles sugerem que os dispositivos podem não aparecer se não tiverem enviado pacotes para o dispositivo que executa o arp e que um ping pode ser necessário.
pesquisando
@goobering +1. simplesmente executar o comando arp não listará todos os hosts ativos na rede. O Arpwatch registrará todos os pacotes arp na rede.
Chetan Bhargava 23/02
1

É possível, e outras pessoas sugeriram alguns bons métodos. Eu escrevi um script python alguns anos atrás para rastrear essas informações de um roteador netgear e jogá-las no github. Pode ser encontrado aqui . É grosseiro, e, olhando para ele agora, refizê-lo-ia um pouco de maneira diferente, mas funcionou exatamente para o mesmo propósito que você procura por alguns anos até que me mudei.

Ed.
fonte
+1 Seu script certamente pode ser aprimorado, mas essa é uma ótima solução para o problema.
Jacobm001