AA_123rf-30697609_damedeeso-123RF.jpg

© damedeeso, 123RF

PC-Fernbedienung selbst entwerfen

Couch Potato

Für PCs oder Laptops gibt es im Allgemeinen keine Fernbedienung wie für das TV. Eine solche realisieren Sie aber bei Bedarf mit einem Endgerät, wie etwa einem Android-Tablet, in Eigenregie.

Es wäre schön, wenn es auch am PC eine Fernbedienung für Youtube gäbe, mit der Sie bequem vom Sofa aus starten, pausieren, die Lautstärke regeln und auch andere Dinge anstoßen könnten.

Um dieses Vorhaben zu realisieren, benötigen Sie auf dem Linux-System ein Server-Programm, das auf einem bestimmten Port lauscht, Anweisungen entgegennimmt und Systemkommandos ausführt. Auf dem Endgerät, das als Fernsteuerung dienen soll, muss ein Programm laufen, das via Netzwerk Anfragen an das Linux-System übermitteln kann und gleichzeitig eine schicke Oberfläche bietet.

Mithilfe von Netcat [1] realisieren Sie die Server-Funktion schnell über die Shell und haben zudem bei Bedarf die Möglichkeit, x-beliebige Systembefehle auszuführen. Bevor Sie an die Umsetzung gehen, sollten Sie überprüfen, ob auf dem Rechner folgende Kommandozeilenprogramme installiert sind:

  • Xgamma, ein Programm für die Regulierung des Gamma-Werts Ihres Monitors;
  • Xdotool, das Tastaturkombinationen an das System übermittelt; und
  • ImageMagick [2], das unter anderem Screenshots des Bildschirms, markierter Bereiche oder einzelner Fenster aufnimmt.

Gegebenenfalls rüsten Sie diese Programme in einem Rutsch über die Paketverwaltung nach, auf Debian und dessen Abkömmlingen etwa als root mit dem Kommando apt-get install xgamma xdotool imagemagick auf der Kommandozeile.

Der Server

Nach der Installation dieser Programme können Sie den Server auf dem Linux-System realisieren. Dabei handelt es sich um ein simples Bash-Skript mit dem Inhalt aus Listing 1, das Sie auf unserem Webserver auch zum Download finden [3].

Zeile 2 legt fest, wo das Skript von der Fernsteuerung angestoßene Screenshots speichert. Zeile 3 sorgt dafür, dass dieses Verzeichnis angelegt wird, falls es noch nicht existiert. Die Zeilen 5 bis 43 zeichnen für die eigentliche Server-Funktionalität zuständig. Eine While-Anweisung realisiert das immer fortwährende Durchlaufen der Programmschleife.

In Zeile 7 sehen Sie, wie Sie mithilfe von Echo, Netcat und einem anschließenden Sed das Programm dazu bringen, auf dem Port 2001 zu lauschen und Datensendungen des Clients einfach mit dem Wort "irgendwas" zu quittieren. Der Stream-Editor Sed verarbeitet die Anfrage des Clients, indem er einfach die letzte Zeile mit den entsprechenden Anweisungen herausfiltert und in der Variablen inhalt speichert.

Verfügt das Linux-System über eine Firewall, müssen Sie den Port 2001 explizit öffnen, um die Kommunikation mit dem Client zu ermöglichen. Falls Ihr Router den Datenverkehr zwischen WLAN-fähigen Geräten aus Sicherheitsgründen unterbindet (so machen das etwa die Geräte von 1&1 Internet), müssen Sie diese Option auf der Konfigurationsoberfläche des Routers deaktivieren, da die Fernsteuerung ja mit einem WLAN-fähigen Endgerät wie einem Tablet oder Smartphone erfolgen soll.

In den Zeilen 8 bis 42 sehen Sie das Hauptkonstrukt für die Steuerung von Youtube in Form einer If/Elif-Anweisung, die den Inhalt der Variablen inhalt auswertet und bei einem Treffer den jeweiligen Anweisungszweig ausführt. Die Zeilen 8 bis 17 dienen dem Einstellen der Lautstärke. Dazu ermittelt das Skript in den Zeilen 9 und 14 mithilfe des Befehls Amixer den aktuellen Wert des Master-Kanals. Die Zeilen 10 und 15 setzen den neuen Wert, wobei die Anweisung in der jeweils folgenden Zeile dafür sorgt, dass dieser zwischen 0 und 100 Prozent bleibt. Ein erneuter Aufruf von Amixer setzt dann die neue Lautstärke.

Die Zeilen 18 bis 29 steuern den Gamma-Wert des Systems, den die Kommandos in den Zeilen 19 und 25 dazu erst einmal mithilfe des Kommandos Xgamma ermitteln. Ein anschließendes Grep filtert nur die drei Zahlenwerte für Rot, Grün und Blau heraus. Das nochmalige Einklammern macht die Variable gammas zu einem Array, das die einzelnen Werte in seinen Feldern speichert. Die einzelnen Array-Felder werden dann schließlich in den Zeilen 20 bis 22 respektive 26 bis 28 wandern die Einzelwerte zudem in eigene Variablen, sodass sich in der jeweils nächsten Zeile (also 23 beziehungsweise 29) wiederum per Xgamma die drei Werte korrekt setzen lassen.

