Wake-On-LAN-Portal

Jakob Birner, 13. August 2021
Lesezeit: 10 Minuten

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.

logo white
logo white
logo white
logo white

Verwaltungs-Seite

Über die Navigationsleiste gelangt man zur zweiten Seite, auf welcher neue Geräte hinzugefügt und bestehende bearbeitet werden können.

/uploads/liste_Blurred1_2_06898bed23.png

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. 

/uploads/magic_package_1418e47f61.png

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. 

Copy
   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.  

Copy
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. 

Copy
for (int i = 0; i < numberOfAttempts; i++) {
      boolean active = testConnection.checkPowered(ipAdress);
      if (active) {
         return active;
      }
 }
 return false;
Jakob Birner
Student Software-Engineering, 5. Semester
Im Wake-On-Lan Projekt hatte ich die Möglichkeit sowohl das Frontend als auch das Backend selbst zu entwerfen und nach meinen Ideen zu gestalten. Mir gefiel die Herausforderung mich in neue Themen einzuarbeiten und selbst für ein gesamtes Projekt verantwortlich zu sein.