2009年11月30日

WOL未対応パソコンの電源をマジックパケットでオン解決編

※なんだかよく分からないけど、arduino WOLリピーターを作りたい方は、こちらの初心者用の説明をどうぞ

WOL未対応のパソコンでもマジックパケットで外部ネットワークから電源を入れる。「arduino+ethernet shield」なら簡単です。

必要なものは、「arduino」「イーサネット・シールド」小型リレーダイオード、半田と半田コテ、そして多少の線材です。

あと、必要に応じて、ブレッドボードなどです。

まずは回路図

WOL未対応のパソコンでもマジックパケットで外部ネットワークから電源オン

WOLrepSw.jpg実際は、こんな感じのたいへんシンプルなもの。
←クリックで拡大です。


使い方は、対象パソコンがWOLに対応している場合、たとえば自宅のPCから、職場のグローバルIPのポート7番にマジックパケットを飛ばします。この際、対象PCのMACアドレス宛てに送れば、「arduino Wake On LAN リピーター」として動作するので、問題なく対象PCの電源が入ります。

対象パソコンがWOLに対応していない場合、リレーの出力をマザーボード(実際の電源スイッチと並列につないでも可)につなぎます。これはWOL未対応でも直接電源ボタンを手で操作するのと同じ効果なので電源のオン/オフはもちろん、電源ボタン長押しによる強制切断にも対応します。

下記のスケッチ上の「Target PCのMAC addressをセット」の部分にWOL未対応PCのMACアドレスを入れてスケッチをarduinoに転送します。回路図通り接続が完了している事が前提で、WOL対応PCの場合と同じく外部ネットワークからマジックパケットを飛ばせばリレーが1秒オンになりPCの電源が入ります。

外部ネットワークからMACアドレスの1バイト目(一番左のバイト)を「FF」に変更してマジックパケットを飛ばせばリレーが10秒オンになり、PCの電源がオンであったなら、強制的に電源オフになります。

以下、スケッチ


// Wake On Lan リピーター (WOL未対応パソコン対応版)

// 遠隔でパソコンの電源ボタンを直接操作します

// 遠隔でパソコンの電源ボタン長押し(電源強制切断)にも対応


// http://yutakalife.net/article/134256657.html

// 販売などの商用利用はご遠慮ください
// Copyright love4nature All Rights Reserved.
#include <WString.h>
#include <Ethernet.h>
#include <UdpRaw.h>

byte TargetMac[] = { 0x00,0x00,0x00,0x00,0x00,0x00 }; // Target PCのMAC addressをセット

// イーサネットの設定
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //MAC address
byte ip[] = { 192, 168, 1, 200 }; // Arduino のIP address
byte gw[] = { 192, 168, 1, 1 }; // Gateway IP address
int localPort = 7; //local port to listen on

// ターゲットのブロードキャストアドレスを指定
byte targetIp[] = { 192, 168, 1, 255};
int targetPort = 8000;

#define MAX_SIZE 192
// パケットサイズの最大値を設定
byte packetBuffer[MAX_SIZE]; // 受信パケット用バッファ
int packetSize; // 受信パケットのサイズが格納される
byte remoteIp[4]; // 送信元のIPアドレスを格納
unsigned int remotePort; // 送信元のポート番号を格納

int i;
int verification;

void setup() {
Ethernet.begin(mac,ip,gw);
UdpRaw.begin(localPort);
pinMode(2, OUTPUT); // 2番ピンを出力に設定
Serial.begin(9600);
}

void loop() {

// 受信データがあれば実行
if(UdpRaw.available()) {
packetSize = UdpRaw.readPacket(packetBuffer,MAX_SIZE,remoteIp,(uint16_t *)&remotePort);

Serial.print("Received packet of size ");
Serial.println(abs(packetSize));

Serial.print("From IP ");

for(i=0; i<3; i++) {
Serial.print(remoteIp[i],DEC);
Serial.print(".");
}
Serial.print(remoteIp[3],DEC);

Serial.print(" Port ");
Serial.println(remotePort);

if(packetSize < 0) {
// if return value <0 the packet was truncated to fit into our buffer
Serial.print("ERROR: Packet was truncated from ");
Serial.print(packetSize*-1);
Serial.print(" to ");
Serial.print(MAX_SIZE);
Serial.println(" bytes.");
}

Serial.println("Contents:");

for(i=0; i<min(MAX_SIZE,abs(packetSize)); i++) {
Serial.print(packetBuffer[i],HEX);
Serial.print(" ");
}
Serial.println("");

// Target PCのMAC当てMagicPacketを受信でリレーをオン
for(i=6; i<102; i++) {
int j = abs((102 - i) % 6 - 6);
if ( j == 6 ) j = 0;
if (TargetMac[j] == packetBuffer[i]) verification++;
if (j == 0) {
if(packetBuffer[i] == 0xFF) verification += 2;
}
}

// 受信したMagicPacketの宛先が、Target PCのMACアドレス1バイト目が0xFFで
// 他の5バイトが完全に一致ならリレーオン時間が10秒(パソコンの強制電源オフ)
if(verification>=112){
Serial.println("RELAY ON for 10000ms");
digitalWrite(2, HIGH); // リレーオン
delay(10000); // 10000ミリ秒待つ
digitalWrite(2, LOW);
}else{
// 受信したMagicPacketの宛先が、Target PCのMACアドレスと完全に一致なら
// リレーオン時間が1秒(パソコンの通常電源オフ/オン)
if(verification>=96){
Serial.println("RELAY ON for 1000ms");
digitalWrite(2, HIGH); // リレーオン
delay(1000); // 1000ミリ秒待つ
digitalWrite(2, LOW);
}
}

// マジックパケットを送信
UdpRaw.sendPacket(packetBuffer,packetSize,targetIp,targetPort);
Serial.println("Start port forwarding to broadcast address:");
for(i=0; i<3; i++) {
Serial.print(targetIp[i],DEC);
Serial.print(".");
}
Serial.print(targetIp[3],DEC);
Serial.println("");
Serial.println("Done!");
}
verification = 0;
//wait a bit
delay(10);
}

arduinoは、ピンのシンク、ソース電流ともに40mAまで流せます。秋月で購入のこの小型リレーなら25mA程度しか流れないので問題なし。回路がシンプルで済みます。
posted by love4nature at 01:00| Comment(0) | TrackBack(0) | 趣味の部屋 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/134256657
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。