Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung...

5
Durchblick im Dschungel Java und IoT im Praxiseinsatz – Teil 1: Wegweiser Eldar Sultanow Die Zukunft einiger Industrien ist ohne das Internet of Things (IoT) mittlerweile kaum vorstellbar. Entsprechend wuchern Frameworks, Technologien, Cloud-Lösungen, generische Platt- formen und IoT-Entwicklungswerkzeuge zu einem undurch- schaubaren Dickicht. Dieser Artikel sorgt für mehr Klarheit im Java-IoT-Dschungel und gibt einen Überblick über die Frame- works, Technologien und Tools im Java-Umfeld. Zudem stellt er eine schichtenartige Referenzarchitektur für IoT vor. Der erste Teil der Artikelserie geht auf die Übertragungsstandards und Protokolle sowie die Bausteine für die Protokoll-standardkon- forme Kommunikation ein, während sich der zweite Teil mit Modellierungs-, Entwicklungs- und Bereitstellungswerkzeugen sowie Frameworks für die IoT-Anwendungsentwicklung beschäf- tigen wird. Kevin Ashton prägte den IoT-Begriff, der für das Verbinden der physischen Welt mit dem Internet steht. Dabei sind eindeutige IDs das Verbindungsglied [ama]. Die via AutoID (RFID oder opti- sche Verfahren) sowie sensorisch erfassten Daten sind die Grund- lage für tiefgehende Analysen. So können beispielsweise Ingeni- eure die Vibrationen der Rotorblätter von Windturbinen erfassen und Wartungsarbeiten beginnen, bevor ein Rotorblatt defekt ist. Im Bereich Gebäudemanagement kann die Beleuchtung auf Stock- werken, auf denen sich niemand befindet, optimiert werden. Per IoT sind selbstfahrende Fahrzeuge in der Lage, Informationen aus der Umgebung zu verarbeiten. Damit können sie innerhalb von Se- kundenbruchteilen anhalten, um beispielsweise Unfälle zu vermei- den. Weitere Nutzungsbeispiele finden sich bei der intelligenten Vernetzung in der Pharma- und Medizinbranche. Hier sind digita- le Patientenakten, gerätegestützte Überwachung oder auch die Übertragung von Biodaten und die Rückverfolgbarkeit von Arznei- mitteln zu nennen. IoT-Frameworks, Technologien und Tools: Eine Einordnung Die Frameworks, Technologien und Tools – dazu gehört auch Hard- ware, sprich IoT-fähige Endgeräte – nennen wir aus Gründen der Einfachheit „Bausteine“. Einige dieser Bausteine dienen der An- bindung an die Cloud, andere sind reine Message-Broker und damit SCHWERPUNKTTHEMA 18 JavaSPEKTRUM 2/2018

Transcript of Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung...

Page 1: Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung an die Cloud, andere sind reine Message-Broker und damit Not amused››taSc ...

Durchblick im Dschungel

Java und IoT im Praxiseinsatz – Teil 1: WegweiserEldar Sultanow

Die Zukunft einiger Industrien ist ohne das Internet of Things (IoT) mittlerweile kaum vorstellbar. Entsprechend wuchern Frameworks, Technologien, Cloud-Lösungen, generische Platt-formen und IoT-Entwicklungswerkzeuge zu einem undurch-schaubaren Dickicht. Dieser Artikel sorgt für mehr Klarheit im Java-IoT-Dschungel und gibt einen Überblick über die Frame-works, Technologien und Tools im Java-Umfeld. Zudem stellt er eine schichtenartige Referenzarchitektur für IoT vor. Der erste Teil der Artikelserie geht auf die Übertragungsstandards und Protokolle sowie die Bausteine für die Protokoll-standardkon-forme Kommunikation ein, während sich der zweite Teil mit Modellierungs-, Entwicklungs- und Bereitstellungswerkzeugen sowie Frameworks für die IoT-Anwendungsentwicklung beschäf-tigen wird.

Kevin Ashton prägte den IoT-Begriff, der für das Verbinden der physischen Welt mit dem Internet steht. Dabei sind eindeutige IDs das Verbindungsglied [ama]. Die via AutoID (RFID oder opti-sche Verfahren) sowie sensorisch erfassten Daten sind die Grund-lage für tiefgehende Analysen. So können beispielsweise Ingeni-

eure die Vibrationen der Rotorblätter von Windturbinen erfassen und Wartungsarbeiten beginnen, bevor ein Rotorblatt defekt ist. Im Bereich Gebäudemanagement kann die Beleuchtung auf Stock-werken, auf denen sich niemand befindet, optimiert werden. Per IoT sind selbstfahrende Fahrzeuge in der Lage, Informationen aus der Umgebung zu verarbeiten. Damit können sie innerhalb von Se-kundenbruchteilen anhalten, um beispielsweise Unfälle zu vermei-den. Weitere Nutzungsbeispiele finden sich bei der intelligenten Vernetzung in der Pharma- und Medizinbranche. Hier sind digita-le Patientenakten, gerätegestützte Überwachung oder auch die Übertragung von Biodaten und die Rückverfolgbarkeit von Arznei-mitteln zu nennen.

IoT-Frameworks, Technologien und Tools: Eine EinordnungDie Frameworks, Technologien und Tools – dazu gehört auch Hard-ware, sprich IoT-fähige Endgeräte – nennen wir aus Gründen der Einfachheit „Bausteine“. Einige dieser Bausteine dienen der An-bindung an die Cloud, andere sind reine Message-Broker und damit

SCHWERPUNKTTHEMA

18 JavaSPEKTRUM 2/2018

birgittgilis
JS Sonderdruck
Page 2: Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung an die Cloud, andere sind reine Message-Broker und damit Not amused››taSc ...

