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 送出的內容是否一致
接下來就是自己開發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
文章標籤
全站熱搜
留言列表