Tem como acessar informações de hardware?

Ja dei uma pesquisada, e vi que através do Java é difícil buscar informações de hardware de uma máquina
Mas eu gostaria de saber se alguém conhece algum aplicativo pequeno, que possa ser disparado pelo prompt do DOS
que faça isso?
Preciso que o programa pegue as informações de placas PCI instaladas no pc, mais especificamente modems PCI (daqueles antigos de conexão discada)
ai eu chamaria este programa pelo RunTime.getRunTime.exec(comando).

Se alguém souber alguma forma em Java mesmo seria bem melhor…

Não conheço nenhum programa assim. Agora, se você vai usar e abusar do Runtime.exe, por que está fazendo a aplicação em Java?
A vantagem de ser multiplataforma foi para o espaço, e é bem mais difícil fazer as coisas usando .exec do que vc faria numa linguagem que suporte código não gerenciado diretamente (C++, C#, etc).

Só uma ironia que não pude deixar de notar:
Sucesso em alemão é Elforg. E trabalho é Arbeit.
Portanto, na lingua materna do Einstein, Trabalho vem antes de sucesso no dicionário.

[quote=ViniGodoy]Não conheço nenhum programa assim. Agora, se você vai usar e abusar do Runtime.exe, por que está fazendo a aplicação em Java?
A vantagem de ser multiplataforma foi para o espaço, e é bem mais difícil fazer as coisas usando .exec do que vc faria numa linguagem que suporte código não gerenciado diretamente (C++, C#, etc).

Só uma ironia que não pude deixar de notar:
Sucesso em alemão é Elforg. E trabalho é Arbeit.
Portanto, na lingua materna do Einstein, Trabalho vem antes de sucesso no dicionário.
[/quote]

Na verdade só utilizo o RunTime duas vezes na aplicação por enquanto, uma que cria um arquivo de texto, e outra que realiza uma discagem, só que precisava pegar algumas informações de hardware, que seriam as informações de um Modem. Só que não encontrei forma de fazer isso pelo Java.

Estou fazendo um estágio, na verdade de programação WEB, mas como havia dito ao gerente na entrevista que estudava java na faculdade,
um cliente pediu pra fazer um discador de conexão discada, e o gerente pediu pra mim tentar fazer em Java, não tenho conhecimento
suficiente pra fazer nem em Java, quanto mais em outras linguagens! Ficou quase que como um desafio mesmo, ele não me cobra por isso.
Estou conseguindo fazer por enquanto, Ja consigo até realizar a conexão pelo discador, mas é preciso criar um arquivo de configuração assim que o programa é carregado.
um arquivo de texto com extensão .pbk. Nele esta o telefone para onde o discador ira ligar, ddd se necessário e as informações do modem.
Eu consigo criar este arquivo, mas com as configurações do modem que já estão na minha máquina, precisava de um jeito de pegar estas informações
na máquina em que o discador for executado.

quanto a frase do Einstein, provavelmente ele se referiu as palavras em inglês Trabalho=“Work”, Sucesso=“Success”

Isso é impossível de ser feto em Java. Uma coisa que você pode fazer é olha a chave de registro do windows. Deve ter alguma chave que defina o modem discado disponível no pc. De posse dessa informação você pode criar um programa em C++ ou Delphi que possa vasculhar o registro em busca dessa informação. Se você precisar mesmo usar Java, você pode desenvolver uma dll nas linguagens que eu mensionei e chamá-la na sua aplicação Java usando JNI.

Bruno Ferreira ,

Boa noite !

Tenta fazer por Wmi com a biblioteca com4j , veja esses links:

http://www.guj.com.br/java/245745-pegar-informacoes-de-uma-maquina-remota-windows-por-wmi-utilizando-a-api-jacob

http://msdn.microsoft.com/en-us/library/aa394554(v=vs.85).aspx

A classe Win32_PnPEntity do WMI traz algumas informações sobre os devices instalados na maquina.

De uma pesquisada no google , caso consiga post aqui a solução , Ok ?

[quote=Rafael Costa Teixeira]Bruno Ferreira ,

Boa noite !

Tenta fazer por Wmi com a biblioteca com4j , veja esses links:

http://www.guj.com.br/java/245745-pegar-informacoes-de-uma-maquina-remota-windows-por-wmi-utilizando-a-api-jacob

http://msdn.microsoft.com/en-us/library/aa394554(v=vs.85).aspx

A classe Win32_PnPEntity do WMI traz algumas informações sobre os devices instalados na maquina.

De uma pesquisada no google , caso consiga post aqui a solução , Ok ?

[/quote]

Rafael, estou fazendo outra coisa agora, mas vou pesquisar essa API, e posto aqui o que eu conseguir de resultado
e ao Matheus também, obrigado pela ajuda!

Dá uma olhada na Sigar API para Java, já usei e recomendo: http://www.hyperic.com/products/sigar

API interessante, mas percebam que ela usa a ideia por mim descrita, escrever uma dll em uma linguagem de mais baixo nível, no caso o C e efetuar chamadas à mesma no Java (no caso dessa API, também em Perl e C#).

A máquina virtual abstrai todas as informações do sistema onde a aplicação está rodando.
Obrigado por compartilhar o link cristianogro.

API interessante, mas percebam que ela usa a ideia por mim descrita, escrever uma dll em uma linguagem de mais baixo nível, no caso o C e efetuar chamadas à mesma no Java (no caso dessa API, também em Perl e C#).

A máquina virtual abstrai todas as informações do sistema onde a aplicação está rodando.
Obrigado por compartilhar o link cristianogro.[/quote]
Sim, é exatamente desta forma que ela trabalha, não sei se ela chega a detectar todos os dispositivos, pois, quando utilizei ela somente precisei de dados mais básicos do processador e memória.

Eu baixei os fontes em C e pelo que eu pude verificar ele não detecta todos os dispositivos mesmo. Ela captura somente informações básicas do sistema, como quantidade de memória Ram, tipo de sistema de arquivos, algumas interações com o prompt de comando etc. O problema do autor da Thread ainda não pode ser solucionado.

Para acessar o registro do windows tem que ser através da api da microsoft. Sem ela o sistema trata o software como vírus.
Com somente java não é possível.

[quote=juliocbq]Para acessar o registro do windows tem que ser através da api da microsoft. Sem ela o sistema trata o software como vírus.
Com somente java não é possível.[/quote]

Como eu disse, deve-se usar uma linguagem que tenha acesso nativo ao S.O. como VB scprit ou Delphi.

Achei uma coisa interessante.
http://support.microsoft.com/kb/259695/pt-br
Nesse link tem um código em C++ que detecta todos os dispositivos de hardware instalados no computador e mais abaixo tem um para enumerar todos os dispositivos PCI. Isso deve lhe ajudar da alguma forma.
Abs.

1 curtida

[quote=matheuslmota]Achei uma coisa interessante.
http://support.microsoft.com/kb/259695/pt-br
Nesse link tem um código em C++ que detecta todos os dispositivos de hardware instalados no computador e mais abaixo tem um para enumerar todos os dispositivos PCI. Isso deve lhe ajudar da alguma forma.
Abs.[/quote]

bem interessante Matheus, só que no código ele imprime na tela os dispositivos certo?

printf(“Result:[%s]\n”,buffer);

pra mim pegar este resultado em Java, teria que gravar estas informações em um txt e recupera-las pelo java certo?

Muito obrigado a todos que estão contribuindo! :smiley:

Cara, tu pode fazer duas coisas, ou tu gera uma dll e chamar no Java com JNI ou tu manda o programa gerar um arquivo com a informação do modem e lê esse arquivo no Java. Você quer apenas capturar a informação de que existe um modem discado no pc ou quer manipular esse modem via programação?

[code]HDVINFO hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end[/code]

Esse trecho de código retorna se tem uma pla de rede instalada no pc. Tá em Delphi, mas em C++ é a mesma coisa.

1 curtida

[quote=matheuslmota]Cara, tu pode fazer duas coisas, ou tu gera uma dll e chamar no Java com JNI ou tu manda o programa gerar um arquivo com a informação do modem e lê esse arquivo no Java. Você quer apenas capturar a informação de que existe um modem discado no pc ou quer manipular esse modem via programação?

[code]HDVINFO hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

if cardinal(hdi) = INVALID_HANDLE_VALUE then
begin
Result := False;
end[/code]

Esse trecho de código retorna se tem uma pla de rede instalada no pc. Tá em Delphi, mas em C++ é a mesma coisa.[/quote]

Apenas capturar a informação, ja que para realizar as discagem da conexão, é nescessário criar um arquivo de configuração
de extensão .pbk, na verdade um arquivo de texto com as informações da conexão.
E neste arquivo, é preciso listar o modem que esta instalado e em qual porta (com3 ou com4)

[code]public void geraPbk(Telefone tel){

   String pbk = "[Conexao]"+
        "\n"+"Encoding=1"+
        "\n"+"Type=1"+
        "\n"+"AutoLogon=0"+
        "\n"+"UseRasCredentials=0"+
        "\n"+"DialParamsUID=2708750"+
        "\n"+"Guid=599BC288F97C8345A8D43165C93E1435"+
        "\n"+"BaseProtocol=1"+
        "\n"+"VpnStrategy=0"+
        "\n"+"ExcludedProtocols=3"+
        "\n"+"LcpExtensions=1"+
        "\n"+"DataEncryption=8"+
        "\n"+"SwCompression=1"+
        "\n"+"NegotiateMultilinkAlways=0"+
        "\n"+"SkipNwcWarning=0"+
        "\n"+"SkipDownLevelDialog=0"+
        "\n"+"SkipDoubleDialDialog=0"+
        "\n"+"DialMode=1"+
        "\n"+"DialPercent=75"+
        "\n"+"DialSeconds=120"+
        "\n"+"HangUpPercent=10"+
        "\n"+"HangUpSeconds=120"+
        "\n"+"OverridePref=15"+
        "\n"+"RedialAttempts=3"+
        "\n"+"RedialSeconds=60"+
        "\n"+"IdleDisconnectSeconds=1200"+
        "\n"+"RedialOnLinkFailure=1"+
        "\n"+"CallbackMode=0"+
        "\n"+"CustomDialDll="+
        "\n"+"CustomDialFunc="+
        "\n"+"CustomRasDialDll="+
        "\n"+"AuthenticateServer=0"+
        "\n"+"ShareMsFilePrint=0"+
        "\n"+"BindMsNetClient=0"+
        "\n"+"SharedPhoneNumbers=1"+
        "\n"+"GlobalDeviceSettings=0"+
        "\n"+"PrerequisiteEntry="+
        "\n"+"PrerequisitePbk="+
        "\n"+"PreferredPort="+
        "\n"+"PreferredDevice="+
        "\n"+"PreferredBps=0"+
        "\n"+"PreferredHwFlow=0"+
        "\n"+"PreferredProtocol=0"+
        "\n"+"PreferredCompression=0"+
        "\n"+"PreferredSpeaker=0"+
        "\n"+"PreferredMdmProtocol=0"+
        "\n"+"PreviewUserPw=1"+
        "\n"+"PreviewDomain=0"+
        "\n"+"PreviewPhoneNumber=1"+
        "\n"+"ShowDialingProgress=1"+
        "\n"+"ShowMonitorIconInTaskBar=1"+
        "\n"+"CustomAuthKey=-1"+
        "\n"+"AuthRestrictions=632"+
        "\n"+"TypicalAuth=1"+
        "\n"+"IpPrioritizeRemote=1"+
        "\n"+"IpHeaderCompression=1"+
        "\n"+"IpAddress=0.0.0.0"+
        "\n"+"IpDnsAddress=0.0.0.0"+
        "\n"+"IpDns2Address=0.0.0.0"+
        "\n"+"IpWinsAddress=0.0.0.0"+
        "\n"+"IpWins2Address=0.0.0.0"+
        "\n"+"IpAssign=1"+
        "\n"+"IpNameAssign=1"+
        "\n"+"IpFrameSize=1006"+
        "\n"+"IpDnsFlags=0"+
        "\n"+"IpNBTFlags=0"+
        "\n"+"TcpWindowSize=0"+
        "\n"+"UseFlags=1"+
        "\n"+"IpSecFlags=0"+
        "\n"+"IpDnsSuffix="+
        "\n\n"+"NETCOMPONENTS="+
        "\n"+"ms_server=0"+
        "\n"+"ms_msclient=0"+
        "\n\n"+"MEDIA=serial"+
        "\n"+"Port=COM3"+ //aqui preciso saber em que porta o modem esta instalado
        "\n"+"Device=Motorola SM56 Speakerphone Modem"+ //aqui o nome do dispositivo
        "\n"+"ConnectBPS=115200"+ //aqui a velocidade da porta do modem
        "\n\n"+"DEVICE=modem"+ //aqui simplesmente diz que é um modem que será usado na conexão
        "\n"+"PhoneNumber="+tel.getNumero()+ 
        "\n"+"AreaCode="+tel.getDdd()+
        "\n"+"CountryCode=1"+
        "\n"+"CountryID=55"+
        "\n"+"UseDialingRules=0"+
        "\n"+"Comment="+
        "\n"+"LastSelectedPhone=0"+
        "\n"+"PromoteAlternates=0"+
        "\n"+"TryNextAlternateOnFail=1"+
        "\n"+"HwFlowControl=1"+
        "\n"+"Protocol=1"+
        "\n"+"Compression=1"+
        "\n"+"Speaker=1"+
        "\n"+"MdmProtocol=0";      
       
    FileWriter arquivo;   
    
    try {  
        arquivo = new FileWriter(new File("C:/Documents and Settings/All Users/Dados de aplicativos/Microsoft/Network/Connections/Pbk/rasphone.pbk")); 
        arquivo.write(pbk);     
        arquivo.close();  
    } 
    catch (IOException e) {  
        e.printStackTrace();  
    }        
}[/code]

no caso esse caminho de pasta é valido no windows XP, não testei em outros ainda

Na verdade ontem eu consegui encontrar estas informações pelo registro do windows, consegui acessar estas mesmas informações através do prompt
exportando a chave de registro para um arquivo txt, mas ele vem em formato hexadecimal, pela interface gráfica do regedit eu consigo exportar em txt,
com texto normal, mas pelo prompt, fica um arquivo txt, com as informações em hexadecimal. mas isso foi ontem a noite, quando estava saindo do serviço
segunda feira eu dou mais uma fuçada, ja que os comandos que eu estava testando ficaram la, e aqui em casa nem tem modem pra testar…

Cara, achei esse outro link: http://www.planetadelphi.com.br/dica/85/como-achar-um-modem-e-sua-porta.
Novamente está em Delphi, mas é fácil de entender como ele funciona. Basicamente ele vai manipulando o resgistro para saber todas as portasdisponíveis no pc e testa cada uma pra saber se tem um modem instalado. No final, ele também pega o nome e o modelo do modem instalado. Isso resolve dois de seus problemas. Falta saber agora a velocidade da porta. Vou ver se encontro alguma coisa sobre isso.
Abs.

1 curtida