Raspberry Pi als Kommunikationsserver
Inhalt
Einleitung
Ob Du es glaubst oder nicht, aber bis vor Kurzem habe ich noch regelmäßige Faxe verschickt.
Dafür habe ich natürlich einen Online-Dienst verwendet, aber mein Gegenüber hatte ein Multifunktionsgerät mit Fax-Modul in Betrieb. Mein Gegenüber war in diesem Fall mein Vater, mit dem ich u.a. gemeinsam die Geschicke des Fußballklub Clausen lenken darf. Da wir ca. 80 km entfernt voneinander wohnen nutzten wir eben Faxe, um Dokumente miteinander auszutauschen. Davon wollte ich aber irgendwann weg, schließlich kostet jedes Fax Gebühren und es ist auch einfach nicht mehr zeitgemäß. Meine Eltern haben aber keinen Computer, sondern eben tatsächlich nur dieses Multifunktionsgerät. Also hatte ich mir überlegt ihnen einen Raspberry Pi als Kommunikationszentrale einzurichten.
Raspberry Pi
Installation
Mit dem NOOBS (New Out Of the Box Software) kannst Du Deinen Raspberry Pi sehr einfach einrichten. Dazu musst Du NOOBS erstmal herunterladen: https://www.raspberrypi.org/downloads/noobs/
Um die SD Karte vorzubereiten muss diese zuerst formatiert werden. Dafür gibt es verschiedene Tools, unter anderem SD Formatter, den Du hier herunterladen kannst: https://www.sdcard.org/downloads/formatter/index.html
Einfach die SD Karte formatieren und danach den Inhalt des NOOBS auf die formatierte SD Karte kopieren.
Danach die Karte wieder zurück in den Raspberry Pi und diesen mit Strom, Tastatur, am besten auch einer Maus, dem Netzwerk und einem Monitor verbinden. Du musst nur noch auswählen, was Du genau installieren möchtest, der Rest passiert komplett automatisiert.
Ich hatte mich in diesem Fall für Raspbian entschieden und wählte daher „Raspbian Full (RECOMMENDED)“ aus dem Menü aus.
Konfiguration
Welcome to Raspberry Pi
Beim ersten Start des Raspberry Pi erwartet Dich der „Welcome to Raspberry Pi“ Wizard, der Dich durch das initiale Setup führt.
Klicke auf Next, um das Setup zu starten.
Hier kannst Du das Land, die Sprache und die Zeitzone festlegen. Klicke danach abermals auf Next.
Nun musst Du ein neues Kennwort für Deinen Raspberry eingeben. Das Standardkennwort lautet “raspberry”.
Falls Dein Raspberry ein WLAN-Modul hat, kannst Du Dich danach mit dem WLAN verbinden. Ansonsten solltest Du weiterhin das Netzwerkkabel verwenden. Dann bekommst Du den folgenden Bildschirm aber auch gar nicht angezeigt.
Im nächsten Schritt sucht der Assistent nach Updates und bringt Deinen Raspberry auf den aktuellen Stand. Das kann eine ganze Weile dauern und Du solltest ein wenig Geduld mitbringen.
Nach der Installation der Updates kannst Du mit Done oder Reboot den Assistenten abschließen.
Bildschirmauflösung anpassen
Der Raspberry passt sich bezüglich der Bildschirmauflösung an den aktuellen Bildschirm an. Steckst Du den Bildschirm aber ab und möchtest per Fernsteuerung darauf zugreifen, ist die Auflösung extrem niedrig und nicht praktikabel. Deshalb solltest Du die Bildschirmauflösung direkt einstellen. Klicke dazu auf das Raspberry Symbol => Einstellungen => Raspberry-Pi-Konfiguration => System => Auflösung festlegen…
Ich empfehle Dir die Auflösung „DMT mode 85 1280×720 60Hz 16:9“. Bestätige die Auswahl mit OK.
Um per Fernzugriff auf den Raspberry zugreifen zu können, solltest du entweder VNC oder TeamViewer installieren. VNC kannst Du nutzen, wenn du direkt auf den Raspberry zugreifen kannst, er also im gleichen Netzwerk steht wie Dein eigener Computer. Da der Raspberry bei meinen Eltern zum Einsatz kommen sollte, habe ich mich für TeamViewer entschieden. Darüber kannst Du auch auf Geräte in anderen Netzwerken zugreifen.
Fernsteuerung einrichten
TeamViewer
Um TeamViewer Host zu installieren müssen folgende Voraussetzungen erfüllt sein:
- Hardware: Raspberry Pi 2 Modell B oder Raspberry Pi 3 Model B
- Betriebssystem: Raspian 8.0 Jessie mit X-Server
- freier Speicherplatz: 35 MB
- Anmeldung an Raspbian mit dem Benutzernamen pi
Du solltest das System unbedingt vor der Installation mit
sudo apt-get update && sudo apt-get dist-upgrade
aktualisieren, damit alle nötigen Paketquellen vorhanden sind und ein aktueller Kernel benutzt wird.
Du kannst TeamViewer Host als Paketdatei (*.deb) mit einem Browser direkt hier von der Seite TeamViewer.com herunterladen. In der Kommandozeile erhältst Du die aktuelle Version mit dem Kommando
wget https://download.teamviewer.com/download/linux/teamviewer-host_armhf.deb
Eine Paketdatei sollte sich nun je nach Deinen Einstellungen des Systems im Verzeichnis /home/pi/Downlaods (beim Herunterladen mit einem Browser) oder direkt in /home/pi/ befinden. Abgesehen von der Versionsnummer sollte die Datei als teamviewer-host_armhf.deb bezeichnet sein.
Wichtig ist, dass Du Dir den Dateinamen merkst, da Du die Bezeichnung gleich für die Installation benötigen wirst.
Zur Installation des TeamViewer Host nutzen wir den Paketmanager dpkg. Um alles einfach zu halten, wechselst Du am besten mit cd in das Verzeichnis, in dem Du die Paketdatei abgelegt hast. In meinem Fall wäre das
cd /home/pi/Downloads
Mit einem Dateimanager (grafisch) oder
ls -al
kannst Du prüfen, ob Du im richtigen Verzeichnis bist. ls -al listet Dir alle Dateien im aktuellen Verzeichnis auf. Bist Du im richtigen Verzeichnis kannst Du mit
sudo dpkg -i teamviewer-host_11.0.58397_armhf.deb
das Paket des TeamViewer host installieren. dpkg löst selbst keine Abhängigkeiten auf, deshalb wird es zu einigen Meldungen kommen. Das könnte ungefähr so aussehen:
pi@raspberrypi:~ $ sudo dpkg -i teamviewer-host_armhf.deb
Selecting previously unselected package teamviewer-host.
(Reading database ... 127554 files and directories currently installed.)
Preparing to unpack teamviewer-host_11.0.58397_armhf.deb ...
Unpacking teamviewer-host (11.0.58397) ...
dpkg: dependency problems prevent configuration of teamviewer-host:
teamviewer-host depends on libqt5gui5 (>= 5.2.1); however:
Package libqt5gui5 is not installed.
teamviewer-host depends on libqt5widgets5 (>= 5.2.1); however:
Package libqt5widgets5 is not installed.
teamviewer-host depends on libqt5qml5 (>= 5.2.1); however:
Package libqt5qml5 is not installed.
teamviewer-host depends on libqt5quick5 (>= 5.2.1); however:
Package libqt5quick5 is not installed.
teamviewer-host depends on libqt5webkit5 (>= 5.1.1); however:
Package libqt5webkit5 is not installed.
teamviewer-host depends on qtdeclarative5-qtquick2-plugin (>= 5.2.1) | qml-module-qtquick2 (>= 5.2.1); however:
Package qtdeclarative5-qtquick2-plugin is not installed.
Package qml-module-qtquick2 is not installed.
teamviewer-host depends on qtdeclarative5-controls-plugin (>= 5.2.1) | qml-module-qtquick-controls (>= 5.2.1); however:
Package qtdeclarative5-controls-plugin is not installed.
Package qml-module-qtquick-controls is not ins
dpkg: error processing package teamviewer-host (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
teamviewer-host
Da steht nun was von Errors, in Wirklichkeit sind es aber gar keine. Der Paketmanager dpkg meldet nur, dass weitere Pakete notwendig sind, damit der TeamViewer Host läuft und das Programm nach dem Installieren erst mal nicht weiter konfiguriert werden kann. Falls Du Deutsch als Systemsprache gewählt hast, wirst Du die Meldungen natürlich auf Deutsch bekommen. Keine Panik, die Lösung ist recht einfach und normalerweise Standard für die Auflösung von Abhängigkeiten. Einfach ein
sudo apt-get -f install
ausführen und schon ist alles so wie es soll.
Bist Du direkt in der Konsole, also nicht in einem Terminalfenster, welches auf der grafischen Oberfläche läuft kannst Du nun
teamviewer setup
ausführen und ein festes Passwort vergeben. Das ist hilfreich, wenn Du aus der Ferne auf den RasPi zugreifen möchtest und niemand da ist, der das generierte Passwort ablesen kann. Mit
teamviewer status
rufst Du die ID und das Passwort ab. Versuchst Du Teamviewer aus der Konsole mit
teamviewer
zu starten, funktioniert das nicht, da dazu eine grafische Oberfläche notwendig wäre. In der Konsole läuft der Teamviewer einfach als Dienst im Hintergrund. Die Meldung
pi@raspberrypi:~ $ teamviewer
Init...
Checking setup...
Launching TeamViewer ...
Launching TeamViewer GUI ...
Aborted
ist also normal und kein Grund zur Sorge. Versuche mal mit einem anderen Rechner und der ermittelten ID eine Verbindung herzustellen, es sollte gehen. Auf der grafischen Oberfläche ist jetzt im Menü sogar der TeamViewer zu sehen. Es würde jetzt auch nicht funktionieren, die obigen Kommandos in ein Terminalfenster einzugeben. Da kommt eine Meldung, dass Du Dich in der grafischen Oberfläche befindet und dass das nur in einer echten Konsole geht.
VNC
VNC ist beim Raspberry Pi schon vorinstalliert, so dass es nur noch aktiviert werden muss. Dazu geben wir in einem Terminal
sudo raspi-config
ein und wählen dann Punkt „5 Interfacing Options“ und danach „P3 VNC“ und aktivieren hier VNC.
Danach wirst Du gefragt, ob Du neu starten möchtest, was Du mit „Ja“ beantworten solltest.
Nach ca. 30 bis 60 Sekunden kannst Du Dich dann mit dem Raspberry verbinden. Dazu empfehle ich den RealVNC Viewer von der Seite: https://www.realvnc.com/en/connect/download/viewer/ Der Benutzername lautet standardmäßig „pi“, das Kennwort „raspberry“.
E-Mail-Adresse anlegen
In meinem Fall nutze ich die Verwaltungsoberfläche Plesk für unseren Webserver und u.a. um neue E-Mail-Adressen anzulegen. In meinem Fall lege ich die E-Mail-Adresse „quatsch@fk-clausen.de“ an, auf die ich später per IMAP bzw. SMTP zugreifen werde.
Talend Job erstellen
Um regelmäßig auf neue E-Mails zu prüfen und deren Anhänge dann auszudrucken nutze ich das Talend Open Studio for Data Integration. Damit kann ich auf visuelle Art und Weise ein Java-Programm erstellen, welches die genannten Aufgaben für mich erledigt.
Das Talend Open Studio for Data Integration ist ein Open Source Tool, welches unter www.talend.com heruntergeladen werden kann.
Innerhalb meines Jobs müssen folgende Schritte durchgeführt werden:
- Erstellen eines temporären Ordners (Komponente tFileTouch)
- Prüfen auf neue E-Mails und gegebenenfalls abspeichern als .mail-Datei (Komponente tPOP)
- Extrahieren der Metadaten und Anhänge aus der .mail-Datei (Komponente tFileInputMail)
- Speichern des Betreffs in der Variable „Subject“ (Komponente tSetGlobalVar)
- Drucken der Anhänge über die Linux Bash (Komponente tSystem)
- Löschen der temporären Dateien (Komponente tFileDelete)
- Senden einer E-Mail-Bestätigung, dass alles funktioniert hat (Komponente tSendMail)
Temporären Ordner erstellen
In der Kontext-Variable „temp_folder“ habe ich den Namen des temporären Ordners hinterlegt. Darin erstellen wir mit der Komponente tFileTouch eine neue Datei namens test.file. Per Trigger „OnSubjobOk“ verbinden wir die Komponente mit dem nächsten Subjob zum Einlesen und Extrahieren der E-Mails.
E-Mail vom Server abrufen
In der Komponente tPOP müssen die Verbindungsdaten zum zuvor erstellten Postfach hinterlegt werden. Auch diese habe ich in Kontext-Variablen gespeichert, falls sie später mal geändert werden müssen. Dann sind die Informationen wie Benutzername und Kennwort nicht fest im Java-Code hinterlegt, sondern können über eine Datei angepasst werden.
Metadaten einlesen und Anhänge speichern
Die Komponente tFileInputMail liest die extrahierte .mail-Datei ein, extrahiert die Metadaten (Datum, Absender, Betreff) und speichert die Anhänge der E-Mail.
Betreff in einer Variable speichern
Um im Erfolgsfall eine Bestätigungsmail versenden zu können, speichere ich den Betreff in einer globalen Variable namens „Subject“.
Nachdem das alles erledigt, nutze ich den Trigger „If“, um weiterzumachen. Nur wenn die Variable „Subject“ gefüllt ist, also eine neue E-Mail verarbeitet wurde, geht es mit den nächsten Schritten weiter.
Anhänge drucken
Mit Hilfe der Komponente tSystem führen wir nun den Druckbefehl direkt über die Linux Bash aus. Der Befehl lautet „/bin/bash -c lp + context.temp_folder + .pdf“.
Temporären Ordner löschen
Im Erfolgsfall (Trigger => OnSubjobOk) sorgt die Komponente tFileDelete dafür, dass der temporäre Ordner wieder gelöscht wird.
Bestätigungsmail versenden
Falls bis hierhin alles funktioniert hat, verschickt die Komponente tSendMail eine E-Mail an den Absender. Darin enthalten ist auch die Rückmeldung der Linux Bash auf den Druckbefehl aus der Komponente tSystem.
Job exportieren
Der Job kann als Java-Applikation exportiert werden. Dabei erhalten wir eine ZIP-Datei mit allen Bibliotheken, die benötigt werden. Außerdem befindet sich in dem ZIP eine Batch- und eine Powershell-Datei für Windows und eine Bash-Datei für Linux.
Das Bash-Skript müssen wir noch ein wenig anpassen und die Ordner ändern, damit das Skript später auch als Cron-Job funktioniert.
Die Variable $ROOT_PATH muss durch den absoluten Pfad geändert werden. In meinem Fall also durch „/home/pi/Print_Mail_0.1/Print_Mail„
Talend Job übertragen
Zur Übertragung der Daten nutze ich FileZilla, weil ich darüber sehr einfach SFTP machen kann. Einfach das passende Protokoll auswählen, die IP-Adresse oder den Hostnamen des Raspberrys eingeben und Dich mit Benutzername „pi“ und dem Kennwort „raspberry“ anmelden.
Talend Job ausführen
Berechtigung anpassen
Damit der Talend Job ausgeführt werden kann, musst Du in einem Terminal noch die Berechtigungen ändern. Bash-Skripte können standardmäßig nicht direkt ausgeführt werden, dazu musst Du erst einen Befehl ausführen und die Ausführung für das Skript erlauben.
chmod +x Print_Mail_run.sh
Ausführen kannst Du den Talend Job dann mit dem Befehl
./Print_Mail_run.sh
Cronjob einrichten
Was ist ein Cronjob?
Cronjobs sind Skripte oder Aufgaben, die zu einem bestimmten Zeitpunkt automatisch vom System ausgeführt werden sollen. Das System eignet sich deshalb besonders gut für Aufgaben, die immer wieder anstehen und die kein Eingreifen verlangen. Cronjobs sind eigentlich dasselbe wie die „Geplanten Tasks“ unter Windows.
Wie erstelle ich einen Cronjob?
Es gibt im Grunde zwei verschiedene Möglichkeiten einen Cronjob einzutragen. Zum einen von Hand in der Datei /etc/crontab, die aber nur vom User root (sudo su) geändert werden kann oder mit dem Befehl „crontab -e“ (Job läuft unter dem aufrufenden Benutzer).
Wie muss ein Cronjob aussehen?
Jeder Cronjob hat folgendes Format:
* * * * * auszuführender Befehl
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7, Sonntag ist 0 oder 7)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)
Ein Stern * bedeutet Ausführung wird immer erfolgen, also zu jeder Minute, jeder Stunde, jedem Tag, jedem Monat oder jedem Wochentag. Um die einzelnen Stellen auseinander zu halten, hilft folgende Übersicht:
- Minute: 0-59
- Stunde: 0-23
- Tag des Monats: 1-31
- Monat: 1-12
- Tag der Woche: Möglich ist 0-7, wobei 0 und 7 jeweils der Sonntag ist.
- User: Der Benutzer unter dem das Script ausgeführt werden soll.
- Befehl: Konsolen-Befehl oder Script das ausgeführt wird
Öffne jetzt die Konfiguration der Cronjobs mit dem Befehl
crontab -e
Um nun den Talend Job alle zehn Minuten auszuführen, erstellst Du folgenden Eintrag:
*/10 * * * * /home/pi/Print_Mail_0.1/Print_Mail/Print_Mail_run.sh #Print Mail
Achte bitte auf jeden Fall auf die Leerzeile am Ende der Datei.
gnome-schedule
Für alle, denen das zu kompliziert ist, bietet Raspbian auch eine graphische Oberfläche namens „gnome-schedule“, die zur Verwaltung von Cronjobs genutzt werden kann.
Die Installation von gnome-schedule ist ganz einfach, gib dazu im Terminal folgenden Befehl ein:
sudo apt-get install gnome-schedule
Mit einem Klick auf Neu kannst Du einen neuen Cronjob einrichten. Der Talend Job soll alle 10 Minuten laufen, daher musst Du folgendes im neuen Cronjob einstellen:
Cron-Logs aktivieren
Damit Du auch mitbekommst was Dein Cronjob so treibt, oder ob es evtl. irgendwelche Probleme gibt, musst Du noch das Logging für Cronjobs aktivieren. Dazu bearbeitest Du die Datei /etc/rsyslog.conf mit
sudo nano /etc/rsyslog.conf
entferne das # vor dieser Zeile, um das Logging zu aktivieren.
# cron.* /var/log/cron.log
Danach musst Du den Raspberry neu starten und findest dann die Logs in der Datei /var/log/cron.log
Drucker installieren
CUPS installieren und entfernten Zugriff aktivieren
Um einen Drucker auf dem Raspberry Pi zu installieren, musst Du CUPS (Common Unix Printing System) installieren. Über ein Terminal-Fenster gibst du
sudo apt-get install cups
ein und folgst den Anweisungen auf dem Bildschirm. Die Installation kann aufgrund der Größe von CUPS ein wenig dauern. Zeit Dir also einen Kaffee zu holen. ?
Natürlich benötigen wir auch Berechtigungen auf die Drucker und Druckerwarteschlangen, weshalb wir den aktuellen Benutzer „pi“ zur Gruppe „lpadmin“ hinzufügen sollten:
sudo usermod -a -G lpadmin pi
Damit die CUPS Konfiguration via Webbrowser von einem entfernten Computer aus geändert werden kann, musst Du noch ein paar Anpassungen vornehmen. Wie üblich unter Linux musst Du dazu eine Konfigurationsdatei öffnen:
sudo nano /etc/cups/cupsd.conf
Suche dort nach den Zeilen
# Only listen for connections from the local machine
Listen localhost:631
Kommentiere die zweite Zeile und ergänze eine neue
# Only listen for connections from the local machine
# Listen localhost:631
Port 631
Weiter unten in der Konfiguration findest Du den Abschnitt „Location“, der ebenfalls angepasst werden muss. Die Änderungen sind hier fett markiert:
< Location / >
# Restrict access to the server...
Order allow,deny
Allow @local
< /Location >
< Location /admin >
# Restrict access to the admin pages...
Order allow,deny
Allow @local
< /Location >
< Location /admin/conf >
AuthType Default
Require user @SYSTEM
# Restrict access to the configuration files...
Order allow,deny
Allow @local
< /Location >
Um die Änderungen zu aktivieren, muss CUPS neu gestartet werden:
sudo /etc/init.d/cups restart
Ab jetzt kannst Du mit einem Browser über die IP-Adresse des Raspberrys und den Port 631 auf CUPS zugreifen (Beispiel http://192.168.2.40:631)
Drucker mit CUPS hinzufügen
Nach dem ersten Aufruf landest Du auf der Homepage. Für uns interessant ist der Menüpunkt „Verwaltung“, worauf Du klicken musst.
Klicke auf „Drucker hinzufügen“, denn genau das wollen wir jetzt ja machen. 😉
Danach musst Du Dich nochmal autorisieren, wozu Du abermals den Benutzernamen „pi“ und das Kennwort „raspberry“ nutzen kannst.
Hier werden Dir nun alle automatisch erkannten Drucker angezeigt. Sowohl die lokal verbundenen (z. B. per USB) als auch die Netzwerkdrucker. Wähle den Drucker aus der Liste aus, den Du gerne installieren möchtest.
CUPS erkennt zwar automatisch Deine Drucker, macht aber keine Anstalten diese auch zu installieren. Den passenden Treiber musst Du leider nach wie vor selbst angeben. Oder Du lädst Dir eine PPT-Datei auf der Herstellerseite herunter und lädst diese hier hoch.
Überprüfe am Ende nochmal die Installation und bestätige mit “Set default Option”.
Fazit
Der Raspberry läuft mittlerweile schon fast ein halbes Jahr bei meinen Eltern als Kommunikationsserver und verrichtet eifrig und ohne Probleme seine Dienste.
Die Lösung ist also brauchbar und es hat darüber hinaus auch sehr viel Spaß gemacht, daran zu „basteln“.