Die Screenshot-Routine in den Zeilen 30 und 31 erfasst mittels des Import-Befehls aus dem ImageMagick-Paket den ganzen Bildschirminhalt und speichert diesen in dem in Zeile 2 vorgegebenen Ordner ab. Für den Dateinamen bemüht sie dabei den Date-Befehl, sodass der Screenshot den Namen des Erstellungszeitpunkts trägt.

Die Zeilen 30 bis 39 arbeiten mit dem Kommandozeilen-Tool Xdotool. Dieses Programm ermöglicht es, Tastatureingaben an andere Programme weiterzugeben. Da sich auch Youtube über Tastaturkürzel steuern lässt, reicht das Skript für die einzelnen Aktionen die Tastaturkürzel an das System durch. Dabei steht die Leertaste für das Pausieren des Videos, die Eingabetaste für das Starten des Clips und die Pfeiltasten nach rechts und links für das Vor- und Zurückspulen.

Der letzte Elif-Block ab Zeile 40 kümmert sich um die Bildschirmauflösung. Sie sollten vorab erst einmal durch einen Aufruf von Xrandr ohne Parameter überprüfen, welche Auflösungen der Bildschirm unterstützt. Dann tragen Sie die von Ihnen gewünschten Varianten in Zeile 41 ein.

Listing 1

#!/bin/bash
BILDER=~/Bilder/Import
test ! -d $BILDER && mkdir -p $BILDER
while true
 do
  inhalt=$(echo irgendwas | nc -l 2001 | sed -r -n "$ s/\n//;$ p")
  if test $inhalt = "lauter"; then
    aktuell=$(amixer sget Master | grep -m 1 -Eo "[0-9]{1,3}%" | sed "s/%//")
    neu=$(expr $aktuell + 5)
    test $neu -gt 100 && neu=100
    amixer sset Master ${neu}%
  elif test $inhalt = "leiser"; then
    aktuell=$(amixer sget Master | grep -m 1 -Eo "[0-9]{1,3}%" | sed "s/%//")
    neu=$(expr $aktuell - 5)
    test $neu -lt 0 && neu=0
    amixer sset Master ${neu}%
  elif test $inhalt = "mehrgamma"; then
    gammas=($(xgamma 2>&1 | grep -Eo "[0-9]{1}\.[0-9]{3}"))
    rot=$(echo ${gammas[0]} + 0.1 | bc -i | sed -n "$ p")
    gruen=$(echo ${gammas[1]} + 0.1 | bc -i | sed -n "$ p")
    blau=$(echo ${gammas[2]} + 0.1 | bc -i | sed -n "$ p")
    xgamma -rgamma $rot -ggamma $gruen -bgamma $blau
  elif test $inhalt = "wenigergamma"; then
    gammas=($(xgamma 2>&1 | grep -Eo "[0-9]{1}\.[0-9]{3}"))
      rot=$(echo ${gammas[0]} - 0.1 | bc -i | sed -n "$ p")
      gruen=$(echo ${gammas[1]} - 0.1 | bc -i | sed -n "$ p")
      blau=$(echo ${gammas[2]} - 0.1 | bc -i | sed -n "$ p")
      xgamma -rgamma $rot -ggamma $gruen -bgamma $blau
  elif test $inhalt = "screenshot"; then
    import -silent -window root ${BILDER}/$(date +"%A%d%B%Y%H%M%S_%N").jpg
  elif test $inhalt = "pause"; then
    xdotool key space
  elif test $inhalt = "start"; then
    xdotool key Return
  elif test $inhalt = "zurück"; then
    xdotool key Left
  elif test $inhalt = "vor"; then
    xdotool key Right
  elif [ $inhalt = "1600x1200" ] || [ $inhalt = "1280x1024" ] || [ $inhalt = "1152x864" ] || [ $inhalt = "1024x768" ]; then
    xrandr -s $inhalt
  fi
 done

Der Client

Jetzt geht es ans Umsetzen der eigentlichen Fernbedienung. Diese können Sie auch auf dem Linux-System entwickeln und hinterher auf das Endgerät kopieren, das als Fernsteuerung dienen soll. Die Fernbedienung entsteht als einfache HTML-Datei mit ein wenig CSS und Javascript, wie in Listing 2 zu sehen, das Sie auf unserem Webserver auch zum Download finden [4].

Dabei befassen Sie sich erst einmal mit der visuellen Komponente der Fernsteuerung, die Sie über eine HTML-Tabelle realisieren. Ein Beispiel dafür sehen Sie in den Zeilen 35 bis 63. Diese Tabelle zeichnet für die Anordnung der Buttons in der Fernsteuerung verantwortlich. Um zu bewirken, dass sich das Layout automatisch an jedes Endgerät anpasst, definieren Sie eine 100 Prozent hohe und breite Tabelle (Zeile 35).

