[Electronics] Arduino verschickt Wake-On-LAN Pakete
Nachdem ich ja im Einführungspost es ja angekündigt hatte, hab ich es nun auch in die Tat umgesetzt und mein neues Arduinoboard um die Funktionalität erweitert Wake-On-LAn-Pakete (WOL-Pakete) zu verschicken. Prinzipiell hab ich nicht viel verändert, da in der Bibliothek zu meine EtherShield schon so gut wie alles drin war. Es musste nur noch eine Funktion her, die die Magic-Packets zusammenbaut und anschließend auch versendet.
Kombiniert mit dem rudimentären Webinterface aus den Beispielen, könnte nun an jede x-beliebige MAC-Adresse ein solche Paket verschickt werden. Ein weitere Vorteil der Mikrocontroller-Lösung ist auf jeden Fall, dass man ARP-Pakete ohne root-Rechte erzeugen und verschicken kann.
Versuche das Ganze als Applikation für Linux und Windows zu realisieren, scheiterten oftmals daran das unter Linux root-Rechte erforderlich waren oder man unter Windows nicht weit genug im OSI-Modell herunterkam um ARP-Pakete (diese können so gut wie garnicht von Firewalls geblockt werden) zu erzeugen.
Ein kleines Tool, realisiert mit Qt gibt es indes schon, allerdings basiert diese Lösung auf UDP, was natürlich keine Empfangsgarantie liefert und darüber hinaus noch eine IP-Adresse benötigt.
Da mein EtherShield auf dem ENC28J60 basiert und dieser wohl nicht dem Standard-Ethershield von Arduino.cc entspricht sei darauf hingewiesen, dass die Änderungen bzw. ein Übernehmen des Patches dort nicht funktionieren werden. Allerdings sollte es auch dort kein Problem sein so etwas zu implementieren.
Ardunio EtherShield WOL patch - Patch for Arduino EthernetShield Libary (bases on enc28j60)
Quellcode der Änderungen :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | void make_arp_magicpacket(uint8_t *buf, uint8_t *dstmacaddr) { uint8_t i = 0; uint8_t offset = 0; // fill ethernet header while(i<6){ buf[ETH_DST_MAC +i]=dstmacaddr[i]; buf[ETH_SRC_MAC +i]=macaddr[i]; i++; } /* ARP packet type*/ buf[12] = 0x08; buf[13] = 0x42; /* sync stream */ buf[14] = 0xff; buf[15] = 0xff; buf[16] = 0xff; buf[17] = 0xff; buf[18] = 0xff; buf[19] = 0xff; offset = 20; /* dstmac 16 times */ for (i = 0; i < 16; i++) { memcpy(buf+offset, dstmacaddr, 6); offset += 6; } // eth+arp+wol is 116 bytes: enc28j60PacketSend(116, buf); } |