hochskalierbare Ereignisnachrichten-Vermittler. Bei wiederum an-deren handelt es sich um Anwendungsplattformen oder DevOps-Lö-sungen, die für IoT-Endgeräte ausgelegt sind. Das heißt: Die Bau-steine sind unterschiedlichen Architekturschichten zuzuordnen, zum Beispiel einer Anwendungs- oder Technologie-Schicht. Über eine Referenzarchitektur lassen sich die Bausteine in einzelne Schichten gliedern.

Wie eine solche Referenzarchitektur für IoT im Detail aussehen kann, zeigt Abbildung 1. Sie gibt Programmierern und Architekten einen Überblick über vorhandene Bausteine für die Entwicklung von IoT-Anwendungen.

Übertragungsstandards sind die grundlegendste SchichtStarten wir mit der grundlegendsten Schicht, den Übertragungs-standards. Gemäß des IoT-Ansatzes sind Geräte innerhalb eines Netzwerks untereinander und mit mindestens einem Server ver-bunden. Die IoT-Geräte tauschen Daten entweder untereinan-der aus, bevor sie an einen Server gesendet werden. So können zum Beispiel in einer Lagerhalle an verschiedenen Stellen instal-lierte Receiver die Positionsdaten von beweglichen Objekten wie

Dr. Eldar Sultanow ist Architekt bei Capgemini. Seine Schwerpunkte sind moderne Softwarearchitekturen, Di-gitalisierung und Unternehmensar-chitekturmanagement. Er hat bereits aus verschiedenen seiner Projekte berichtet. E-Mail: [email protected]

Abb. 1: Die Referenzarchitektur für IoT mit Java gliedert die ver-schiedenen Bausteine in Schichten

SCHWERPUNKTTHEMA

www.javaspektrum.de 19

Page 3: Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung an die Cloud, andere sind reine Message-Broker und damit Not amused››taSc ...

etwa mit aktiven Beacons versehenen Gabelstaplern oder Perso-nen sammeln und diese dann konsolidiert und portionsweise an einen oder mehrere Server senden. Oder die IoT-Geräte senden ihre Daten direkt an den Server: Dabei geben beispielsweise die Sonoff WiFi Power Switches ihre Energieverbrauchsmessungen di-rekt an einen OpenWrt-Router. OpenWrt ist eine Linux-Distribu-tion für eingebettete Systeme wie WLAN-Router. Linksys bietet etwa mit WRT3200ACM einen solchen Router an, der mit OpenWrt Open-Source-fähig ist.

In der grundlegendsten Schicht wird die Frage geklärt, wie im Rahmen dieser Kommunikation Daten ausgetauscht werden, wobei der Schwerpunkt auf der Übertragung selbst liegt und nicht auf den Inhalten. Sehr anschaulich macht dies das Beispiel der zwi-schenmenschlichen Kommunikation. Hier stellt sich die Frage: Fin-det die Kommunikation/Übertragung per Briefpost, E-Mail oder Te-lefon statt? Betrachtet werden weder die Inhalte noch die Sprache, in der geschrieben oder gesprochen wird.

Einen Übertragungsstandard, nämlich WLAN, haben wir bereits im Beispiel mit dem OpenWRT-Router erwähnt. Nun gibt es zahl-reiche weitere: ZigBee ist eine Spezifikation für Drahtlosnetze, die den IEEE-802.15.4-Standard um eine Netzwerk- und Anwen-dungsschicht erweitert. Sie wird beispielsweise in der Gebäude-automation, in Sensornetzwerken oder in der Lichttechnik einge-setzt. Obwohl der Schwerpunkt von ZigBee auf Netzen mit kurzen Reichweiten liegt, sind auch Reichweiten von mehreren Kilometern möglich. Bluetooth ist ein Industriestandard (IEEE 802.15.1) für die Datenübertragung zwischen Geräten über kurze Distanz. Typische Einsatzgebiete sind mobile Lautsprecher, Verbindung zwischen Smartphone und PC oder zwischen Smartphone und Bordcomputer im Auto oder die drahtlose Verbindung von Maus und Tastatur zum PC. Des Weiteren gibt es noch die WiMAX/IEEE-802.16-Standards, die beispielsweise von Sigfox und LoRa [cw] verwendet werden, und die bekannten Mobilfunkstandards wie etwa LTE – jener der vierten Generation (4G).

Die Mobilfunkbranche schien lange Zeit kein Interesse an in-dustriellen Funk-IoT-Anwendungen zu haben, jedoch sind vom 3GPP (3rd Generation Partnership Project – die weltweite Koope-ration von Standardisierungsgremien für den Mobilfunkbereich) erstmals Derivate wie NB-IoT speziell für die Machine-to-Machine (M2M)-Funkkommunikation standardisiert worden. NB-IoT steht für Narrowband IoT und ist ein neuer Funkstandard für das Internet der Dinge, der zum Beispiel im Bereich Smart Metering für Gas- und Wasserzähler eingesetzt wird oder in einer Smart City für die Steu-erung der Straßenbeleuchtung. Auch lassen sich damit Parkplät-ze zur Auslastungsoptimierung vernetzen: Ein intelligentes Park-leitsystem führt die Autofahrer dabei auf dem kürzesten Weg zum nächsten freien Parkplatz [narr].

Protokolle sind eine Schicht oberhalb der ÜbertragungsstandardsWenn IoT-Endgeräte untereinander oder mit einem Server kom-munizieren, dann müssen sie einander verstehen. So ist es we-nig sinnvoll, wenn beispielsweise ein Server Geschäftsdokumente wie Rechnungen oder Stammdaten im EDIFACT-Format erwartet, die Endgeräte jedoch JSON-kodierte Umgebungsdaten wie etwa Temperaturen oder Luftdruck an diesen Server senden. Die ent-sprechenden Absprachen heißen Protokolle, mithilfe derer Fra-gen geklärt werden wie: „Welche Arten von Daten werden über-mittelt (Semantik)?“, „Wie sind diese formatiert (Syntax)?“, „Wie erkennt man, dass eine Nachricht verloren wurde?“ Diese Fragen

