Seu Curso

  • Full Screen
  • Wide Screen
  • Narrow Screen
  • Increase font size
  • Default font size
  • Decrease font size

Radar de redes sem fio usando Delphi

Imprimir
Avaliação do Usuário: / 14
PiorMelhor 


Esse projeto visa mostrar, entre outras coisas, como executar comandos do shell do Windows dentro de uma aplicação feita em Delphi e uma sugestão de como acessar o resultado da execução desses comandos para extrair alguns dados.

Como a proposta é obter todas as redes sem fios captadas pelo computador será necessário ter instalado uma interface de rede sem fio (placa de rede WiFi), mas esse não é fator determinante visto que o comando usado pode ser alterado facilmente para obter quaisquer dados que você desejar.

Construindo:

1. Crie um novo projeto;

2. No formulário coloque um componente TMemo, um TLabel e um TButton;
a. Para o TMemo acesse as propriedades Lines e apague o texto padrão existente nela e para a propriedade ScrollBars coloque o valor ssVertical;
b. Para o TButton coloque na propriedade CAPTION o texto “Captar”;

3. Crie um arquivo chamado executa.bat no mesmo local onde gravou seu projeto com o seguinte conteúdo:

@netsh wlan show networks mode=Bssid > dados.txt

4. Clique duas vezes no botão “Captar” e vamos declarar as seguintes variáveis para a PROCEDURE onClick:

var  arquivo : TextFile;
linha, resultado : String;
i, j, inicio : Integer;

5. Agora para o corpo da PROCEDURE digite:

WinExec('executa.bat',SW_HIDE);                    
while NOT FileExists('dados.txt') do Sleep(1000);   
memo1.Lines.Clear;
AssignFile(arquivo,'dados.txt');
Reset(arquivo);
while NOT EOF(arquivo) do
begin
ReadLn(arquivo,linha);
memo1.Lines.Add(Trim(linha));
end;
CloseFile(arquivo);
DeleteFile('dados.txt');
while FileExists('dados.txt') do Sleep(1000);  
for i := 1 to memo1.Lines.Count -1 do
begin
if UpperCase(Copy(memo1.Lines[i],0,4)) = 'SINA' then
begin
inicio := 0;
for j := 0 to Length(memo1.Lines[i]) - 1 do
begin
if copy(memo1.Lines[i],j,1) = ':' then
begin
inicio := j;
break;
end;
end;
Label1.Caption := trim(copy(memo1.Lines[i],inicio+1,length(memo1.lines[i])-inicio));
end;
end;

Entendendo o Código:

Como a ideia é executar um comando do shell do Windows e capturar seu resultado precisamos criar um arquivo contendo esse resultado já que o Delphi não possibilita que façamos isso de uma forma direta. Sendo assim criamos um script para executar o seguinte comando:

@netsh wlan show networks mode=Bssid > dados.txt

O arroba diz que não é preciso repetir o comando na tela ao executá-lo e o comando netsh wlan networks mode=Bssid mostra todas as redes sem fio captadas pela placa de rede WiFi que sejam do modo infraestrutura, ou seja, possuam ao menos um Bssid. Com o sinal de maior direcionamos o que seria exibido na tela para o arquivo dados.txt.

No Delphi executamos esse arquivo com a seguinte linha:

WinExec('executa.bat',SW_HIDE);

Logo em seguida temos um while que aguarda que o arquivo dados.txt seja criado para continuar a execução. A cada laço que detectar que o arquivo ainda não existe aguarda 1 segundo.

while NOT FileExists('dados.txt') do Sleep(1000);

Em seguida o conteúdo do component TMemo é limpo e o arquivo dados.txt é lido para esse componente. Primeiro temos que determinar que a variável arquivo representa o arquivo físico dados.txt. Em seguida abrimos o arquivo somente para leitura com o comando RESET.

No laço WHILE repete-se a leitura de cada linha do arquivo até que seu final seja encontrado. O comando TRIM remove os espaços em branco da esquerda e da direita de uma string:

memo1.Lines.Clear;
AssignFile(arquivo,'dados.txt');
Reset(arquivo);
while NOT EOF(arquivo) do
begin
ReadLn(arquivo,linha);
memo1.Lines.Add(Trim(linha));
end;
CloseFile(arquivo);

Uma vez criado e lido podemos descartar o arquivo dados.txt, o que fazemos nas linhas abaixo. Como na criação do arquivo foi criado um laço WHILE que aguarda que o arquivo seja efetivamente excluído.

DeleteFile('dados.txt');
while FileExists('dados.txt') do Sleep(1000);

Para terminar corremos todas as linhas do componente MEMO em busca da palavra SINAL e capturamos o que vier depois do sinal de dois pontos que é a porcentagem de sinal captado para aquela rede. Dessa forma colocamos no LABEL o valor do sinal da rede sem fio captada se ela for única ou o sinal da última rede sem fio captada. Tendo esse exemplo fica fácil consegui obter todas os dados que você desejar e utilizá-lo da forma que quiser.

for i := 1 to memo1.Lines.Count -1 do
begin
if UpperCase(Copy(memo1.Lines[i],0,4)) = 'SINA' then
begin
inicio := 0;
for j := 0 to Length(memo1.Lines[i]) - 1 do
begin
if copy(memo1.Lines[i],j,1) = ':' then
begin
inicio := j;
break;
end;
end;
Label1.Caption := trim(copy(memo1.Lines[i],inicio+1,length(memo1.lines[i])-inicio));
end;
end;

Executando:

Execute seu programa e clique no botão “Captar”. No componente MEMO você verá o resultado da execução do comando shell do Windows e no LABEL a porcentagem do sinal da última rede captada:

Caso você obtenha uma mensagem de erro como a abaixo é porque o Windows sinalizou a existência do arquivo dados.txt, mas não o criou ainda efetivamente. Esse problema pode ser solucionado aumentando-se o tempo de espera para essa operação, basta para a execução e tentar novamente.


Agora basta um pouco de imaginação e tratar o texto obtido para desenvolver uma aplicação mais refinada.

Adicionar comentário


Código de segurança
Atualizar

You are here: