WOL Server mit Arduino

Der Hintergrund zur Idee und wofür ich das ganze brauche, könnt ihr in dem Artikel VPN Server on Demand nachlesen.

In diesem Beitrag will ich ein bisschen tiefer auf die Installation, den Ablauf und den Code eingehen. Dazu ist der Beitrag in drei grobe Abschnitte unterteilt.

Zusammengefasst macht der Arduino folgends:

  1. Nach dem Start verbindet er sich mit einem WLAN
  2. Es wird ein zufälliger Startcode generiert und an eine E-Mail Adresse versendet
  3. Der Arduino stellt einen UPD Server bereit, über welchen man den Startcode eingeben kann.
  4. Ist dieser korrekt, sendet er ein WOL Packet an ein Zielgerät

Vorab, hier findet ihr eine komprimierte Beschreibung des Projekts und alles wichtige auf Github.


Voraussetzungen

  • Als Hardware hab ich einen einfachen ESP8266 auf einem D1 mini* Board verwendet. Wie man dieses Einrichtet ist hier beschrieben: Arduino ESP8266 einrichten.
  • Da der ESP8266 kein LAN Anschluss hat sondern ein Wifi Chip besitzt, müsst ihr einen WLAN AP im Einsatz haben mit welchem sich der Arduino verbinden kann.
  • Für den E-Mail Versand und Empfang benötigt ihr Zugriff auf einem Mail Server.
  • Um mit dem Arduino kommunizieren zu können benötigt ihr ein Tool mit welchem ihr UDP Packete empfangen und verschicken könnt. z.B. ncat

Einbinden von zusätzlichen Bibliotheken

Ich verwende für den E-Mail Versand und den Ping des Server zwei zusätzliche Bibliotheken, diese müsst ihr runterladen und in den libraries Ordner der Arduino IDE kopieren. Default:

 C:\Program Files (x86)\Arduino\libraries

Die beiden Bibliotheken findet ihr entweder direkt in meinem Github Repository oder auf den einzelnen Github Seiten:

Sendmail: https://github.com/gpepe/esp8266-sendemail

Ping: https://github.com/dancol90/ESP8266Ping

In der Datei

libraries\ESP8266Ping-master\src\ESP8266Ping.impl.h  

musste ich noch die Zeile 30 ändern:

Von: _min_time = INT_MAX; nach _min_time = 0;

Wenn ihr die Datei von meine Repository nehmt, ist dasbereits angepasst.


config.h anpassen

Nachdem die Bildbibliotheken eingebunden sind ladet euch die zwei Dateien Basic.ino und config.h in einen lokalen Ordner und startet die Basic.ino Datei.

Damit der Arduino sich mit eurem WLAN Verbinden, E-Mails verschickt und WOL Packete korrekt verschickt, müsst ihr die config.h anpassen.

W-LAN Einstellungen

Da der Arduino später über eine Portfreigabe von extern erreichbar sein soll, vergeben wir dem Arduino hier gleich eine feste IP. Achtet darauf, dass die IP außerhalb des DHCP Bereichs von eurem Router liegt.

// wifi settings
#define SSID "Wifi SSID"
#define PASSWORD "Wifi password"
IPAddress ip(192,168,1,5);   
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0); 

WOL Ziel Einstellungen

In dem nächste Block in der Config gebt ihr die Informationen des Gerätes an, welches ihr aufwecken wollt.

// target domain, local WOL IP, MAC and broadcast address
const char* dynDNS = "yourDomain.dyndns.org";
IPAddress serverIP (192, 168, 1, 10);
// example for Mac: 2C:FD:A1:B8:9B:2D
byte mac[] = {0x2C, 0xFD, 0xA1, 0xB8, 0x9B, 0x2D};
byte bc[] = {192, 168, 1, 255};
  • dynDNS = Ist optional und wir später nur im E-Mail Text verwendet
  • serverIP = Die IP wird für die spätere Prüfung gebraucht ob der Server online ist (anhand von einem Ping)
  • bc = Die Broadcast Adresse ist die Adresse, an welche das WOL Packet geschickt wird. In diesem Broadcast muss eure Ziel IP liegen.
  • mac = Die MAC Adresse eures Ziel Gerätes, muss hier ohne Punkte und mit einem 0x vor jedem Byte angegeben werden.

