Raspberry Pi: Infoscreen- und Kiosksystem


Prof. Jürgen Plate

Raspberry Pi: Infoscreen- und Kiosksystem

Sie kennen sicher Computersysteme, die Informationen zu Museums-Exponaten bieten und interaktiv abrufbar machen. Auch wenn Sie am Bankautomaten Geld abheben oder eine Fahrkarte kaufen, inzwischen auch bei der Heimautomatisierung, die Arbeit leistet ein für genau diesen Zweck eingerichteter Computer. Die übliche Bezeichnung solcher öffentlichen Terminals lautet "infoscreen", "Infoboard" oder "Kiosksystem". Durch die Selbstbedienung der Kunden sparen die Betreiber Kosten und reduzieren Wartezeiten.

Viele Kiosksysteme verkaufen nichts, sondern informieren nur, z. B.in Museen oder bei Veranstaltungen. Dazu erlauben solche Internetterminals oder Surfstationen nur den Zugriff auf den Browser, das System selbst muss dem Nutzer verborgen bleiben. Zum Aufbau eines Kiosksystems eignet sich der Raspberry Pi bestens. Er besitzt genügend Rechenleistung, um Webseiten ausreichend schnell darzustellen, und verbraucht kaum Strom. Für ein Infoboard wird benötigt:

Im Folgenden wird davon ausgegangen, dass das Raspbian-Linux auf dem RasPi installiert und so eingerichtet ist, dass die grafische Oberfläche LXDE automatisch startet. Es muss ausserdem eine SSH-Verbindung zum RasPi aufgebaut werden können. Auch der schlanke Webbrowser Midori muss verfügbar sein. Die Informationen werden als HTML-Seiten über den Webbrowser angeboten. Dr Raspberry Pi soll nach dem Booten automatisch den Browser starten. Alle Aktionen dazu werden über Shellscripte auf der Kommandozeile gesteuert. Zur Einrichtung des Kiosksystems sind die folgen Schritte notwendig. Alle Arbeiten müssen als Benuzter "root" ausgeführt werden, daher geben Sie am besten gleich das Kommando

sudo su
ein, um nicht ständig sudo verwenden zu müssen.

Damit der Browser im Kiosk-Mode läuft und zum Beispiel der Mauszeiger nicht dargestellt wird, müssen noch weitere Programme installiert werden:

apt-get install x11-xserver-utils unclutter
Die X11-Serverutilities brauchen Sie für xset und nclutter lässt den Mauszeiger verschwinden.

Benutzer Pi automatisch anmelden

Da der Browser und alles andere über die Kommandozeile gestartet werden sollen, muss der Benutzer Pi nach dem Booten des Systems an der Kommandozeile angemeldet sein. Dazu wird die Datei /etc/inittab angepasst.

1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
Für tty1 wird der User pi automatisch eingeloggt, alle anderen TTYs werden gesperrt. Kommentieren Sie alle Zeilen mit # aus und fügen die folgenden beiden Zeilen darunter ein.
#1:2345:respawn:/sbin/getty --noclear 38400 tty1
#2:23:respawn:/sbin/getty 38400 tty2
#3:23:respawn:/sbin/getty 38400 tty3
#4:23:respawn:/sbin/getty 38400 tty4
#5:23:respawn:/sbin/getty 38400 tty5
#6:23:respawn:/sbin/getty 38400 tty6
#Benutzer automatisch beim Start anmelden
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1

Den X-Server automatisch starten