sind unabhängig davon, wie Daten übertragen werden – wir er-innern uns an das Beispiel zu Briefpost, E-Mail oder Telefon. Im Folgenden sollen die wichtigsten gängigen Protokolle kurz vor-gestellt werden:

MQTT ist das etablierte IoT-Standardprotokoll, das von der unabhängigen Organization for the Advancement of Structured In-formation Standards (OASIS) betreut und weiterentwickelt wird. Es ist seit 2011 offen verfügbar, zudem sehr effizient und bis zu mehreren Hunderttausenden Clients pro Server hochskalierbar. Es hat kaum Protokoll-Overhead, setzt das Publish-/Sub scribe-Pattern sowie echte Push-Kommunikation um und ist speziell auf M2M-Anwendungsfälle ausgerichtet [Obe15]. MQTT ist für eine zu-verlässige Übertragung von Nachrichten über unzuverlässige wie etwa mobile Netzwerke und für den hochperformanten Einsatz auf Geräten mit wenig Speicher und Rechenleistung ausgelegt [Obe15]. Es findet sowohl in der Automobilindustrie – Stichwort Connected Cars –, im Energiesektor als auch im Bereich der Ge-bäudeautomation Anwendung. Seit 2016 ist MQTT ein ISO-Stan-dard (ISO/IEC 20922).

AMQP steht für Advanced Message Queuing Protocol und ist ein offener Standard, der ein binäres Netzwerkprotokoll auf Anwen-dungsebene darstellt. Konkret handelt es sich um ein Protokoll zur Kommunikation zwischen Client- und Message-Broker bezie-hungsweise zwischen verschiedenen Message-Brokern. AMQP-fähi-ge Message-Broker sind zum Beispiel RabbitMQ, Apache ActiveMQ, Apache Qpid, SwiftMQ, Microsoft Azure Service Bus und Red Hat Enterprise MRG. AMQP wurde durch ein Konsortium kreiert, das sich aus Softwareunternehmen und Finanzinstitutionen zusam-mensetzt, zu dem unter anderem Microsoft, Red Hat, Cisco sowie die Bank of America, Goldman Sachs, Credit Suisse und viele an-dere gehören. Microsoft hat das AMQP-Protokoll für eine direkte Cloud-Anbindung integriert.

XMPP steht für Extensible Messaging and Presence Protocol, war früher unter Jabber bekannt und ist ein XML-basiertes, häufig von Instant Messengern als Chat-Protokoll verwendetes Kommunikati-onsprotokoll. Es wird aufgrund des durch XML verursachten großen Protokoll-Overheads im IoT-Bereich eher selten eingesetzt [Obe15]. Es ist bisweilen sogar umgekehrt: Selbst Facebook nutzt nun an-stelle von XMPP das IoT-Protokoll MQTT für den Facebook-Chat. Es existieren speziell für IoT-Anwendungsfälle konzipierte Erweite-rungen, die aber bisher nur von wenigen Servern und Clients un-terstützt werden. Das GitHub-Projekt XMPP-IoT [xmp] umfasst eine Sammlung solcher Erweiterungen.

CoAP (Constrained Application Protocol, im 2014 erschienenen RFC 7252 definiert) basiert auf UDP und wird oft als das „HTTP für IoT“ bezeichnet. Es implementiert das Request-/Response-Pattern – das grundlegendste und verbreitetste der Client-Service-Inter-aktionsmuster [sdp] – und ist effizienter als HTTP, da das Proto-koll inklusive aller Header binär ist. REST-APIs sind mit CoAP ein-fach realisierbar und es existieren sogar HTTP-/CoAP-Proxies. Die Protokoll-Erweiterung „Observe“ definiert und ermöglicht den CoAP-verwendenden Applikationen einen serverseitigen Push bei Ressourcenänderung. Weil jedoch CoAP auf UDP basiert, kann ein Client keine bidirektionale, stehende Verbindung wie etwa bei TCP initiieren, was speziell bei sogenanntem NATing1 problematisch

1 NATing bedeutet, dass man nach außen hin nur eine IP-Adresse hat (z. B. jene vom Provider 80.187.102.184). Will ein Paket vom Client beispielsweise von 192.168.0.186:13395 raus nach 212.26.68.112:80, dann geht es über den Router, der das Paket mit Absender 80.187.102.184:3348 zum Zielhost schickt. Der Router trägt sich dabei ein: Was jetzt an mich am Port 3348 zurückkommt, gehört dem Absender 192.168.0.186:13395.

SCHWERPUNKTTHEMA

20 JavaSPEKTRUM 2/2018

Page 4: Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung an die Cloud, andere sind reine Message-Broker und damit Not amused››taSc ...

ist. Da jedoch CoAP in der Praxis primär für Wireless Sensor Net-works verwendet wird, ist das kein Problem. Denn hierbei spielen NATs (Network Address Translation) meist keine Rolle – im Gegen-satz zur Kommunikation über das Internet.

HTTP ist das Urgestein unter den Protokollen für Request-/Res-ponse-basierte IoT-Kommunikation – vor allem im Zusammenspiel mit HTTP RESTful APIs – und immer noch die erste Wahl [Obe15]. Aufgrund des sehr hohen Protokoll-Overheads ist es für Anwen-dungsfälle, bei denen die Menge der übertragenen Daten eine Rol-le spielt, eher ungeeignet. Das ist oftmals der Fall, wenn mobile Netzwerke mit im Spiel sind. Letztlich darf man nicht vergessen, dass HTTP komplett textbasiert ist. Des Weiteren erlaubt zwar das Request-/Response-Pattern eine 1-zu-1-, jedoch nicht eine 1-zu-N-Kommunikation. Deshalb ist HTTP auch nicht geeignet, wenn eine Nachricht an viele Empfänger gleichzeitig versendet werden soll.

