Besonders in Zeiten der Corona-Pandemie ist es wichtig eine zuverlässige Möglichkeit zu haben von Zuhause aus zu arbeiten, um die Anzahl der Kontaktpersonen im Büro zu reduzieren. Zur Arbeit im Homeoffice stellen wir über ein VPN eine Remotedesktop-Verbindung zu unseren Geräten im Büro her, von welchen wir dann vollen Zugriff auf unsere Arbeitsumgebung haben. Dies geht natürlich nur, wenn die PCs im Büro angeschaltet sind. Da wir uns jedoch das Ziel gesetzt haben Energie einzusparen (avocado goes „Smart Office“), sollen die Geräte nicht 24h am Tag laufen, sondern nach Feierabend abgeschaltet werden. Um die PCs morgens dann von Zuhause aus wieder in Betrieb zu nehmen, soll nun ein Wake-On-LAN-Portal geschaffen werden, über welches sie sich über das Internet starten lassen.
Idee
Im VPN soll eine Seite erreichbar sein, welche alle verfügbaren Geräte auflistet und ihren momentanen Status anzeigt. Hier lässt sich nun ein beliebiges Gerät auswählen und anschalten. Zudem soll die Möglichkeit bestehen unkompliziert und zuverlässig neue Geräte hinzuzufügen und Bestehende zu verwalten.
Frontend
Das Frontend wurde mit Hilfe von Angular realisiert und besteht aus zwei Seiten:
Startseite
Auf der Startseite können in einem Dropdown Geräte ausgewählt werden, um ihren Status anzuzeigen und sie bei Bedarf zu starten.




Verwaltungs-Seite
Über die Navigationsleiste gelangt man zur zweiten Seite, auf welcher neue Geräte hinzugefügt und bestehende bearbeitet werden können.
Technische Umsetzung
Starten des Geräts
Das eigentliche Starten geschieht durch das Senden eines “Magic-Packet”. Dies ist ein UDP-Packet bestehend aus sechsmaliger Wiederholung des hexadezimalen Wertes FF gefolgt von einer 16-maligen Wiederholung der MAC-Adresse des zu startenden Systems.
Wird das Paket nur an die IP-Adresse des zu startenden Systems gesendet, kommt es unter Umständen nicht an, da die IP-Adresse nicht zu einer MAC-Adresse aufgelöst werden kann, wenn das Zielgerät ausgeschaltet ist. Daher wird das Paket über die Broadcastadresse des Netzwerkes an alle Geräte gesendet, woraufhin das gesuchte Gerät seine MAC-Adresse erkennt und sich gemäß dem Wake-On-Lan Protokoll bei Erhalt des passenden Magic-Packets selbst startet.
byte[] macBytes = getMacBytes(macAdress); //get the byte values for the MAC-Address
byte[] bytes = new byte[6 + 16 * macBytes.length];
for (int i = 0; i < 6; i++) { //add six FF-bytes
bytes[i] = (byte) 0xff;
}
for (int i = 6; i < bytes.length; i += macBytes.length) {
System.arraycopy(macBytes, 0, bytes, i, macBytes.length); //add bytes of MAC-Address
}
InetAddress address = InetAddress.getByName(ip); //set address to broadcast-IP
DatagramPacket packet = new DatagramPacket( //build UDP-package
bytes, //data
bytes.length, //data-size
address, //target-address
port); //target-port
Statusabfrage
Im Portal soll ersichtlich sein, ob ein Gerät bereits läuft, beziehungsweise ob der Startvorgang erfolgreich durchgeführt wurde. Um den Status eines Geräts abzufragen, wird ein einfacher Ping gesendet. Kommt eine Antwort , so läuft das Gerät.
String command = "ping " + ip;
Process p = Runtime.getRuntime().exec(command);
BufferedReader inputStream = new BufferedReader(
new InputStreamReader(p.getInputStream()));
String s = "";
// reading output stream of the command and check for valid response
while ((s = inputStream.readLine()) != null) {
if (s.contains("Bytes=")) {
return true;
}
}
Für den Fall, dass das Ping-Paket verloren geht oder das zu prüfende Gerät momentan bootet, wird der Pingvorgang mehrmals durchgeführt. Sobald einer der Versuche Erfolg hat wird das Gerät als laufend erkannt, nur wenn alle Pings ohne Antwort bleiben wird ein ausgeschaltetes Gerät gemeldet.
for (int i = 0; i < numberOfAttempts; i++) {
boolean active = testConnection.checkPowered(ipAdress);
if (active) {
return active;
}
}
return false;