Nur der Vollständigkeit halber: Falls Sie nicht wollen, dass die grafische Oberfläche automatisch beim Booten startet, kann der Start des X-Servers auch an den User Pi deligiert werden. In der Datei /home/pi/.bash_profile (wahlweise auch /home/pi/.profile tragen sie nur die nachfolgenden Befehle (am besten ganz am Ende vor dem exit 0) ein:

# X-Server starten
startx
Für den Start des Kiosk-Systems können Sie schon mal den Aufruf des Skriptes in der Datei /home/pi/.xinitrc eintragen:
/home/pi/infoscreen_start

Startskript für das Kiosksystem

Alles Weitere erledigt das Startskript, das je nach Gegebenheit beliebig erweitert werden kann. Es steht (wie oben angegeben) in der Datei /home/pi/infoscreen_start:
#!/bin/bash
# dem System etwas Zeit geben (z. B. nach einen Restart)
sleep 10

export DISPLAY=:0

# ggf. Monitorauflösung setzen
#xrandr -s 1024x768 &

# Bildschirmschoner ausschalten I
xset s off
xset s noblank

#  Bildschirmschoner ausschalten II
perl -pi -e "s/BLANK_TIME=[0-9]+/BLANK_TIME=0/g" /etc/kbd/config
perl -pi -e "s/POWERDOWN_TIME=[0-9]+/POWERDOWN_TIME=0/g" /etc/kbd/config

# Energiesparfunktionen ausschalten
xset -dpms

# Mauszeiger und Cursor verstecken
unclutter -grab -visible &

# Endlosschleife, falls midori abkackt, neu starten
while :; do
  ps -ef | grep 'midori -e Fullscreen' | grep -v grep > /dev/null 2>&1
  if [ $? -eq 1 ] ; then
    midori -e Fullscreen -a <Startseite> &
  else
    midori -e Reload
  fi
  sleep 1800
done
Das Script endet in einer Endlosschleife, in der regelmäßig geprüft wird, ob der Browser noch läuft. Andernfalls wird der Browser im Vollbildmodus und als Hintergrundprozeß gestartet. Falls der Browser noch läuft, wird sicherheitshalber nach einen halben Stunde (1800 Sekunden) ein Reload der Webseite durchgeführt. Bei <Startseite> muss natürlich die Start-Webseite des Infoboards eingetragen werden. Vergessen Sie nicht, das Script ausführbar zu machen:
chmod 755 /home/pi/infoscreen_start
Die Option "-e" kenn noch weitere Argumente, die Sie mit midori --help-execute auflisten können.

Anmerkung: Die Monitorauflösung kann man auch in der Datei /boot/config.txt einstellen. Um beispielsweise eine Auflösung von 1680x1050 Pixeln, 60Hz vorzugeben, trägt man ein:

...
hdmi_group=2
hdmi_mode=58
hdmi_force_hotplug=1
Die Grafik-Modi können der Dokumentation von /boot/config.txt entnommen werden.

Was mir manchmal nicht so gefällt, sind Scripten, die in einer Endlosschleife laufen wie das obige. Man kann die Schleife aber loswerden, wenn man die Teile, die in der Schleife laufen, an einen Auftrag für den Cron-Daemon deligiert. Das obige Script wird geteilt. Ein Teil wird wie oben einmal aufgerufen und startet alles. Über das crontab-Kommando wird ein zweites Script regelmäßig aktivieret, dass dann den Midori-Browser überwacht. Hier das geänderte Script /home/pi/infoscreen_start:

#!/bin/bash
# dem System etwas Zeit geben (z. B. nach einen Restart)
sleep 10

export DISPLAY=:0

# ggf. Monitorauflösung setzen
#xrandr -s 1024x768 &

# Bildschirmschoner ausschalten I
xset s off
xset s noblank

#  Bildschirmschoner ausschalten II
perl -pi -e "s/BLANK_TIME=[0-9]+/BLANK_TIME=0/g" /etc/kbd/config
perl -pi -e "s/POWERDOWN_TIME=[0-9]+/POWERDOWN_TIME=0/g" /etc/kbd/config

# Energiesparfunktionen ausschalten
xset -dpms

# Mauszeiger und Cursor verstecken
unclutter -grab -visible &

# Midori starten
midori -e Fullscreen -a <Startseite> &
Der Aufruf des zweiten Scripts wird per crontab -e eingetragen. Es wird alle halbe Stunden gestartet:
0,30 * * * * /home/pi/midoriwatch
Das Script /home/pi/midoriwatch erledigt nun den Job, der vorher in der Schleife stand - nur wegen crontab eben ohne Schleife und sleep:
#!/bin/bash
# falls midori abkackt, neu starten
ps -ef | grep 'midori -e Fullscreen' | grep -v grep > /dev/null 2>&1
if [ $? -eq 1 ] ; then
  midori -e Fullscreen -a <Startseite> &
else
  midori -e Reload
fi
Vergessen Sie nicht, das Script ausführbar zu machen:
chmod 755 /home/pi/midoriwatch
In beiden Scripten muss auch noch die aktuelle Startseite eingetragen werden.

Das System härten

[Strg]-[Alt]-[Del] abschalten

Natürlich soll niemand per Tastatur den Raspberry Pi neu starten könnne. Früher war das Verhalten des "Affengriffs" zum Rebooten/Herunterfahren des Systems auch in der dastei /etc/inittab verankert und es genügt ein Kommentar-# zum Abschalten. Inzwischen ist die Aufgabe der Tastenkombination an den sytemd übergegangen. Um nun die Taste zu deaktivieren, muss eine passende Steuerdatei, genauer eine symbolischer Link angelegt werden:

ln -sf /dev/null /etc/systemd/system/ctrl-alt-del.target
Ab da wird beim Drücken von [Strg]-[Alt]-[Del] nichts mehr getan.

[Strg]-[Alt]-[Backspace] abschalten

Auch die Taste zum Beenden der Grafikoberfläche muss dekativiert werden. Das kann man schon beim Einrichten des Systems mit raspi-config erledigen. Andernfalls legen Sie eine Datei namens /etc/X11/xorg.conf.d/10-dontzap.conf an (der Name ist eigentlich egal) und geben folgendes in die Datei ein:

Section "ServerFlags"
  Option "DontZap"  "true"
EndSection

System-Request-Taste [Alt]-[S-Abf] abschalten

Das ist die gefährlichste Taste überhaupt, denn mit ihr lassen sich verschiedene Funktionen, z. B. auch ein Neustart des Computers, ausführen. Das funktioniert sogar, wenn der Computer auf andere Eingaben nicht mehr reagiert, etwa wenn die Grafikoberfläche "hängt". Häufig wird so ein Neustart durchgeführt, ohne Schäden am Dateisystem zu verursachen. Auf einem Linux-System hält man die Tastenkombination [Alt][S-Abf] gedrückt und drückt nacheinander die Tasten [R] (unraw), [E] (term), [I] (kill), [S] (sync), [U] (Umount) und [B] (boot). Daneben gibt es noch andere Kombinationen, etwa [O] für Power Off.

Um die Taste zu temporär zu deaktivieren, kann man eine Null in die Pseudodatei /proc/sys/kernel/sysrq schreiben:

echo 0 > /proc/sys/kernel/sysrq
Diese Zeile könnten Sie auch in das Script /home/pi/infoscreen_start schreiben. Um die System-Request-Taste dauerhaft zu deaktivieren, legen Sie eine Steuerdatei für sysctl an:
echo "kernel.sysrq=0" > /etc/sysctl.d/10-magic-sysrq.conf
sysctl -p /etc/sysctl.d/10-magic-sysrq.conf
Beim Booten wird diese Datei dann mit allen anderen syctl-Configs ausgewertet. Siehe auch Wikipedia: Magische_S-Abf-Taste.

Deaktivieren Rechtsklick und Alt

Der Befehl xmodmap in der Autostart-Datei deaktiviert die rechte Maustaste durch Neuzuordnung der mittleren und rechten Tasten. Bei der Wahl des Tastaturtreibers wurde nun jeder Taste (also jedem "keycode") ein gewisses Zeichen bzw. Funktion in Form von keysyms zugewiesen. Mit xmodmap kann man diese Einstellungen individuell anpassen. Das Programm modifiziert die jeweils aktuelle Keymap (die Zuweisungen des Signals, das die Taste sendet (= keycode) und die Aktion, die durch dieses Signal ausgelöst werden soll). Dies ist unabhängig vom gewählten Tastaturlayout. Um nun Zuweisungen zu ändern, wird eine eigene Datei .Xmodmap im heimatverzeichnis erzeugt und dann geändert:
cd /home/pi
xmodmap -pke > .Xmodmap 
In der Datei stehen die Zuordnungen und Aktionen zu den Tastencodes. Das kann z. B. folgendermassen aussehen:
keycode   8 =
keycode   9 = Escape
keycode  10 = 1 plus plusminus infinity
Hinter dem Tastencode können bis zu sechs Keywords stehen. Fehlt eines oder mehrere Keywords, gibt es die entsprechende Funktion nicht. So ist im Beispiel oben die Taste mit Code 8 unbelegt und die Escape-Taste nur einfach belegt. Um nun Tasten zu deaktivieren oder auch umzudefinieren, bearbeiten wir die private .Xmodmap des Users pi. Um die Tasten [Alt] und [AltGr] zu deaktivieren, ändern Sie den Keycode:
keycode 64 = NoSymbol NoSymbol NoSymbol NoSymbol
keycode 108 = NoSymbol NoSymbol NoSymbol NoSymbol
oder ganz brutal
keycode 64 = 
keycode 108 = 
Ähnlich können Sie auch mit den anderen Keycodes verfahren. Rufen Sie das Kommando xmodemap ohne Parameter auf, liefert das Programm eine Liste der aktuellen Zuordnungen. Nach Aktivierung durch Ab- und Anmelden des Users oder durch ausführen von
xmodmap ~/.Xmodmap 
wird die Zuordnung aktualisiert.

Keyboard-Shortcuts deaktivieren

Für die Shotcuts ist die Datei /home/pi/.config/openbox/lxde-rc.xml zuständig. Von dieser Datei machen Sie zunächst ein Backup für den Fall, dass Sie die aktuelle Datei schrotten:

cd /home/pi
cp .config/openbox/lxde-rc.xml .config/openbox/lxde-rc.xml.original
Nun öffen Sie die Datei und suchen Sie die Sektion "Keybindings". Hier können Sie alle Shortcuts umdefinieren, löschen oder (defensiver) deaktivieren. Bei der Tastendefinition gilt übrigens:
S = Shift
C = Control
A = Alt
W = Super key (Win)

Der folgende Eintrag würde beispielsweise beim Drücken der Tastenkombination [Strg]-[Shift]-|Alt]-[e] den Editor gedit aufrufen.

    <keybind key="A-C-S-e">
      <action name="Execute">
        <command>gedit</command>
      </action>
    </keybind>