OPC Unified Architecture (OPC UA) ist ein industrielles M2M-Kom-munikationsprotokoll, das Maschinendaten wie Regelgrößen, Messwerte und Parameter sowohl transportieren als auch maschi-nenlesbar semantisch beschreiben kann. Es ist ein De-facto-Stan-dard im Automatisierungsbereich und für Industrie 4.0 bezie-hungsweise für das Industrial Internet of Things (IIoT) gesetzt. OPC UA setzt auf AMQP und hat den sicheren, verlässlichen hersteller- und plattformneutralen Austausch von Automatisierungsdaten zum Ziel. Besonders glänzt es bei Supervisory Control and Data Ac-quisition (SCADA)-Systemen und gilt als schwergewichtiger als das Publish-/Subscribe-orientierte MQTT. Allerdings wird OPC UA mit Publisher-/Subscriber-Mechanismen per UDP und TSN (Time-Sensi-tive Networking)-Echtzeit erweitert [bra]. TSN ist ein neuer, sich etablierender Standard in der industriellen Kommunikationstech-nik, dessen Entwicklung vor allem von der Automobilindustrie un-terstützt wird. Die TSN-Arbeitsgruppe ist übrigens Teil der IEEE 802.1-Arbeitsgruppe.

Das letzte Protokoll in dieser Reihe ist das LWM2M. Es ist ein von der Open Mobile Alliance (OMA) entworfenes Nachrichtenprotokoll

für die Verwaltung von Geräten im Internet of Things, das auf dem CoAP-Protokoll basiert und die Schnittstellen für das Bootstrap-ping, die Geräteerkennung (Device Discovery) und die Registrie-rung sowie das Gerätemanagement definiert. Es unterstützt die Parametrisierung und Überwachung der Geräte ebenso wie das Update der Firmware. LWM2M dient der Kommunikation zwischen LWM2M-Server und -Client. Der LWM2M-Server kann ein Knoten in einem privaten oder öffentlichen Netz sein, der Client kann in ei-nem Gerät eingebettet sein.

Die mittlere Schicht: Bausteine für die Protokoll-standardkonforme KommunikationNun ist klar, welche Sprache die IoT-Anwendungsbausteine spre-chen – seien es Sensoren, RFID-Lesegeräte, die mit aktiven Bea-cons markierten Objekte und natürlich auch die Server. Damit ist auch die Frage geklärt, welche Protokolle sie zur Kommunikation nutzen. Daher widmen wir uns jetzt den Bausteinen, die die Pro-tokoll-standardkonforme Kommunikation auf Geräte-/Client- oder Serverseite implementieren.

HiveMQ ist ein für den kommerziellen Einsatz konzipierter, in Deutschland vom Landshuter Unternehmen dc-square entwickelter Enterprise MQTT Broker – sprich eine Implementierung von MQTT auf Serverseite. Der Broker verfügt über eine Cluster-Funktiona-lität, um HiveMQ Deployments (Millionen von MQTT-Clients auf verschiedenen Maschinen) horizontal linear zu skalieren [Fel16]. Entwickler können ihre eigenen Mechanismen für die Cluster Disco-very implementieren. Wenn sie Plug-ins für den MQTT-Broker-Clus-ter bauen, können sie zudem mit einem PluginExecutorService nicht-blockierend, reaktiv interagieren, indem sie diesem Service ein Runnable übergeben, den dieser Service asynchron ausführt. Für MQTT-Broker wie HiveMQ sind asynchrone, nicht-blockierende Architekturen und Architekturen für clientseitige Lastverteilung wichtig. Warum das so ist und wie diese funktionieren, erläutern wir in den zwei folgenden Kapiteln. Übrigens weist HiveMQ solche Architekturen auf.

Asynchrone, nicht-blockierende ArchitekturAsynchrone Services sind grundsätzlich vorteilhaft in verteilten Installationen (Cluster). Neben dem PluginExecutorService exis-tieren weitere asynchrone Services wie etwa für das Loggen und für das Messen oder das Erfassen von Metriken. Methoden der asynchronen Services geben ein ListenableFuture-Objekt zurück. Diesem kann der Entwickler eine Callback-Methode hinzufügen, die aufgerufen wird, sobald die Ergebnisse der Verarbeitung durch die Methode verfügbar sind.

Abbildung 2 veranschaulicht das architektonische allgemeine Prinzip, das hinter dieser asynchronen, nicht-blockierenden Ar-beitsweise steckt.

Client-seitige Lastverteilung mit Shared SubscriptionsEin weiterer nennenswerter Architekturansatz im IoT-Umfeld, dem auch HiveMQ folgt, sind Shared Subscriptions [Fel16]. Dieser ermög-licht das Load Balancing – sprich die Lastverteilung – innerhalb ei-nes IoT-Clusters, das typischerweise aus einer Vielzahl von IoT-Ge-räten-/MQTT-Clients und mehreren Brokern/Servern besteht.

Um das Prinzip der Shared Subscriptions zu erläutern, rufen wir uns ins Gedächtnis: Das Protokoll MQTT erfüllt das Publish-/Subscribe-Entwurfsmuster – ein Mechanismus, mit dem Subskri-benten (Subscriber) Ereignisse von Veröffentlichern (Publishern) erhalten. Beide – die Subskribienten und Veröffentlicher – können

Abb. 2: Die Architektur für nicht-blockierendes, asynchrones Verhal-ten nutzt Callbacks, die portionsweise abgearbeitet werden

SCHWERPUNKTTHEMA

