É possivel recuperar todos os mac address em uma rede, ou varrer a rede em busca de uma mac address especifico, já vi algumas aplicações que fazer isso, alguem tem ideia de como implementar isso em java?
Olá,
Acho o java não tem suporte nativo à tratamento de endereços MAC, me corrijam por favor se estiver enganado.
Supondo que use o Windows, apartir do java EU invocaria os comandos do SO, para coletar os dados necessários:
> arp -d * -> limpa cache arp
> ping <endereço de broadcast da sua rede> -> popula tabela arp com os MAC dos hosts ativos
> arp -a -> mostra o cache arp
E então trataria essa tabela coletada.
Só vai funcionar para a LAN em que estiver, os pacotes de broadcast não são propagados para fora da rede.
/genildo
Existe a classe (java 6) NetworkInterface que permite pegar o MAC local. Não sei se permite esse tipo de query que procura. Mas dê uma olhada…
Só lembrando que :
-
arp -d * só consegue ser executado se o usuário for administrador da máquina (e no caso do Windows Vista é necessário usar um “Command Prompt” com permissão especial de administrador);
-
em algumas redes você, ao tentar pingar o endereço de broadcast, não obtém resposta de nenhuma máquina Windows (só de algumas máquinas Unix antigas, que não têm essas frescuras de segurança).
Isso é meio chatinho mesmo; instale o Network Monitor 3.1 (que você pode baixar do site da Microsoft) e veja se ele dá suporte a esse tipo de coisa que você quer.
eu realmente precisava fazer isso sem depender do SO…
Há tr~es jeitos para “não depender do SO”.
a) Ou você não faz o que não existe pronto no Java (ou seja, muda seu requisito)
b) Ou, pelo contrário, usa um monte de código (talvez código nativo, ou escrito em linguagem de script, ou sei lá o quê) que tem um monte de ifs para checar uma porção de sistemas operacionais diferentes, e testa em todos eles.
Eu tenho de fazer muito isso, e isso é terrivelmente tedioso, mas o requisito é esse…
c) Ou você tem a sorte de encontrar (ou o dinheiro para comprar) uma biblioteca que tem esse monte de código nativo desenvolvido para N sistemas operacionais que faz isso para você.
Olá
Além do jeito B do thingol que não tão difícil assim para um programador que conheça Java, C e TCP/IP,
você pode simplesmente criar um aplicativozinho simples do tipo daemon que rode em todas as máquinas. O tal aplicativozinho deve enviar ao servidor o MAC Address da máquina em que está rodando. Mais simples e rápido de fazer do que isto só combinando o ipconfig com o net send
[]s
Luca
[quote=Luca]Olá
Além do jeito B do thingol que não tão difícil assim para um programador que conheça Java, C e TCP/IP,
você pode simplesmente criar um aplicativozinho simples do tipo daemon que rode em todas as máquinas. O tal aplicativozinho deve enviar ao servidor o MAC Address da máquina em que está rodando. Mais simples e rápido de fazer do que isto só combinando o ipconfig com o net send
[]s
Luca
[/quote]
Não tem como fazer dessa maneira, nao vou buscar pcs na rede, mas alguns dispositivos, como impressoras e leitores de radio frequencia.
Há tr~es jeitos para “não depender do SO”.
a) Ou você não faz o que não existe pronto no Java (ou seja, muda seu requisito)
b) Ou, pelo contrário, usa um monte de código (talvez código nativo, ou escrito em linguagem de script, ou sei lá o quê) que tem um monte de ifs para checar uma porção de sistemas operacionais diferentes, e testa em todos eles.
Eu tenho de fazer muito isso, e isso é terrivelmente tedioso, mas o requisito é esse…
c) Ou você tem a sorte de encontrar (ou o dinheiro para comprar) uma biblioteca que tem esse monte de código nativo desenvolvido para N sistemas operacionais que faz isso para você.
[/quote]
Acho que vou tentar partir para a alternativa b.
Olá
Ainda acho que é possível e mais rápido de fazer a solução do daemon que inclusive pode dialogar com os periféricos por outros meios fora da rede como através de portas USB ou seriais. Mas se sua equipe de desenvolvimento atende bem ao que citei, a solução B do thingol é perfeitamente factível.
[]s
Luca
Achei esse código aqui, talvez te ajude:
[code]/**
* Tested to work with results from ARP command under Solaris, Linux, MS-Windows
* Note it does not always return a Mac address, even if the host exists. This represents more of
* a best ‘effort’ solution.
*/
private String getMacAddress ( String host ) throws UnknownHostException, IOException, InterruptedException
{
String macAddress = null;
InetAddress hostAddress = InetAddress.getByName( host );
String resultLine = callArpTool ( hostAddress.getHostAddress() );
if ( resultLine == null )
{
return null;
}
if ( resultLine.indexOf("\n") > -1 )
{
String[] lines = resultLine.split("\n");
resultLine = lines[lines.length -1];
}
if ( resultLine.indexOf("--") > -1 || resultLine.indexOf("unknown host") > -1 )
{
return null;
}
int idx = -1;
if ( resultLine.indexOf( '-' ) > -1 )
{
idx = resultLine.indexOf( '-' ) - 2;
}
else if ( resultLine.indexOf( ':' ) > -1 )
{
idx = resultLine.indexOf( ':' ) - 2;
}
int endIdx = resultLine.length()-1;
if ( resultLine.indexOf(' ',idx+1) > -1 )
{
endIdx = resultLine.indexOf(' ',idx+1);
}
macAddress = resultLine.substring(idx,endIdx);
return macAddress;
}
private String callArpTool ( String ipAddress ) throws IOException, InterruptedException
{
String result = null;
/* samples:
//solaris
result = "motako (10.1.12.79) at 0:e:a6:b5:70:80";
result = "arp: motakox: unknown host";
//linux
result = "Address HWtype HWaddress Flags Mask Iface\n"+
"whyme.xxxxxxxxxxxxxxx.c ether 00:11:D8:DF:2B:9C C eth2";
result = "batoo.yyyyyy.org (70.55.60.9) -- no entry";
//windows
result = " 56 3: 10.1.12.203 00-11-d8-df-2b-9c dynamic";
result = " 2 12:Interface: 10.1.12.134 --- 0x50003";
*/
if ( System.getProperty("os.name").toLowerCase().startsWith("windows") )
{
return callArpToolWindows( ipAddress );
}
return callArpToolDefault( ipAddress );
}
private String callArpToolWindows ( String ipAddress ) throws IOException, InterruptedException
{
String[] cmdArray = null;
cmdArray = new String[] { "ping", ipAddress };
Runtime.getRuntime().exec( cmdArray ).waitFor();
cmdArray = new String[] { "arp", "-a" };
StringBuilder stdOut = new StringBuilder();
Process proc = Runtime.getRuntime().exec( cmdArray );
new ProcessOutputHandler(stdOut,proc.getInputStream(),2001);
proc.waitFor();
String[] parts = stdOut.toString().split("\n");
for ( String part : parts )
{
if ( part.indexOf(ipAddress) > -1 )
{
return part;
}
}
return null;
}
private String callArpToolDefault ( String ipAddress ) throws IOException, InterruptedException
{
String[] cmdArray = null;
cmdArray = new String[] { "ping", ipAddress };
Runtime.getRuntime().exec( cmdArray ).waitFor();
cmdArray = new String[] { "arp", ipAddress };
StringBuilder stdOut = new StringBuilder();
Process proc = Runtime.getRuntime().exec( cmdArray );
new ProcessOutputHandler(stdOut,proc.getInputStream(),2001);
proc.waitFor();
return stdOut.toString();
}[/code]
fonte: http://forum.java.sun.com/thread.jspa?threadID=615562&messageID=3424234
fw
Ps: esse é o quarto tópico que encontro fantasticas contribuições do mestreshake… apenas para registrar, o guj não é forum do orkut.
[quote=Luca]Olá
Ainda acho que é possível e mais rápido de fazer a solução do daemon que inclusive pode dialogar com os periféricos por outros meios fora da rede como através de portas USB ou seriais. Mas se sua equipe de desenvolvimento atende bem ao que citei, a solução B do thingol é perfeitamente factível.
[]s
Luca[/quote]
Então o problema eh que nao terei micros ligado estes dispositivos para pegar a configuração e enviar ao servidor, por exemplo a impressora pode ficar no meio da linha de produção sem nenhum pc ligada diretamente a rede, é impressoras do tipo zebra e semelhantes, os leitores de radio frequencia tb vão ligados a rede diretamente sem auxilio de pc, por isso disse que nao consigo utilizar esta solução…
Estes dispositos tem um padrão de mac address, por isso eu precisava “varrer” a rede em busca de determinado padrão de dispositivo, para descobrir o ip desta impressora.
Vai ser algo mais ou menos assim, os caras plugam varias impressoras pelo produção, o software é capaz de localizar as impressores e informar o ip atual, o mesmo funcionamento para os leitores.
Esses programas tipo networkmagic fazem isso, conseguem recuperar todos os dispositivos da rede, eu preciso algo desse tipo.
[quote=Dieval Guizelini]Achei esse código aqui, talvez te ajude:
[code]/**
* Tested to work with results from ARP command under Solaris, Linux, MS-Windows
* Note it does not always return a Mac address, even if the host exists. This represents more of
* a best ‘effort’ solution.
*/
private String getMacAddress ( String host ) throws UnknownHostException, IOException, InterruptedException
{
String macAddress = null;
InetAddress hostAddress = InetAddress.getByName( host );
String resultLine = callArpTool ( hostAddress.getHostAddress() );
if ( resultLine == null )
{
return null;
}
if ( resultLine.indexOf("\n") > -1 )
{
String[] lines = resultLine.split("\n");
resultLine = lines[lines.length -1];
}
if ( resultLine.indexOf("--") > -1 || resultLine.indexOf("unknown host") > -1 )
{
return null;
}
int idx = -1;
if ( resultLine.indexOf( '-' ) > -1 )
{
idx = resultLine.indexOf( '-' ) - 2;
}
else if ( resultLine.indexOf( ':' ) > -1 )
{
idx = resultLine.indexOf( ':' ) - 2;
}
int endIdx = resultLine.length()-1;
if ( resultLine.indexOf(' ',idx+1) > -1 )
{
endIdx = resultLine.indexOf(' ',idx+1);
}
macAddress = resultLine.substring(idx,endIdx);
return macAddress;
}
private String callArpTool ( String ipAddress ) throws IOException, InterruptedException
{
String result = null;
/* samples:
//solaris
result = "motako (10.1.12.79) at 0:e:a6:b5:70:80";
result = "arp: motakox: unknown host";
//linux
result = "Address HWtype HWaddress Flags Mask Iface\n"+
"whyme.xxxxxxxxxxxxxxx.c ether 00:11:D8:DF:2B:9C C eth2";
result = "batoo.yyyyyy.org (70.55.60.9) -- no entry";
//windows
result = " 56 3: 10.1.12.203 00-11-d8-df-2b-9c dynamic";
result = " 2 12:Interface: 10.1.12.134 --- 0x50003";
*/
if ( System.getProperty("os.name").toLowerCase().startsWith("windows") )
{
return callArpToolWindows( ipAddress );
}
return callArpToolDefault( ipAddress );
}
private String callArpToolWindows ( String ipAddress ) throws IOException, InterruptedException
{
String[] cmdArray = null;
cmdArray = new String[] { "ping", ipAddress };
Runtime.getRuntime().exec( cmdArray ).waitFor();
cmdArray = new String[] { "arp", "-a" };
StringBuilder stdOut = new StringBuilder();
Process proc = Runtime.getRuntime().exec( cmdArray );
new ProcessOutputHandler(stdOut,proc.getInputStream(),2001);
proc.waitFor();
String[] parts = stdOut.toString().split("\n");
for ( String part : parts )
{
if ( part.indexOf(ipAddress) > -1 )
{
return part;
}
}
return null;
}
private String callArpToolDefault ( String ipAddress ) throws IOException, InterruptedException
{
String[] cmdArray = null;
cmdArray = new String[] { "ping", ipAddress };
Runtime.getRuntime().exec( cmdArray ).waitFor();
cmdArray = new String[] { "arp", ipAddress };
StringBuilder stdOut = new StringBuilder();
Process proc = Runtime.getRuntime().exec( cmdArray );
new ProcessOutputHandler(stdOut,proc.getInputStream(),2001);
proc.waitFor();
return stdOut.toString();
}[/code]
fonte: http://forum.java.sun.com/thread.jspa?threadID=615562&messageID=3424234
fw
Ps: esse é o quarto tópico que encontro fantasticas contribuições do mestreshake… apenas para registrar, o guj não é forum do orkut.[/quote]
Obrigado , vou dar uma olhada nesse código para ver se ajuda.
Olá
Agora entendi. Talvez tivesse sido melhor você ter explicado isto logo.
Vocês usam ou pretendem usar algum serviço de diretório do tipo LDAP ou Active Directory? Pode ser que facilite muitas coisas e de passagem facilite muito a resolução do seu problema caso o MAC Address esteja no esquema.
[]s
Luca
[quote=Luca]Olá
Agora entendi. Talvez tivesse sido melhor você ter explicado isto logo.
Vocês usam ou pretendem usar algum serviço de diretório do tipo LDAP ou Active Directory? Pode ser que facilite muitas coisas e de passagem facilite muito a resolução do seu problema caso o MAC Address esteja no esquema.
[]s
Luca[/quote]
Acho que devia ter postado essa explicação no inicio, mas agora esta ai…rs
Nao pretendemos usar nenhum serviço de diretorio.
a ideia eh deixar automagico msm, plugou o dispositivo na rede o software faz uma busca e lista, sem nenhum tipo previo de registro.