Zum Deaktivieren der jeweiligen Taste ändern Sie einfach die Kommando-Sektion, indem Sie die entsprechende Kommandodofinition durch
<command>false</command>
ersetzen. Aktiviert werden die Änderungen durch das Kommando
openbox --reconfigure
So können Sie auch Definition für Definition schrittweise anpassen und testen.

Browser konfigurieren

Der Browser "midori" muss natürlich auch an einigen Stellen abgespeckt werden, was aber relativ leicht über die Browser-Oberfläche selbt geht ("Einstellungen"). Dotz werden dann unerwünschte Features wie Menüleisten, Plugins etc. abgeschaltet. Für Puristen kommt auch noch das Bearbeiten der Konfigurationsdateien selbst unter /home/pi/.config/midori/ infrage.

Bei Bedarf kann ein angepasstes Profil angelegt und mit dem Kommandozeilenargument -c /Pfad/zum/Ordner an Midori übergeben werden. Dazu kopieren Sie einfach das aktuelle Profil und bearbeiten dies dann entsprechend.

Um externe Seiten zu blockieren, können Sie einen regulären Ausdruck als Blacklist verwenden. Um unerwünschte Websites zu blockieren, erzeugen Sie beispielsweise die Zeile:

-b 'youtube|youporn'
Durch Negieren des Ausdrucks können Sie auch eine Whitelist erzeugen:
-b '^(?!.*?(gmx|gmail|google)).*'
Alle Links auße der aufgeführten landen auf einer Fehlerseite. Alle Bilder und andere Dateien werden nicht geladen.

