24.11.2009

Wake On Lan ( MagicPacket ) Repeater & Switcher



in Japanese
arduino WOL Repeater
Wake On Lan ( MagicPacket ) Repeater & Sender
Wake On Lan ( MagicPacket ) Repeater & Switcher

I made a "arduino WOL Repeater" with ethernet shield.

At this time, I just made additional function for arduino WOL Repeater.

You can turn on your computer even it does not support WOL.

"Wake On Lan ( MagicPacket ) Repeater & Switcher" is very simple to made, please see the schematic. Wake On Lan Repeater & Switcher is using bjoern / arduino_osc Library for UDP.

I am using "sndmagic version 0.2" to send a magic packet from outside of network.

You can get "sndmagic" following website:
http://www.st.rim.or.jp/~yumo/pub/sndmagic_chglog.html

If you have got other software, please change the value of localPort.

Wake On Lan ( MagicPacket ) Repeater & Sender


// Wake On Lan ( MagicPacket ) Repeater & Switcher
// Wake On Lan Repeater & Remote Power Button Control
// Support forced release.
// http:yutakalifenet.up.seesaa.net/html/WOLRepSw.html
// Digital 2, output for relay

#include <WString.h>

#include <Ethernet.h>
#include <UdpRaw.h>

byte TargetMac[] = { 0x00,0x00,0x00,0x00,0x00,0x00 }; // set a MAC for Target PC

// ETHERNET CONFIGURATION
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

// set a target broadcast address
byte targetIp[] = { 192, 168, 1, 255}; // set this value like "x.x.x.255"

int targetPort = 8000; // target port

#define MAX_SIZE 192         
// maximum packet size
byte packetBuffer[MAX_SIZE]; // buffer to hold incoming packet
int packetSize;              // holds received packet size

byte remoteIp[4];            // holds recvieved packet's originating IP
unsigned int remotePort;     // holds received packet's originating port

int i;
int verification;


void setup() {
    Ethernet.begin(mac,ip,gw);
    UdpRaw.begin(localPort);
    pinMode(2, OUTPUT); // initialize D2 pin as an output
    Serial.begin(9600); 
}

void loop() {

    // to forward a packet, if incoming packet is available

    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("");

        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;
            }
        }

        // if first byte of Target MAC is 0xFF, relay is ON for 10sec

        if(verification>=112){
            Serial.println("RELAY ON for 10000ms");
            digitalWrite(2, HIGH); // relay is ON 
            delay(10000);           // wait for 10sec

            digitalWrite(2, LOW);
        }else{
            // if receive MagicPacket to Target PC, then relay is ON for 1sec
            if(verification>=96){
                Serial.println("RELAY ON for 1000ms");
                digitalWrite(2, HIGH); // relay is ON 

                delay(1000);           // wait for 1sec
                digitalWrite(2, LOW);
            }
        }

        // send a magic packet
        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);  
}