Buscar

Como ligar computador remotamente atraves da rede - wake on lan

Código

Wol -
Wake On Lan (WOL) é uma tecnologia que permite remotamente ligar um computador ou reanimar o mesmo a partir de um estado de espera. Isso permite que o computador não precise de ninguém perto para ser ligado. Até pela Internet o mesmo pode ser feito.

WOL funciona enviando um dado (DATA or FRAME), ou pacotes, para a máquina cliente de um servidor, que está conectado remotamente na rede e tem um determinado software de rede instalado. A placa de rede do cliente recebe o FRAME de Wake UP e automaticamente liga o pc.
O pacote é gerado a partir do mac address da placa.
Obs: A placa de rede da maquina a ser ligada deve ter o recuso wol ativado ou na placa de rede ou na bios.

Voce deve fornecer a porta, macaddress e ip do host.
Exemplo.
      lUDPClient.BroadcastEnabled := true;
      lUDPClient.Host := '255.255.255.0';
      lUDPClient.Port := 7;

Para a rede interna recomenda-se usar broadcast.

Use o mac address sem caracteres especiais.
Exemplo.
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     wakeupcomputer(0034f4b3ea3d);
    end;

Fiz testes e funcionou.

Duvidas fabiano.klein@gmail.comLi

///////// ======== /////////


  uses
  Windows, Messages, SysUtils, Variants, Classes,
  Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinTypes, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, IdTCPConnection, IdTCPClient,
  IdTCPServer, IdHTTPServer;


//////// ======= ///////////


Function HexToInt(S:String): LongInt;
const
  DecDigits: Set Of '0'..'9' = ['0'..'9'];
  HexVals: Array [0..$F] Of Integer = (0, 1, 2, 3, 4, 5, 6, 7,
     8, 9, $A, $B, $C, $D, $E, $F);
  UpCaseHexLetters: Set Of 'A'..'F' = ['A'..'F'];
  LowCaseHexLetters: Set Of 'a'..'f' = ['a'..'f'];
var
  v: LongInt;
  i: integer;
  LookUpIndex: integer;
begin
  if length(S) <= 8 then begin
    v := 0;
    for i := 1 to length(S) do begin
       {$R-}
         v := v Shl 4;
       {$R+}
       if S[i] in DecDigits then begin
          LookUpIndex := Ord(S[i]) - Ord('0');
       end
       else begin
          if S[i] in UpCaseHexLetters then begin
             LookUpIndex := Ord(S[i]) - Ord('A') + $A;
          end
          else begin
             if S[i] in LowCaseHexLetters then begin
                LookUpIndex := Ord(S[i]) - Ord('a') + $A;
             end
             else begin
                LookUpIndex := 0;
             end;
          end;
       end;
       v := v Or HexVals[LookUpIndex];
    end;
    result := v;
  end
  else begin
    result := 0;
  end;
end;

procedure WakeUPComputer(aMacAddress: string);
var
  i, j: Byte;
  lBuffer: array[1..116] of Byte;
  lUDPClient: TIDUDPClient;
begin
  try
    for i := 1 to 6 do begin
      lBuffer[i] := HexToInt(aMacAddress[(i * 2) - 1] +
         aMacAddress[i * 2]);
    end;
    lBuffer[7] := $00;
    lBuffer[8] := $74;
    lBuffer[9] := $FF;
    lBuffer[10] := $FF;
    lBuffer[11] := $FF;
    lBuffer[12] := $FF;
    lBuffer[13] := $FF;
    lBuffer[14] := $FF;
    for j := 1 to 16 do begin
      for i := 1 to 6 do begin
        lBuffer[15 + (j - 1) * 6 + (i - 1)] := lBuffer[i];
      end;
    end;
    lBuffer[116] := $00;
    lBuffer[115] := $40;
    lBuffer[114] := $90;
    lBuffer[113] := $90;
    lBuffer[112] := $00;
    lBuffer[111] := $40;
    try
      lUDPClient := TIdUDPClient.Create(nil);
      lUDPClient.BroadcastEnabled := true;
      lUDPClient.Host := '255.255.255.0';
      lUDPClient.Port := 7;
      lUDPClient.SendBuffer(lBuffer, 116);
    finally
      lUDPClient.Free;
    end;
  except
   on E: Exception do showmessage('Ocorreu um erro');
  end;
end;

///////////////===========/////////////

 

Publicidade

Vote na dica




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes da dica

Categoria: Rede
Adicionada dia: 20/08/07
Por: Fabiano
Visualizada: 12887 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009