www.javaspektrum.de 21

Page 5: Not amused››taSc · 2018. 4. 24. · works, Technologien und Tools im Java-Umfeld. ... bindung an die Cloud, andere sind reine Message-Broker und damit Not amused››taSc ...

geräte- oder serverseitige Bausteine sein. Dazu zählen Anwendun-gen, Services oder Komponenten innerhalb dieser Anwendungen oder Services. Ein Veröffentlicher legt dann Themen fest – in der Fachsprache auch Topic genannt – und er sendet die Ereignisse zu diesen Themen, ohne dass er etwas über die Subskribienten wissen muss. Letztere sind Konsumenten der Ereignisinformationen und erhalten sämtliche Ereignisse zu jedem Thema, das sie abonnieren. Das heißt: Sie können Informationen von verschiedenen Veröffent-lichern erhalten.

Hat man in einem Cluster Millionen von Subskribienten, dann ist eine Lastverteilung sinnvoll. Hier kommen die sogenannten Shared Subscriptions ins Spiel – ein Mechanismus, der es den MQTT-Clients erlaubt, sich ein und dieselbe Subscription zu tei-len. Hier erhält nicht wie beim klassischen Publish/Subscribe je-der Subskribient eine Kopie der Ereignisnachricht des abonnier-ten Topics, sondern Mitglieder einer sogenannten Subscription Group (Abonnementgruppe) erhalten Ereignisnachrichten in ab-wechselnder Weise. Die Nachrichten werden damit auf diese Grup-pe verteilt. Man bezeichnet diesen Mechanismus gerne auch als Client Load Balancing (Client-Lastenausgleich), da die Nachrich-tenflut zu einem einzelnen Topic auf alle Abonnementgruppen-teilnehmer verteilt wird. Topics, zu denen ein exorbitant höheres Nachrichtenaufkommen existiert, werden auch als „Hot Topics“ bezeichnet. Für diese sind Shared Subscriptions geradezu sinn-voll.

Eine Alternative zu HiveMQ ist die quelloffene Implementie-rung Mosquitto – ein Open-Source-MQTT-Broker. Mosquitto ist in C geschrieben und ein Projekt der Projektgruppe Eclipse IoT Working Group, zu der unter anderem Bosch, Red Hat und SAP gehört [io-te]. Mosquitto läuft auch auf einem Raspberry Pi. Ein weiterer, in Java geschriebener quelloffener MQTT-Broker ist Moquette – dieser funktioniert wie auch Mosquitto auf IoT-Geräten wie zum Beispiel auf einem Raspberry Pi-Cluster. Standardmäßig läuft Moquette standalone, er kann jedoch auch in einen OSGi-Container wie Con-cierge oder Kura integriert werden.

Eine weitere Alternative ist Pivotals RabbitMQ, ein Open- Source-Message-Broker, für den ein MQTT Adapter existiert. Bei-des zusammen ergibt einen vollwertigen, quelloffenen MQTT-Bro-ker [ramq].

Das Eclipse Paho-Projekt bietet Open-Source-Client-Implemen-tierungen von MQTT- und MQTT-SN-Messaging-Protokollen, die auf neue, bestehende und künftige IoT-Anwendungen ausgerich-tet sind. Das Wort „Paho“ stammt aus der Maori-Sprache und be-deutet sinngemäß „verteilen“ oder „senden“. Es geht hier um ein Broadcast-Messaging-Protokoll für das Internet der Dinge. Oftmals

wird eine MQTT-Lösung mittels Paho (Publisher und Subscriber auf Client seite) und Mosquitto (Broker auf Serverseite) verwendet. Paho ist als standardmäßige Messaging-Bibliothek in den OSGi-Con tainer Eclipse Kura verbaut.

AusblickDieser erste Teil hat sich mit den IoT-Standards, Protokollen und relevanten Architekturmustern beschäftigt. Darauf aufbauend wird der zweite Teil einen Überblick über die konkreten Frameworks und Werkzeuge für die Entwicklung von IoT-Anwendungen geben und dabei auf die Bausteine der Cloud und auch kurz auf die Anbin-dung an Cognitive Services eingehen.

Literatur und Links[ama] Was ist das Internet of Things (Internet der Dinge)?, AWS, https://aws.amazon.com/de/iot/what-is-the-internet-of-things/[bra] TSN and Pub/Sub: Real-time capability for OPC UA, https://www.br-automation.com/en/technologies/opc-ua/tsn-and-pubsub/[cw] J. Gold, Sigfox and LoRa are the WiMax of IoT, in: Computerworld, 12.9.2016, https://www.computerworld.com/article/3117795/cloud-computing/sigfox-and-lora-are-the-wimax-of-iot.html[Fel16] M. Feldmann, Ein neuer Cluster für HiveMQ 3.1, 7.32016, https://jaxenter.de/ein-neuer-cluster-fuer-hivemq-3-1-36033[iote] https://iot.eclipse.org/[narr] Narrowband IoT: The Game Changer for The Internet of Things, Telekom, https://iot.telekom.com/fileadmin/iot_downloads/Whitepaper_NarrowBand_IoT_-_The_Game_Changer_for_the_Internet_of_Things_-_1.10.2017.pdf[Obe15] D. Obermaier, IoT-Protokolldschungel – Ein Wegweiser, 17.11.2015, https://www.informatik-aktuell.de/betrieb/netzwerke/iot-protokolldschungel-ein-wegweiser.html[ramq] RabbitMQ MQTT Adapter, https://www.rabbitmq.com/mqtt.html[sdp] Service Design Patterns: Request/Response, http://www.servicedesignpatterns.com/clientserviceinteractions/requestresponse[xmp] XMPP-IoT: Repository for the work using XMPP in Internet of Things systems, https://github.com/joachimlindborg/XMPP-IoT

Weitere Quellen

- Erste Schritte mit Azure IoT Hub (Java), Microsoft Docs, https://docs.microsoft.com/de-de/azure/iot-hub/iot-hub-java-java-getstarted- Device management mit Azure IoT Hub, Microsoft Docs, https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-device-management-overview- Java Embedded-Technologien: IoT, eingebettete Geräte, M2M, Oracle Deutschland, https://www.oracle.com/de/java/technologies/embedded.html- Watson IoT Client Library for Java, https://github.com/ibm-watson-iot/iot-java- D. Obermaier, IoT-Allrounder, jaxenter, 2015, https://jaxenter.de/iot-allrounder-27208- Project Proposals: Internet of Things Data Management (IOTDM), https://wiki.opendaylight.org/view/Project_Proposals:Internet_of_Things_Data_Management_(IOTDM)- Referenzmodell (Daten), https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3871070/

01001001 01101110 00100000 01001101 11000011 10111100 01101110 01100011 01101000 01100101 01101110 00100000 01110011 01110100 01100101 01101000 01110100 00100000 01100101 01101001 01101110 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101100 11000011 10100100 01110101 01100110 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 01110011 00100000 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101000 01100001 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000111 01100101 01111010 01100101 01101001 01100111 01110100 00100000 01110111 01100001 01110011 00100000 01100101 01110010 00100000 01110011 01101111 00100000 01110110 01100101 01110010 01110100 01110010 01100001 01100111 01100101 01101110 00100000 01101011 01100001 01101110 01101110 00001101 00001010 01010011 01100011 01101000 01101111 01101110 00100000 01100110 01110010 11000011 10111100 01101000 00100000 01100001 01101101 00100000 01001101 01101111 01110010 01100111 01100101 01101110 00100000 01100110 01101001 01101110 01100111 00100000 01100101 01110010 00100000 01100001 01101110 00001101 00001010 01010101 01101110 01100100 00100000 01110011 01110000 11000011 10100100 01110100 00100000 01100001 01101101 00100000 01000001 01100010 01100101 01101110 01100100 00100000 01101011 01100001 01101101 00100000 01100101 01110010 00100000 01101000 01100101 01110010 01100001 01110101 01110011 00001101 00001010 01010011 01101111 00100000 01110011 01100011 01101000 11000011 10110110 01101110 00100000 01101001 01110011 01110100 00100111 01110011 00100000 01101001 01101101 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00101110 00001101 00001010 01000100 01100001 00100000 01110100 01110010 01101001 01101110 01101011 01110100 00100000 01101101 01100001 01101110 00100000 01000010 01101001 01100101 01110010 00100000 01101110 01101001 01100011 01101000 01110100 00100000 01100001 01110101 01110011 00100000 01100100 01100101 01101101 00100000 01000111 01101100 01100001 01110011 00101100 00001101 00001010 01000100 01100001 00100000 01100111 01101001 01100010 01110100 00100111 01110011 00100000 01101110 01110101 01110010 00100000 01100100 01101001 01100101 00100000 01100111 01110010 01101111 11000011 10011111 01100101 00100000 01001101 01100001 11000011 10011111 00100001 00001101 00001010 01010101 01101110 01100100 00100000 01110111 01100101 01101110 01101110 00100000 01100100 01100101 01110010 00100000 01100101 01110010 01110011 01110100 01100101 00100000 01001101 01100001 11000011 10011111 01101011 01110010 01110101 01100111 00100000 01101100 01100101 01100101 01110010 00101100 00001101 00001010 01000010 01110010 01101001 01101110 01100111 01110100 00100000 01100100 01101001 01110010 00100000 01100100 01101001 01100101 00100000 01010010 01100101 01110011 01100101 01110010 01101100 00100000 01100010 01100001 01101100 01100100 00100000 01101101 01100101 01101000 01110010 00101110 00001101 00001010 01001111 01100110 01110100 00100000 01101011 01110010 01101001 01100101 01100111 01110100 00100000 01111010 01110101 00100000 01001000 01100001 01110101 01110011 00100000 01100100 01101001 01100101 00100000 01000110 01110010 01100001 01110101 00100000 00100111 01101110 01100101 01101110 00100000 01010011 01100011 01101000 01110010 01100101 01100011 01101011 00101100 00001101 00001010 01000010 01101100 01100101 01101001 01100010 01110100 00100000 01100100 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00100000 01101101 01100001 01101100 00100000 01101100 11000011 10100100 01101110 01100111 01100101 01110010 00100000 01110111 01100101 01100111 00101110 00001101 00001010 01000001 01100010 01100101 01110010 00100000 01100100 01101001 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01101110 00100000 01001110 01100001 01100011 01101000 01100010 01100001 01110010 01110011 01101100 01100101 01110101 01110100 00100111 00101100 00001101 00001010 01000100 01101001 01100101 00100000 01110111 01101001 01110011 01110011 01100101 01101110 00100000 01100010 01100101 01110011 01110011 01100101 01110010 00100000 01000010 01100101 01110011 01100011 01101000 01100101 01101001 01100100 00100001 01001001 01101110 00100000 01001101 11000011 10111100 01101110 01100011 01101000 01100101 01101110 00100000 01110011 01110100 01100101 01101000 01110100 00100000 01100101 01101001 01101110 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101100 11000011 10100100 01110101 01100110 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 01110011 00100000 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101000 01100001 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000111 01100101 01111010 01100101 01101001 01100111 01110100 00100000 01110111 01100001 01110011 00100000 01100101 01110010 00100000 01110011 01101111 00100000 01110110 01100101 01110010 01110100 01110010 01100001 01100111 01100101 01101110 00100000 01101011 01100001 01101110 01101110 00001101 00001010 01010011 01100011 01101000 01101111 01101110 00100000 01100110 01110010 11000011 10111100 01101000 00100000 01100001 01101101 00100000 01001101 01101111 01110010 01100111 01100101 01101110 00100000 01100110 01101001 01101110 01100111 00100000 01100101 01110010 00100000 01100001 01101110 00001101 00001010 01010101 01101110 01100100 00100000 01110011 01110000 11000011 10100100 01110100 00100000 01100001 01101101 00100000 01000001 01100010 01100101 01101110 01100100 00100000 01101011 01100001 01101101 00100000 01100101 01110010 00100000 01101000 01100101 01110010 01100001 01110101 01110011 00001101 00001010 01010011 01101111 00100000 01110011 01100011 01101000 11000011 10110110 01101110 00100000 01101001 01110011 01110100 00100111 01110011 00100000 01101001 01101101 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00101110 00001101 00001010 01000100 01100001 00100000 01110100 01110010 01101001 01101110 01101011 01110100 00100000 01101101 01100001 01101110 00100000 01000010 01101001 01100101 01110010 00100000 01101110 01101001 01100011 01101000 01110100 00100000 01100001 01110101 01110011 00100000 01100100 01100101 01101101 00100000 01000111 01101100 01100001 01110011 00101100 00001101 00001010 01000100 01100001 00100000 01100111 01101001 01100010 01110100 00100111 01110011 00100000 01101110 01110101 01110010 00100000 01100100 01101001 01100101 00100000 01100111 01110010 01101111 11000011 10011111 01100101 00100000 01001101 01100001 11000011 10011111 00100001 00001101 00001010 01010101 01101110 01100100 00100000 01110111 01100101 01101110 01101110 00100000 01100100 01100101 01110010 00100000 01100101 01110010 01110011 01110100 01100101 00100000 01001101 01100001 11000011 10011111 01101011 01110010 01110101 01100111 00100000 01101100 01100101 01100101 01110010 00101100 00001101 00001010 01000010 01110010 01101001 01101110 01100111 01110100 00100000 01100100 01101001 01110010 00100000 01100100 01101001 01100101 00100000 01010010 01100101 01110011 01100101 01110010 01101100 00100000 01100010 01100001 01101100 01100100 00100000 01101101 01100101 01101000 01110010 00101110 00001101 00001010 01001111 01100110 01110100 00100000 01101011 01110010 01101001 01100101 01100111 01110100 00100000 01111010 01110101 00100000 01001000 01100001 01110101 01110011 00100000 01100100 01101001 01100101 00100000 01000110 01110010 01100001 01110101 00100000 00100111 01101110 01100101 01101110 00100000 01010011 01100011 01101000 01110010 01100101 01100011 01101011 00101100 00001101 00001010 01000010 01101100 01100101 01101001 01100010 01110100 00100000 01100100 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00100000 01101101 01100001 01101100 00100000 01101100 11000011 10100100 01101110 01100111 01100101 01110010 00100000 01110111 01100101 01100111 00101110 00001101 00001010 01000001 01100010 01100101 01110010 00100000 01100100 01101001 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01101110 00100000 01001110 01100001 01100011 01101000 01100010 01100001 01110010 01110011 01101100 01100101 01110101 01110100 00100111 00101100 00001101 00001010 01000100 01101001 01100101 00100000 01110111 01101001 01110011 01110011 01100101 01101110 00100000 01100010 01100101 01110011 01110011 01100101 01110010 00100000 01000010 01100101 01110011 01100011 01101000 01100101 01101001 01100100 00100001 01001001 01101110 00100000 01001101 11000011 10111100 01101110 01100011 01101000 01100101 01101110 00100000 01110011 01110100 01100101 01101000 01110100 00100000 01100101 01101001 01101110 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101100 11000011 10100100 01110101 01100110 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 01110011 00100000 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101

Partner

Sponsoren

Veranstalter

Besser besser werden

01001000 01100001 01110101 01110011 00100000 01100100 01101001 01100101 00100000 01000110 01110010 01100001 01110101 00100000 00100111 01101110 01100101 01101110 00100000 01010011 01100011 01101000 01110010 01100101 01100011 01101011 00101100 00001101 00001010 01000010 01101100 01100101 01101001 01100010 01110100 00100000 01100100 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00100000 01101101 01100001 01101100 00100000 01101100 11000011 10100100 01101110 01100111 01100101 01110010 00100000 01110111 01100101 01100111 00101110 00001101 00001010 01000001 01100010 01100101 01110010 00100000 01100100 01101001 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01101110 00100000 01001110 01100001 01100011 01101000 01100010 01100001 01110010 01110011 01101100 01100101 01110101 01110100 00100111 00101100 00001101 00001010 01000100 01101001 01100101 00100000 01110111 01101001 01110011 01110011 01100101 01101110 00100000 01100010 01100101 01110011 01110011 01100101 01110010 00100000 01000010 01100101 01110011 01100011 01101000 01100101 01101001 01100100 00100001 01001001 01101110 00100000 01001101 11000011 10111100 01101110 01100011 01101000 01100101 01101110 00100000 01110011 01110100 01100101 01101000 01110100 00100000 01100101 01101001 01101110 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101100 11000011 10100100 01110101 01100110 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 01110011 00100000 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101000 01100001 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000111 01100101 01111010 01100101 01101001 01100111 01110100 00100000 01110111 01100001 01110011 00100000 01100101 01110010 00100000 01110011 01101111 00100000 01110110 01100101 01110010 01110100 01110010 01100001 01100111 01100101 01101110 00100000 01101011 01100001 01101110 01101110 00001101 00001010 01010011 01100011 01101000 01101111 01101110 00100000 01100110 01110010 11000011 10111100 01101000 00100000 01100001 01101101 00100000 01001101 01101111 01110010 01100111 01100101 01101110 00100000 01100110 01101001 01101110 01100111 00100000 01100101 01110010 00100000 01100001 01101110 00001101 00001010 01010101 01101110 01100100 00100000 01110011 01110000 11000011 10100100 01110100 00100000 01100001 01101101 00100000 01000001 01100010 01100101 01101110 01100100 00100000 01101011 01100001 01101101 00100000 01100101 01110010 00100000 01101000 01100101 01110010 01100001 01110101 01110011 00001101 00001010 01010011 01101111 00100000 01110011 01100011 01101000 11000011 10110110 01101110 00100000 01101001 01110011 01110100 00100111 01110011 00100000 01101001 01101101 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00101110 00001101 00001010 01000100 01100001 00100000 01110100 01110010 01101001 01101110 01101011 01110100 00100000 01101101 01100001 01101110 00100000 01000010 01101001 01100101 01110010 00100000 01101110 01101001 01100011 01101000 01110100 00100000 01100001 01110101 01110011 00100000 01100100 01100101 01101101 00100000 01000111 01101100 01100001 01110011 00101100 00001101 00001010 01000100 01100001 00100000 01100111 01101001 01100010 01110100 00100111 01110011 00100000 01101110 01110101 01110010 00100000 01100100 01101001 01100101 00100000 01100111 01110010 01101111 11000011 10011111 01100101 00100000 01001101 01100001 11000011 10011111 00100001 00001101 00001010 01010101 01101110 01100100 00100000 01110111 01100101 01101110 01101110 00100000 01100100 01100101 01110010 00100000 01100101 01110010 01110011 01110100 01100101 00100000 01001101 01100001 11000011 10011111 01101011 01110010 01110101 01100111 00100000 01101100 01100101 01100101 01110010 00101100 00001101 00001010 01000010 01110010 01101001 01101110 01100111 01110100 00100000 01100100 01101001 01110010 00100000 01100100 01101001 01100101 00100000 01010010 01100101 01110011 01100101 01110010 01101100 00100000 01100010 01100001 01101100 01100100 00100000 01101101 01100101 01101000 01110010 00101110 00001101 00001010 01001111 01100110 01110100 00100000 01101011 01110010 01101001 01100101 01100111 01110100 00100000 01111010 01110101 00100000 01001000 01100001 01110101 01110011 00100000 01100100 01101001 01100101 00100000 01000110 01110010 01100001 01110101 00100000 00100111 01101110 01100101 01101110 00100000 01010011 01100011 01101000 01110010 01100101 01100011 01101011 00101100 00001101 00001010 01000010 01101100 01100101 01101001 01100010 01110100 00100000 01100100 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00100000 01101101 01100001 01101100 00100000 01101100 11000011 10100100 01101110 01100111 01100101 01110010 00100000 01110111 01100101 01100111 00101110 00001101 00001010 01000001 01100010 01100101 01110010 00100000 01100100 01101001 01100101 00100000 01100010 01110010 01100001 01110110 01100101 01101110 00100000 01001110 01100001 01100011 01101000 01100010 01100001 01110010 01110011 01101100 01100101 01110101 01110100 00100111 00101100 00001101 00001010 01000100 01101001 01100101 00100000 01110111 01101001 01110011 01110011 01100101 01101110 00100000 01100010 01100101 01110011 01110011 01100101 01110010 00100000 01000010 01100101 01110011 01100011 01101000 01100101 01101001 01100100 00100001 01001001 01101110 00100000 01001101 11000011 10111100 01101110 01100011 01101000 01100101 01101110 00100000 01110011 01110100 01100101 01101000 01110100 00100000 01100101 01101001 01101110 00100000 01001000 01101111 01100110 01100010 01110010 11000011 10100100 01110101 01101000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01101001 01101110 01110011 00101100 00100000 01111010 01110111 01100101 01101001 00101100 00100000 01100111 00100111 01110011 01110101 01100110 01100110 01100001 00001101 00001010 01000100 01100001 00100000 01101100 11000011 10100100 01110101 01100110 01110100 00100000 01110011 01101111 00100000 01101101 01100001 01101110 01100011 01101000 01100101 01110011 00100000 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101 01000110 11000011 10100100 11000011 10011111 01100011 01101000 01100101 01101110 00100000 01100001 01110101 01110011 00111010 00001101 00001010 01000101