Einige Websites verhalten sich seltsam, wenn sie nicht einen Browser wie Chrome, Firefox, IE, usw. erkennen. Falls Sie also nicht nur lokale Seiten anzeigen, sondern auch auf andere Websites verlinken (z. B. auch in einem iframe), können Sie den Browser-Namen auch ändern: Preferences → Network → Identify As. Falls Ihnen da kein schöner Name einfällt, schauen Sie doch mal in diese Liste.

Neben den Pfeiltasten kann man auch über die guten alten vi-Tasten navigieren: h=links, l=rechts, j=runter, k=rauf. Standardmäßig initiiert die rechte Maustaste Gestensteuerung. Sie können jedoch den Butten wechseln (beispielsweise auf die mittlere Maustaste) indem Sie eine versteckte Option erzeugen. Erstellen Sie dazu eine Textdatei /home/pi/.config/midori/extensions/libmouse-gestures.so/config und geben Sie den folgenden Text ein:

[settings]
  button=2

Ab Midori 0.5.0 können individuelle Maus-Gesten frei in der Datei /home/pi/.config/midori/extensions/libmouse-gestures.so/gestures konfiguriert werden. Der Aufruf "midori --help-execute" liefert eine Liste der verfügbaren Aktionen, die auf der linken Seite des Gleichheitszeichens gesetzt werden. Auf der rechten Seite geht eine Folge von Anweisungen wie (W)est, (E)ast, (N)orth, (S)outh oder Kombinationen der Buchstaben mit einem Semikolon als Trennzeichen, z. B.:

[gestures]
  Quit=W;E;
  TabPrevious=SW;
  TabNext=SE;
Auch hier können Sie individuelle Gesten setzen - oder auch löschen.

Weitere Dateien mit Konfigurationsdaten sind:

/home/pi/.local/share/applications/defaults.list  # Zuordnung der MIME-Typen zu Plugins
/home/pi/.local/share/midori/styles               # Default-Styles
/home/pi/.local/share/midori/scripts              # User-Scripts (vorzugsweise leer)

Konfigurationsdateien sichern

Mit der Bearbeitung der Midori-Konfiguration ist hoffentlich aller Unsinn blockiert, den jemand mit dem Browser anstelle könnte. Trotzdem kann auch hier noch etwas mehr getan werden. Wenn ale Konfigurationsdateien bearbeitet sind, machen Sie ein Backup davon. Das geht ganz einfach für den kompletten Verzeichnisbaum mit dem tar-Kommando:

cd /home/pi
# Archiv anlegen
tar cvpf midori-config.tar .config/midori/*
Beim Booten des Systems kopieren Sie das Backup wieder über die Midori-Konfiguration und können sicher sein, dass alles wieder wie neu ist. Dazu packen Sie die folgende Kommandos in die oben schon erwähnte Datei /home/pi/.bash_profile vor den startx und den anderen Kommandos:
cd /home/pi
# Archiv auspacken
tar xpf midori-config.tar

Tipp 1: Im Prinzip können Sie auf die gleiche Weise auch mit anderen Konfigurationsdateien und anderen Dateien, die unverändert bleiben sollen, verfahren - z. B. auch der Datei coockies.txt.

Tipp 2: Wenn's noch einen Tick sicherer werden soll, könnten Sie das Regenerieren der Konfigurationsdateien auch regelmäßig per crontab-Kommando anstossen.

System abhärten

Um weiters Ungemach durch Fehlbedinung und Hacker zu vermeiden, sollten Sie alles deinstallieren, was nicht unbedingt gebraucht wird. Dieser Schritt ist leider mit nicht unbeträchtlichen Aufwand verbunden, denn es reicht nicht, nur ein unerwünschtes Kommando zu löschen (ausser bei den einfachen Shell-Kommandos), sondern es muss das jeweilige Paket deinstalliert werden. Das bedeutet, dass Sie für jedes Paket, dass nicht gebraucht wird, das Kommando

apt-get -y purge <Paketname>
aufgerufen werden muss. Sinnvollerweise würden Sie sich zunächst eine Datei mit den Paketnamen der zu löschenden Pakete anlegen (ggf. mit Hilfe von apt-cache search ... nach den richtigen Namen suchen). Die Datei delpaket kann dann per Script verarbeitet werden:
#!/bin/bash
while read PAKET
do
  apt-get -y purge $PAKET
done < /home/pi/delpaket
So eine Datei hat den Vorteil, dass Sie den Vorgang auch ratz-fatz erledigt haben, wenn Sie später mal ein ganz frisches System härten müssen.

Refresh von HTML-Seiten

Sie haben oben beim Script schon gesehen, dass der Browser mit dem Kommando midori -e Reload auf der Kommandozeile dazu veranlasst werden kann, den angezeigten Inhalt aufzufrischen. Oft soll der Refresh aber von der HTML-Datei, also der angezeigten Webseite aus geschehen. Dafür gibt es diverse Möglichkeiten. Für alle aber gilt, dass bei gleichem Namen der HTML-Datei und gleicher Größe, der Browser den Refresh aus seinem Cache und nicht von der ggf. geänderten Datei vollzieht. Daher muss in der Browser-Konfiguration (Einstellungen) der Browser-Cache abgeschaltet sein.

Refresh über META-Statement

Benutzt wird diese Angabe in der Praxis oft für das automatische Weiterleiten zu einer neuen Adresse. Beim Kiosk-System geht es aber nur um das erneute Laden einer Webseite. Mit dem Eintrag <meta http-equiv="refresh" content="..."> im Header einer HTML-Datei veranlassen Sie die Weiterleitung zu einer anderen Adresse. DieContent-Angabe besteht aus zwei durch Semikolon getrennten Angaben, der Wartezeit bis zum nächsten refresh und der URL der zu ladenden Seite. Bei einer Wartezeit von 0 wird die angegebene URL sofort geladen. Beispiel:
<meta http-equiv="refresh" content="10; URL=http://www.netzmafia.de/"&gr;
Soll nur ein und dieselbe Seite neu geladen werden, entfällt die URL:
<meta http-equiv="refresh" content="10">

Refresh per Javascript

In Javascript wird die Timeout-Methode verwendet, um die Wartezeit zu realisieren. Zu beachten ist hier, dass die Zeitangabe im Millisekunden erfolgt. Der entsprechende Einzeile kann in einem größeren Javascript enthalten sein, z. B.:

setTimeout("location.reload(true);", 10000);
Am einfachsten ruft man das Javascript im Body-Tag auf, z. B.:
<body onload="setTimeout('location.reload(true);', 10000);">

Refresh per PHP/perl

Was im Folgenden für PHP beschrieben wird, funktioniert auch in jeder andern Programmiersprache. Einzige Bedingung ist, dass die Einträge im HTTP-Header erfolgen müssen. In Perl würde man die Headerzeilen einfach vor der Zeile "Content-Type" unterbringen und die Wartezeit über die Alarm-Funktion realisieren. In PHP gibt es die Funktion header(), die alle Arbeit erledigt. Vor dem Aufruf von header() dar jedoch noch nichts in Richtung Browser gesendet worden sein, kein Leerzeichen, kein Newline, nix.

$webpage = $_SERVER['PHP_SELF'];
$duration = "10";
header("Refresh: $duration; url=$webpage");

Fertiges System: FullPageOS

(Quelle: Raspberry Pi Geek, Heft 1/2016)
FullPageOS – ein Kiosksystem für den RasPi. Egal, ob Geldautomaten, Informationsterminals oder Fahrkartenautomaten: Öffentlich zugängliche Computer brauchen eine ordentliche Absicherung. Dazu müssten Sie bei einer gängigen Linux-Distribution an zahlreichen Stellschräubchen drehen. Die generische Bezeichnung solcher öffentlichen Terminals lautet "Kiosksysteme" – ein solches bietet die Distribution FullPageOS. Es macht aus einem Raspberry Pi ein abgeschottetes Internet-Terminal, mit dem sich nur vordefinierte Webseiten öffnen lassen. Das System startet nach dem Booten den Chromium-Browser im bildschirmfüllenden Modus und einer vordefinierten Webseite. Zugriff aufs System oder andere Anwendungen erlaubt die Distribution über das Display nicht. Einige Dinge sind aber noch nicht gesichert, darunter die SysRq-Taste.

Infos unter: https://guysoft.wordpress.com/2015/10/17/fullpageos-out-of-the-box-kiosk-mode-for-the-raspberrypi/
Download unter: https://github.com/guysoft/FullPageOS

Copyright © Hochschule München, FK 04, Prof. Jürgen Plate
Letzte Aktualisierung: