Was lässt sich mit der Demo-Applikation nun anstellen? Um den Aufwand für ein erstes Beispiel gering zu halten, versuchen wir über zwei Buttons auf einer Webseite eine LED zu schalten. Dazu verbinden Sie den Pluspol der LED (langes Bein) über einen Vorwiderstand von 220 Ohm bis 1 kOhm mit GPIO 13, den Minuspol der Diode (kurzes Bein) legen Sie direkt auf einen der Masse-Pins.
In der UI-Datei fügen Sie nun einen zweiten Button ein, den Sie mit “Licht aus” beschriften, als Logik fügen Sie den Inhalt aus Listing 8 ein. Da Sie jetzt auf die Hardware des Raspberry Pi zugreifen, benötigt Jetty die entsprechende Berechtigung. Sie müssen den Dienst daher jetzt mittels sudo mvn jetty:run mit Root-Rechten starten. Das Ergebnis der leicht überarbeiteten Seite im Browser zeigt Abbildung 3.
Listing 8
package local;
import javax.servlet.annotation.WebServlet;
import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.annotations.Widgetset;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Label;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPin;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
@Theme("mytheme")
@Widgetset("local.MyAppWidgetset")
public class MyUI extends UI {
static GpioPinDigitalOutput led=null;
@Override
protected void init(VaadinRequest vaadinRequest) {
final GpioController gpio = GpioFactory.getInstance();
led = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_13,"LED", PinState.LOW);
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
Button buttonOn = new Button("Licht an");
buttonOn.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
MyUI.led.high();
}
});
Button buttonOff = new Button("Licht aus");
buttonOff.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(ClickEvent event) {
MyUI.led.low();
}
});
layout.addComponent(buttonOn);
layout.addComponent(buttonOff);
}
@WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
@VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
public static class MyUIServlet extends VaadinServlet {
}
}
Werfen wir noch einen ausführlichen Blick in das Demo-Programm (Sie finden es auch auf der Heft-DVD dieser Ausgabe im Verzeichnis RPG/vaadin/). Nach der für Java typischen Importarie wählt die Applikation über Annotations (@...) das Theme und das Widget-Set aus – auf diese Weise definieren Sie die komplette Optik des Programms. Kurz vor dem Ende der Klasse finden Sie noch zwei Annotations, die das Verhalten des Servlets steuern. Dies sind die einzigen Indizien, dass es sich hier um eine Webapplikation handelt.
Der restliche Quelltext könnte genauso gut auch aus einer Java-FX-Applikation stammen. Im Großen und Ganzen erzeugt der Code zwei Buttons, die jeweils an einen sogenannten Listener gebunden werden. Innerhalb der Listener finden sich anonyme Klassen, die jeweils bestimmte Aktionen ausführen, sobald der Anwender einen der Buttons drückt. Die wenigen Befehle zur Ansteuerung der GPIO sollten keiner weiteren Erklärung bedürfen.
Fazit
Die kleine Demo zeigt, dass es gar nicht so kompliziert ist, ein professionelles Web-Application-Framework auf dem Raspberry Pi zum Laufen zu bekommen. Zugegeben, die einzelnen Schritte bis zur lauffähigen Applikation benötigen etwas Zeit, und auch der erste Aufruf im Browser dürfte ruhig etwas schneller geschehen. Sobald die Applikation aber erst einmal komplett initialisiert wurde, stellen die Antwortzeiten kein Problem mehr dar.
Ihre Applikation müssen Sie zudem nicht unbedingt auf dem CPU-technisch schwachbrüstigen RasPi bauen: Dieser Schritt lässt sich ohne Probleme auf einen leistungsstarken Desktop-PC auslagern. Das erzeugte WAR-Archiv kopieren Sie dann mit Scp oder einem Windows-Tool wie WinSCP in den Jetty-Server. Der Schritt des Kopierens lässt sich übrigens bei Bedarf mit Maven automatisieren.
Mit diesem Artikel haben Sie die nötigen Grundlagen erfahren, um eigene Applikationen mit Vaadin auf dem Raspberry Pi zu entwickeln. Mit ein wenig Einarbeitung lassen sich wesentlich umfangreichere Projekte mit Vaadin umsetzen. Das Framework bietet im Vergleich zu anderen Alternativen mehr Möglichkeiten, wie zum Beispiel Drag & Drop oder verschiedene Charts [6]. Wir wünschen Ihnen viel Spaß beim Experimentieren.
Der Autor
Martin Mohr erblickte im Zeitalter der Magnet-Ringkernspeicher und Hebdrehwähler das Licht der Welt. Nach einer Ausbildung zum Elektroniker und einem Informatikstudium lag sein Beschäftigungsfeld überwiegend in der Entwicklung von Java-Applikationen. Mit dem Raspberry Pi erwachte die alte Liebe zur Elektronik aufs Neue.
Glossar
- Servlet
-
Eine Java-Klasse, deren Instanzen innerhalb eines Webservers Anfragen von Clients entgegennehmen und beantworten.
Infos
- Vaadin: https://vaadin.com
- Vaadin-GUI-Demobereich: http://demo.vaadin.com/sampler
- “Book of Vaadin”: https://vaadin.com/book
- Raspbian: https://www.raspberrypi.org/downloads/raspbian
- PuTTY: http://www.chiark.greenend.org.uk/~sgtatham/putty
- Vergleichsmatrix zu Vaadin-Alternativen: https://vaadin.com/comparison
- Maven: https://maven.apache.org
- Jetty: http://www.eclipse.org/jetty
- WiringPi: http://wiringpi.com
- Pi4j: http://pi4j.com