Das funktioniert allerdings nur, wenn Sie auch den Body und das eigentliche HTML-Dokument auf hundertprozentige Höhe setzen (Zeile 8). Zusätzlich definieren Sie auch den Margin des HTML-Body wie in Zeile 12 mit 0. Auch in den Tabellenzellen selber müssen an den richtigen Stellen die richtigen Prozentangaben stehen, sodass die Prozentangaben der Zellen in der Vertikalen respektive Horizontalen sich (nahezu) zu 100 Prozent ergänzen. Das resultierende Layout passt sich auf jedem Endgerät im Browser auf volle Breite und Höhe an (Abbildung 1), sofern Sie dort nicht eine kleinere Darstellung gewählt haben.

In den einzelnen Zellen der Tabellen befinden sich dann jeweils die Definitionen für die Buttons, die folgendem Schema folgen:

<input type="button" value="leiser" class="bst" onclick='einstellen("leiser")'>

Sie sehen hier den Schalter aus Zeile 41, der zusätzlich noch das class-Tag und die Javascript-Anweisung onclick enthält. Das Tag bewirkt, dass der Browser bei der Darstellung die CSS-Anweisungen aus den Zeilen 7 bis 24 berücksichtigt. Dort tragen Sie Anweisungen ein, die hauptsächlich das Aussehen der Fernsteuerung beeinflussen. Wollen Sie sich intensiver mit dem Thema HTML und CSS beschäftigen, bietet die Webseite Selfhtml [5] eine gute Anlaufstelle dazu.

Innerhalb der onclick-Anweisung steht die Javascript-Funktion, die der Browser bei einem Klick auf den Button ausführen soll. Die Schaltflächen der Fernsteuerung nutzen durchgängig die einfache Funktion einstellen("Aktion"). Den zugehörigen Javascript-Block finden Sie in den Zeilen 25 bis 31. In der Zeile 26 erzeugt er ein Objekt des Typs XMLHttpRequest, das HTML-Anfragen an einen Webserver versenden kann. Für dieses Projekt arbeiteten wir mit Firefox sowie mit dem Standard-Browser von Android. Aber auch andere Browser für Tablets und Smartphones dürften wohl keine Probleme mit dieser kurzen Javascript-Funktion haben, sofern sie sowohl Javascript im Allgemeinen als auch das XMLHttpRequest-Objekt im Besonderen unterstützen.

Zeile 28 definiert die HTML-Anfrage genauer. Dort müssen Sie die IP-Adresse des zu kontaktierenden Linux-Systems eintragen und auch den Port, auf dem das Server-Programm lauscht. Sofern Sie an dem Skript aus Listing 1 nichts geändert haben, handelt es sich um den Port 2001. Zeile 29 sendet die Anfrage schließlich ab; auf dem Linux-System wertet das Server-Skript sie aus und setzt einen entsprechenden Systembefehl ab.

Listing 2

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Video-Steuerung</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style type="text/css">
body,html{height:100%}
input{font-size:1.8em;}
body{
 font-family:sans-serif;
 margin:0;
}
.bst{
 width:100%;
 height:100%;
 font-weight:900;
}
.bst2{
  width: 100%;
  height:100%;
  font-weight:900;
}
</style>
<script type="text/javascript">
xmlHttp = new XMLHttpRequest();
function einstellen(anfrage){
 xmlHttp.open("POST", 'http://192.168.178.47:2001', true);
 xmlHttp.send(anfrage);
}
</script>
</head>
<body>
<table align="center" cellpadding="4" cellspacing="4" style="height:100%;width:100%">
 <tr>
  <td style="height:33%">
   <input type="button" value="1600x1200" class="bst" onclick='einstellen("1600x1200")'>
  </td>
  <td><input type="button" value="Start" class="bst" onclick='einstellen("start")'></td>
  <td><input type="button" value="leiser" class="bst" onclick='einstellen("leiser")'></td>
  <td><input type="button" value="lauter" class="bst" onclick='einstellen("lauter")'></td>
 </tr>
 <tr>
  <td style="height:33%">
   <input type="button" value="1280x1024" class="bst" onclick='einstellen("1280x1024")'>
  </td>
  <td><input type="button" value="vor" class="bst" onclick='einstellen("vor")'></td>
  <td><input type="button" value="dunkler" class="bst" onclick='einstellen("wenigergamma")'></td>
  <td><input type="button" value="heller" class="bst" onclick='einstellen("mehrgamma")'></td>
 </tr>
 <tr>
  <td>
   <table style="height:100%;width:100%">
    <tr><td style="height:50%;"><input type="button" value="1152x864" class="bst2" onclick='einstellen("1152x864")'></td></tr>
    <tr><td><input type="button" value="1024x768" class="bst2" onclick='einstellen("1024x768")'></td></tr>
   </table>
  </td>
  <td><input type="button" value="zurück" class="bst" onclick='einstellen("zurück")'></td>
  <td><input type="button" value="Pause/Weiter" class="bst" onclick='einstellen("pause")'></td>
  <td><input type="button" value="Screenshot" class="bst" onclick='einstellen("screenshot")'></td>
 </tr>
</table>
</body>
</html>

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 1 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...