Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Wake On Lan (WOL) für Delphi 2007 / Indy (https://www.delphipraxis.net/95163-wake-lan-wol-fuer-delphi-2007-indy.html)

berens 2. Jul 2007 11:47


Wake On Lan (WOL) für Delphi 2007 / Indy
 
Hi, ich versuche gerade den Code aus der Library umzuschreiben, so dass man ihn mit Delphi 2007 und der aktuellen Indy benutzen kann (die bei Delphi 2007 dabei ist).

Problem: lUDPClient.SendBuffer(lUDPClient.Host, lUDPClient.Port, bs);
"Es gibt keine Überladene Version blabla" --> bs sollte vom falschen Typ sein. In der CodeVervollständigung steht zwar der Typ TBytes drinnen, die Indy-Hilfe sagt jedoch ich solle TIdBytes verwenden. Egal wie, das Programm mag weder mit dem Einen, noch mit dem anderen Typen kompilieren.

Irgendeine Idee?

Edit: Falls ich wirklich alles mit TidBytes fülle kommt der I/O Fehler 105. Was auch immer das bedeutet.
Edit2: Es geht um Indy10. Indy9 würde wohl funktionieren laut den anderen Beispielen. Ich hasse Indy *grummel*


Delphi-Quellcode:
unit uWakeOnLan;

interface

implementation

uses
  WinTypes, Messages, SysUtils, Classes, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient;


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;
  bs: TBytes;
begin
  try
    SetLength(bs, 116);
    for i := 0 to 5 do
    begin
      bs[i] := HexToInt(aMacAddress[(i * 2) - 1] + aMacAddress[i * 2]);
    end;
    bs[6] := $00;
    bs[7] := $74;
    bs[8] := $FF;
    bs[9] := $FF;
    bs[10] := $FF;
    bs[11] := $FF;
    bs[12] := $FF;
    bs[13] := $FF;
    for j := 1 to 16 do
    begin
      for i := 1 to 6 do
      begin
        bs[14 + (j - 1) * 6 + (i - 1)] := bs[i];
      end;
    end;
    bs[115] := $00;
    bs[114] := $40;
    bs[113] := $90;
    bs[112] := $90;
    bs[111] := $00;
    bs[110] := $40;
    try
      lUDPClient := TIdUDPClient.Create(nil);
      lUDPClient.BroadcastEnabled := true;
      lUDPClient.Host := '255.255.255.255';
      lUDPClient.Port := 2050;
      lUDPClient.SendBuffer(lUDPClient.Host, lUDPClient.Port, bs); // <-- hier das Problem
      writeln('Trying to wake-up remote host: ' + aMacAddress);
    finally
      lUDPClient.Free;
    end;
  except
   on E: Exception do writeln('There was an error');
  end;
end;

end.

berens 3. Jul 2007 10:43

Re: Wake On Lan (WOL) für Delphi 2007 / Indy
 
Habe das Problem lösen können, unter anderem mit Hilfe von http://www.swissdelphicenter.ch/torr...de.php?id=1556 .

Hier die komplette Unit, vielleicht mag das ja mal jemand als Aktualisierung in die Library hinzufügen:

Delphi-Quellcode:
unit uWakeOnLan;

interface

uses
  WinTypes, Messages, SysUtils, Classes, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, IdGlobal;

procedure WakeUPComputer(aMacAddress: string);

implementation

procedure WakeUPComputer(aMacAddress: string);
var
  Data: string;
  temp: string;
  k, n: integer;
  idUDPClient: TIdUDPClient;
begin
  try

    SetLength(Data, 255);
    for k := 0 to 5 do
    begin
      Data := Data + Chr(StrToInt('$FF')); // 6x add a FF / 6x ein FF hinzufügen
    end;
    temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);
    for k := 0 to 15 do
    begin
      temp := StringReplace(aMacAddress, '-', '', [rfReplaceAll]);
      for n := 0 to 5 do
      begin
        // 16x add Target-Mac-Adress / 16x die Ziel-Macadresse hinzufügen
        Data := Data + Chr(StrToInt('$' + temp[1] + temp[2]));
        Delete(temp, 1, 2);
      end;
    end;

    try
      idUDPClient := TIdUDPClient.Create(NIl);
      idUDPClient.BroadcastEnabled := true;
      idUDPClient.Host := '255.255.255.255';
      idUDPClient.Port := 80;
      idUDPClient.Send(Data);
    finally
      FreeAndNil(idUDPClient);
    end;
  except
  end;
