24.11.2009
Wake On Lan ( MagicPacket ) Repeater & Switcher
arduino WOL Repeater
Wake On Lan ( MagicPacket ) Repeater & Sender
Wake On Lan ( MagicPacket ) Repeater & Switcher
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 & 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); }