Open Source im professionellen Einsatz
Linux-Magazin 04/2015
© ice, 123RF

© ice, 123RF

Raspberry Pi steuern mit Android

Tanzstunde

Wer den Raspberry Pi über eine Android-App zum Tanz auffordern möchte, bringt am besten Websockets mit auf den Ball. Sie erleichtern die gepflegte Konversation mit dem graziösen Minirechner.

1027

Ihre große Auswahl, allgemeine Verfügbarkeit und reichhaltige Ausstattung bei einem zugleich niedrigen Preis machen Kleincomputer mit relativ leistungsfähigen Mikroprozessoren zurzeit nicht nur bei Programmierern und Konstrukteuren beliebt, sondern auch bei Hobby-Entwicklern. Es gibt Minis in vielen Varianten, sie sind verfügbar und zugleich großzügig ausgestattet – und all das zum niedrigen Preis. Am bekanntesten ist der Raspberry Pi, zu nennen wären aber auch Cubietruck, Banana Pi, Beagle Bone oder Odroid C1.

Mittlerweile laufen auf diesen Plattformen dank schneller Prozessoren mit MMU-Einheiten komplette Desktop-Betriebssysteme wie Debian und Ubuntu. Sie ermöglichen zugleich den problemlosen und schnellen Zugriff auf Hardwarebusse über I2C, 1-Wire oder SPI. Dementsprechend entwickeln Benutzer der kleinen Einplatinencomputer bevorzugt Projekte, mit denen sie die beiden Welten Informatik und Elektronik miteinander kombinieren. Ihre Software liest eine Reihe externer Sensoren (Temperatur, Druck) aus, steuert Aktuatoren (Relais, Triac) und verbindet so Daten mit der realen Welt.

Während Hardwareplattformen wie etwa Beagle Bone Black oder Raspberry Pi weltweit an Bekanntheit gewinnen, wächst auch das Interesse an Projekten für die Heimautomatisierung. Dieser Bereich gilt vielen als Prüfstein dafür, ob Software und Hardware ideal zusammenarbeiten. Die Bedeutung schlägt sich unter anderem in einer rapide steigenden Anzahl an Fragen in thematisch verwandten Foren nieder. Eine oft und gern geführte Diskussion behandelt beispielsweise die Frage, wie sich das Entwicklerboard XYZ, das als Herz einer Heimautomatisierung fungiert, mit mobilen Geräten kontrollieren und steuern lässt.

Der vorliegende Artikel zeigt anhand zweier Beispielprojekte, wie sich auf dem Raspberry Pi ein Server betreiben lässt (Websockets Server), an den eine Clientanwendung (Websockets Client) asynchrone Broadcast-Benachrichtigungen schickt. Zu diesem Zweck kommt eine C-Implementierung des populären Websocket-Protokolls zum Einsatz, über das sich dank existierender Softwarebibliotheken auch ohne umfassendes Netzwerkwissen ein handlicher Kommunikationskanal aufbauen lässt.

Websockets

Bevor es daran geht, die Details zu implementieren, bedarf es einiger Kenntnisse zur Websockets-Technologie. Sie kommt zum Einsatz, wenn es darum geht, eine schnelle und leistungsfähige Zwei-Wege-Kommunikation zwischen Webanwendungen und Clients in Echtzeit zu realisieren. Das betrifft unter anderem Kommunikationsprogramme oder Multiplayer-Spiele. Der Grund: Das HTTP-Protokoll, das nach dem Frage-Antwort-Prinzip arbeitet, reicht schon seit geraumer Zeit für die Bedürfnisse vieler Anwendungen nicht mehr aus. Das gilt sowohl für die Ansprüche der Anwendungsentwickler als auch für die der Benutzer.

Anfangs versuchten die HTTP-Entwickler mit aktiven Abfragen gegenzusteuern und das Protokoll so zu erweitern, dass es den Eindruck von Asynchronität erzeugt. Die so genannte Polling-Methode trickst, indem sie Abfragen mehrfach an den Server sendet, um festzustellen, ob die Daten für den Client bereits ablesebereit sind. In der Praxis erwies sich diese Methode als wenig leistungsfähig, sie erzeugt ordentlich Traffic und belastet das Netz.

Daher haben W3C und IETF im Dezember 2011 einen neuen Standard entwickelt, um die eingetretenen Probleme zu lösen. So entstand das Websocket-Protokoll, das den Zwei-Wege-Austausch der Daten über eine TCP-Verbindung abwickelt. Der Standard verwendet zunächst das übliche TCP-Protokoll, fängt aber die Verbindung zwischen Server und Client im Zuge der typischen HTTP-Transaktion ab und bittet darum, das Protokoll zu ändern und zu aktualisieren, wie es die Abbildung 1 darstellt.

Abbildung 1: Ablauf eines Handshake beim Websocket-Protokoll.