end;

end.

himitsu 5. Mai 2014 13:57

AW: Wake On Lan (WOL) für Delphi 2007 / Indy
 
So richtig gut wurde aber nicht von Torry abgeschrieben.
Am Anfang die 255 Zeichen waren da noch nicht drin.

Das Create gehört gefälligst vor das Try und das erste
Delphi-Quellcode:
Temp :=
ist auch nutzlos.
Da hat wohl jemand nicht auf das gehört, das der Compiler einem zu sagen hat. :roll:


----------------

Ursache: http://www.delphipraxis.net/180255-w...n-problem.html

Code für Indy 10 und Unicode-Delphis:
Delphi-Quellcode:
procedure WakeOnLAN(MacAddr: string; Port: TIdPort=80; Host: string='255.255.255.255');
var
  MacAddr: string;
  Data:   TIdBytes;
  Temp:   array[0..5] of Byte;
  i:      Integer;
begin
  MacAddr := StringReplace(MacAddr, '-', '', [rfReplaceAll]);
  Assert(Length(MacAddr) = 6 * 2);
  SetLength(Data, (1 + 16) * 6);

  FillChar(Temp, 6, $FF);
  Move(Temp, Data[0], 6); // 6x FF (1x FFFFFFFFFFFF)

  HexToBin(PChar(MacAddr), Temp, 6);
  for i := 1 to 16 do
    Move(Temp, Data[i * 6], 6); // 16x Target-MAC-Adress

  IdUDPClient1.SendBuffer(MacAddr, Port, Data);
end;
(ich hoffe mal der funktioniert auch, da blind dahingetippt und ungetestet)

Darlo 6. Sep 2016 21:05

AW: Wake On Lan (WOL) für Delphi 2007 / Indy
 
Hallo,

ich grabe mal den Thread hier aus, da das WakeOnLan bei mir nicht mehr funktioniert.
Im letztem Codebeispiel habe ich den kleinen Vertipper
IdUDPClient1.SendBuffer(MacAddrHost, Port, Data);
korrigiert, leider startet der Rechner nicht.

Gegeben:
Delphi 10.1 Enterprise
Win10 Pro 64 bit
Schnellstart deaktiviert
BIOS und Energieeinstellungen überprüft.

Über die FritzBox kann ich den Rechner per WOL starten, leider nicht mit Delphi.
Kennt jemand das Problem, liegt es ggf. am 64 Bit System?

Tonic1024 7. Sep 2016 08:22

AW: Wake On Lan (WOL) für Delphi 2007 / Indy
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Darlo (Beitrag 1346994)
Im letztem Codebeispiel habe ich den kleinen Vertipper
IdUDPClient1.SendBuffer(MacAddrHost, Port, Data);
korrigiert, leider startet der Rechner nicht.

Und du siehst da keinen Zusammenhang? :wink:

WOL funktioniert nur mit MAC Adressen. Aber Wie Himitsu schon sagte, er hat es nicht getestet. Und ich glaub es fehlt auch was. Du müsstest den oberen Code um seine Ergänzungen erweitern/ändern. dann sollte das klappen.

Ich verwende seit Jahren diese Unit aus meiner persönlichen Codesammlung erfolgreich. Ich glaub die stammt auch aus der DP. Möglich, dass ich dran herum optimiert hab. Das sähe mir ähnlich. Falls der Autor sie wieder erkennt: Dickes, dickes Dankeschön!

Gruß,

Toni

Darlo 7. Sep 2016 14:22

AW: Wake On Lan (WOL) für Delphi 2007 / Indy
 
Hast Du auch eine Crossplattform-Lösung?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz