close

Wake On LAN 簡稱 WOL

是可以用網路喚醒電腦的一種技術


不過本篇重點是在如何自己做WOL的APP 所以其他細節設定就不再贅述

簡言之就是要用UDP 傳送一段封包到區網就能喚醒電腦


參考網址 https://blog.csdn.net/u011913612/article/details/51833436

首先 先弄一個接收測試程式 看接收到的訊息是甚麼 (可以先下載其他WOL APP 傳送 然後抓封包)

測試程式實作如下

先拉一個 TIdUDPServer 由於只是測試用 就不改名子 直接叫IdUDPServer1

//啟動直接接收訊息
procedure TForm1.FormCreate(Sender: TObject);
begin
  IdUDPServer1.Active := True;
end;
 
//接收事件
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  i: integer;
  s: string;
begin
  //顯示純數字
  for i := 0 to Length(AData)-1 do
    s := s + IntToStr(AData[i]) + ' ';
  s := s + #13;
  
  //顯示16進位
  for i := 0 to Length(AData)-1 do
    s := s + IntToHex(AData[i], 2) + ' ';
 
  ShowMessage(s);
end;
 
使用其他WOL APP 送出封包 確認跟參考網址的規則一樣
接下來就是自己開發APP 送出 看收到的跟其他WOL APP 送出的內容是否一致
首先宣告一個type
 
//網卡資料類型
TMacAddr = array[0..5] of integer;
 
拉一個按鈕 代表WOL喚醒
 
procedure Tfrm_Main.btn_WOLClick(Sender: TObject);
var
  aBuff: TIdBytes; //記得uses IdGlobal;
 
  //填入封包內容
  procedure GetMagicPacket(aMacAddr: TMacAddr);
  var i, j: integer;
  begin
    SetLength(aBuff, 6 * 17); //六個FF + 16次網卡位置
 
    //六個FF
    for i := 0 to 5 do
      aBuff[i] := $FF;
 
    //16次網卡位置
    for I := 0 to 15 do
      for j := 0 to Length(aMacAddr)-1 do
        aBuff[6 + i * length(aMacAddr) + j] := aMacAddr[j];
  end;
 
const MyMacAddr: TMacAddr =($00,$15,$17,$53,$D4,$F9); //我自己的網卡位置
 
begin
  with TIdUDPClient.Create(Self) do begin
    GetMagicPacket(MyMacAddr);
    Broadcast(aBuff, 9);
    Free;
  end;
end;
 

原本以為是自己填入廣播IP 跟Port 9就可以了 像以下這樣

Host := '192.168.10.255';
Port := 9;

SendBuffer(aBuff);

在win32底下是會過的
但是在android上運行會跳權限錯誤 socket error #13 access denied

後來是參考這篇
https://stackoverflow.com/questions/11457676/python-socket-error-errno-13-permission-denied

看來是android 有鎖住不可以直接發255廣播
所以必須使用 Broadcast

arrow
arrow
    文章標籤
    WOL XE10
    全站熱搜
    創作者介紹
    創作者 抓狂小白 的頭像
    抓狂小白

    抓狂小白的程式筆記

    抓狂小白 發表在 痞客邦 留言(0) 人氣()