Zu den wesentlichen Vorteilen des Websocket-Protokolls zählen unter anderem:

  • Es erlaubt Client-Server-Architekturen, die das Netz nur wenig belasten. Unter anderem fällt dadurch das bislang genutzte Polling weg.
  • Asynchrone Broadcast-Benachrichtigungen lassen sich einfach implementieren.
  • Das Format der hochgeladenen Daten lässt sich beliebig wählen, es darf sich beispielsweise um Json- und XML-Dateien oder einfache Textmitteilungen handeln.
  • Für die verschiedenen Dateitypen kommen getrennte und optimierte Übertragungskanäle zum Einsatz, etwa für Text- und Binärdateien.
  • Es beherrscht chiffrierte Verbindungen.
  • Zahlreiche Bibliotheken unterstützen das Websocket-Protokoll, und es existieren Bindings für die bekanntesten Programmiersprachen, wozu beispielsweise Java, Javascript, aber auch C# oder PHP gehören.
  • Das Protokoll lässt sich einfach und schnell implementieren. In den meisten Fällen liefern die Bibliotheken dem Programmierer einen hohen Grad an Abstraktion. Der erspart es ihm zum Beispiel, Details darüber zu kennen, wie er Data Frames bauen, formatierten und versenden muss.
  • Die meisten bekannten Internetbrowser unterstützen Websockets.

Ursprünglich sollten sich Websockets vor allem um die Kommunikation von Internetbrowsern mit Internetdiensten kümmern. Sie zogen jedoch recht schnell in andere Lösungen ein, die aufgrund ihrer Architektur eine einfache und leistungsfähige Kommunikation zwischen Client und Server erfordern. In dem folgenden Beispiel sollen Websockets den Einplatinencomputer Raspberry Pi mit Android-Mobilgeräten verbinden.

Doppelter Spaß

Der Artikel zeigt gleich zwei Anwendungen (Abbildung 2). Websockets Server dient als einfacher Echo-Server, während die Clientanwendung Websockets Client auf Android läuft, die Daten als einfache Json-Objekte an den Server sendet und solche von diesem empfängt.

Abbildung 2: Der Raspberry Pi arbeitet als Websocket-Server und erledigt im Artikel gleich zwei Aufgaben. Zum einen dient er als einfacher Echo-Server, zum anderen schickt er eine Nachricht an das Smartphone, sobald jemand einen USB-Stick anstöpselt.

Neben der Echo-Funktion implementiert der Code auch die Möglichkeit, asynchrone Broadcast-Meldungen an alle an den Server angeschlossenen Clients zu versenden. Um nicht einen weiteren Artikel zum GPIO-Monitoring abzuliefern, sollen die Server- und Client-Anwendung asynchrone D-Bus-Signale austauschen, die im Beispiel der Udisks-Daemon erzeugt. Konkret hat der Server eine Nachricht an die Clientanwendung auf dem Android-Gerät zu senden, sobald ein User einen USB-Stick an den Raspberry Pi steckt. Die erscheint dann auf dem Android-Gerät, Abbildung 2 zeigt schematisch, wie das aussehen soll.

Das Hauptfenster der Anwendung Websockets Client zeigt Abbildung 3. Das Interface besteht aus drei Feldern vom Typ »EditBox« . Über sie gibt der Nutzer Parameter wie die IP-Adresse, die Nummer des Ports und ein Timeout in Millisekunden ein. Ein Druck auf den »Connect« -Button verbindet ihn mit dem Raspberry Pi. Über das »EditBox« -Feld im unteren Teil des Bildschirms schickt er Befehle an den Server. Alle so verschickten Botschaften erscheinen im mittleren Bereich des Bildschirms.

Abbildung 3: Die Benutzeroberfläche der Client-anwendung Websockets Client.

Obwohl die Internetanwendung auf einem Raspberry Pi entwickelt und getestet wurde, können Leser, die keinen ARM-Rechner besitzen, sie auch auf ihrem Linux-Rechner übersetzen und testen [1]. Auf Github wartet die aktuelle Version des Quellcodes für den Server [2] und den Client [3].

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

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

Linux-Magazin kaufen

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

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    HTML 5 bringt Websockets, über die Webserver mit ihren Clients in einen Dialog treten können. Die im Folgenden vorgestellte kleine Webapplikation zeigt in Echtzeit im Browser, welche Seiten beliebige User von einem Webserver im Moment aufrufen.

  • WebSocket4J 1.2 implementiert Client und Server

    Websocket4J, eine freie Umsetzung des bidirektionalen Websocket-Protokolls in Java, ist in Version 1.2 erhältlich. Erstmals setzt sie neben dem Server auch den Client-Part um.

  • HTML 5

    Dank HTML 5 lassen sich Client-Server-Anwendungen mit grafischer Oberfläche programmieren, wie sie das Web bisher nicht kannte. Dieser Artikel zeigt, wie das mit Canvas, SVG und Websockets geht. Die Bibliotheken Jquery, Visualize und Autobahn helfen bei der Arbeit.

  • Galileo Send: Dateien per Websockets übertragen

    Der Entwickler Joel Berger hat ein neues Protokoll namens Galileo Send vorgestellt, mit dem sich Dateien über Websockets übertragen lassen.

  • Screencast: Webanwendungen mit Websockets

    In einem Screencast zum Linux-Magazin-Artikel "Blühende Oberflächen" zeigt der Autor Andreas Möller Server- und Client-Komponente für die Anwendung.

comments powered by Disqus

Ausgabe 06/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.