Partner

Die andere Software-Konferenz

Digitalisierung: Bei uns geht das nicht … !?03. – 04. Mai 2018 in Hamburg

www.SEA-CON.de

Early Bird bis zum 13. April 2018Sprinten Sie schon jetzt zur Anmeldung. Sichern Sie sich den Frühbucherpreis und erhalten Sie zusätzlich den Raspberry Pi 3.

01100100 01101001 01100101 00100000 01010010 01100101 01110011 01100101 01110010 01101100 00100000 01100010 01100001 01101100 01100100 00100000 01101101 01100101 01101000 01110010 00101110 00001101 00001010 01001111 01100110 01110100 00100000 01101011 01110010 01101001 01100101 01100111 01110100 00100000 01111010 01110101 00100000 01001000 01100001 01110101 01110011 00100000 01100100 01101001 01100101 00100000 01000110 01110010 01100001 01110101 00100000 00100111 01101110 01100101 01101110 00100000 01010011 01100011 01101000 01110010 01100101 01100011 01101011 00101100 00001101 00001010 01000010 01101100 01100101 01101001 01100010 01110100 00100000 01100100 01100101 01110010 00100000 01001101 01100001 01101110 01101110 00100000 01101101 01100001 01101100 00100000 01101100 11000011 10100100 01101110 01100111 01100101 01110010 00100000 01110111 01100101 01100111 00101110 00001101 00001010 01000001 01100010

SCHWERPUNKTTHEMA

22 JavaSPEKTRUM 2/2018