E-Mail Einstellungen

Die Einstellungen sollten soweit eigentlich selbsterklärend sein. Achtet ggf. darauf das euer SMTP Server keinen Verwand an einen „unbekannten“ Empfänger erlaubt. Das heißt für einen ersten Test habe ich als Empfänger Adresse die gleiche wie den Absender verwendet.

// email settings
const char* smtp_server = "smtp_server";
const int   smtp_port = 465;
const char* smtp_login = "smtp_login";
const char* smtp_password = "smtp_password";
const int   smtp_timeout = 5000;
const bool  smtp_ssl = true;
const char* mail_from = "mail_from";
const char* mail_to = "mail_to";

Sonstige Einstellungen

Zuletzt noch ein paar globale Einstellungen.

Der Port über welchen ihr später mit dem Arduino sprechen könnt

// UDP server port
#define PORT 5444

Die Anzahl der Fehlversuche, bevor der Arduino den Code ablehnt und einen neuen geniert.

// max. false code tries
int code_tries = 3;

Die Wartezeit in Sekunden nach dem senden eines WOL Packetes

// delay between WOL sending
byte senddelay = 10;

Die Anzahl, wie oft ein WOL Packet verschickt wird falls der Server nicht erreichbar ist.

// WOL send retries
const int retryCount = 3;


Verwendung

Sind alle Einstellungen vorgenommen, sollte sich der Arduino mit dem angegeben WLAN verbinden. Die LED sollte dann leuchten.

Die Ausgabe auf dem Serial Monitor sollte z.B. folgendes zeigen

....... connected
UPD Server is up and running
nc yourDomain.dyndns.org 5444 -u 
Please use the following start code, to wake up the VPN Server: 5399
E-Mail send
AP connection established, listening on 192.168.1.4:5444

Ihr solltet parallel nun auch eine E-Mail erhalten haben

Den E-Mail Text und Betreff könnt ihr übrigens in der Basic.ino an folgender Stelle anpassen.

Da ich hier mit definierten Buffer Größen gearbeitet habe, müsst ihr diese ggf. an eure Textlänge anpassen.

Verbinden mit dem Arduino per UDP

Die Zeile aus der E-Mail mit nc yourDomain.dyndns.org 5444 -u ist der Befehl zum Verbinden mit dem Arduino über ncat. Zum testen im lokalen Netzwerk kann hier natürlich auch die IP des Arduino verwendet werden.

Wie in den Voraussetzungen beschrieben kann man ncat zum Verbinden verwenden, ncat steht auch für Windows als Standalone exe zur Verfügung, wird aber von einigen Antiviren Programmen (u.a. Windows Defender) als Schadsoftware erkannt.

Wer ein Android Handy im besitzt kann sich die App Termux installieren und dort über apt-get install nmap ncat installieren, somit könnt ihr den Arduino auch über das Handy steuern.

Der UDP Server des Arduino ist recht einfach aufgebaut, im Prinzip vergleicht er jede Eingabe mit dem genierten „Startcode“, passt die Eingabe, prüft er ob die Ziel IP erreichbar ist, falls nein schickt er ein WOL Packet und wiederholt den Vorgang bis die Ziel IP entweder erreichbar ist oder die maximale Anzahl an versuchen erreicht ist. Ist der „Startcode“ falsch zählt er einen Counter hoch, wird der Startcode zu oft falsch eingegeben (Siehe Einstellungen) wird ein neuer generiert und per E-Mail verschickt.

Das ist quasi eine kleines Sicherheitsfeature geben Bruteforce Angriffe.


Infos und Tipps

Wenn der E-Mail Versand nicht klappt, könnt ihr in der Datei ibraries\esp8266-sendemail-master\sendemail.h die Zeile

#define DEBUG_EMAIL_PORT Serial

einkommentieren und bekommt dann eine Ausgabe auf dem Serial Monitor mit genaueren Infos.

Wollt ihr den Startcode anpassen, z.B. die länge von 4 Ziffern erhöhen oder noch Buchstaben rein bauen könnt ihr das an dieser Stelle vornehmen

Links und Quellen:

Ansonsten sollte eigentlich alles mehr oder weniger gut im Code kommentiert sein.

Schreibe einen Kommentar