home/groundfloor/kitchen/temperature
Klaus Pittig
Energie-Management
Entertainment und Kommunikation
Gebäude- und Wohnungssicherheit
Hausautomation und Komfort
O-Töne…
Automatische Jalousiensteuerung, Licht- und Heizungssteuerung, Einbruchsschutz, Energie-Kostenkontrolle und -steuerung, Irisscanner, Fingerabdruckscanner für die Tür…
Was würde Dir am meisten bringen:
Kochen und putzen
Sprachsteuerung für Infos/Unterhaltung und einfache Dinge wie das Setzen von Timern. Sensorwerte anzeigen/abrufen, Signale bei wichtigen Nachrichten/Twitter oder anderen Ereignissen.
Hörbücher vorlesen, Wetter ansagen, Musik und Filme am gewünschten Ort im Haus streamen. Brauche irgendwas, um TV mit Alexa umzuschalten.
Weniger Fläche putzen müssen.
Ich find' das ja sowas von dämlich. Dann wird alles gehackt und Du kannst dein eigenes Heim nicht mehr kontrollieren…
Sicherheit in jeder Hinsicht, und Komfort. Mit Sicherheit meine ich auch Infos zu offenen Türen oer Fenstern - oder erforderliche Wartungen noch vor Eintritt eines Schadens. Und unter Komfort kann ich mir durchaus schlüsselloses Öffnen vorstellen.
Überwiegt für Dich irgendwann der Komfort die Sicherheit?
Nein.
Die Smart Home Technik hat Zukunft, ist jedoch oft unsicher
Produkte: Komfort, sinkende Kosten, unbefriedigende Sicherheit
Risiken: Zugriff auf Heizung, Beleuchtung, Schlösser etc.
Kunden: Sicherheitsbedenken ja, Sorge nein
Es gibt keinen einheitlichen Sicherheitsstandard wie etwa für WLAN-Router
Zu regeln: Verschlüsselung, Authentifizierung, Autorisierung, Vermeidung von Hackerangriffen
Produkte: Prüfen auf Sinnhaftigkeit, Notwendigkeit und echte Funktionalität
Smart Home mit allen verfügbaren Mitteln und Sicherheitsmaßnahmen schützen
Grundlagen und Funktionalität von MQTT
Key Features
Good Practices
Broker Bridges im Attraktor
MQTT Security… first?
Entscheidungshilfen und Anwendungsfälle
Unterschiede MQTT v3.1 und v3.1.1
Aufbau von MQTT Broker Bridges (Mosquitto)
SSL Zertifikate, Security Details
MQTT Protocol Details
MQTT und WebSockets
Node-RED, Konkrete Programmierung in Sprache X
Web: http://mqtt.org
Twitter: @mqttorg
Message Queuing Telemetry Transport (MQTT) v3.1.1
Seit 2010 Freigabe v3.1 durch Eurotech und IBM
Seit 2014 Standard OASIS v3.1.1
Seit 2016 Standard ISO/IEC 20922:2016
Publish-/Subscribe Muster
Quality of Service Level
Persistent sessions
Retained Messages
LWT (Last Will and Testament)
Keep-Alive und Client-Takeover
Wachsende Anzahl und stärkere Nutzung mobiler Geräte
Erforderlich: Gleichzeitige Nachrichtenübermittlung an viele Geräte
Erforderlich: Gerantie fehlerfreier Übertragung
Hohe Komplexität durch verschiedenste Hardwarekomponenten und Software
Erforderlich: Vereinfachung der Kommunikation
Interoperabilität: Große Menge proprietärer und offener Protokolle
Erforderlich: daten-agnostisches, offenes Protokoll
Kommunikation von Consumer-Hardware über das Internet soll überall funktionieren
Impakt im Mobilfunk: hohe Latenz, große Timeouts, niedrige Bandbreite
MQTT is a Client Server publish/subscribe messaging transport protocol. It is light weight, open, simple, and designed so as to be easy to implement. These characteristics make it ideal for use in many situations, including constrained environments such as for communication in Machine to Machine (M2M) and Internet of Things (IoT) contexts where a small code footprint is required and/or network bandwidth is at a premium.
MQTT ist ein leichtgewichtiges Binärprotokoll
für TCP/IP bzw. geordnete, verlustfreie, bidirektionale Netzwerkprotokolle
minimaler Protokolloverhead
batterie- und bandbreitenschonend
ideal für Embedded Devices, kleine Transferraten, unzuverlässige Umgebungen
Verschiedene Service-Qualitäten
Daten-agnostisch (keine Präferenz zu bestimmten Datenformaten).
Entkopplung von Sender und Empfängern
Effiziente Verteilung von Nachrichten an viele Empfänger
Publish/Subscribe Paradigma
MQTT + TCP: 1883 (Offizieller IANA Port)
MQTT + TLS: 8883 (Offizieller IANA Port)
MQTT + Websockets: 80/443 (Standard HTTP Ports)
Entwickelt 1999 von Andy Stanford-Clark (IBM) und Arlen Nipper (Cirrus Link)
M2M Kommunikationsprotokoll für SCADA-Systeme mit mininmalem Protokoll-Overhead
Projekt zum Monitoring von Ölpipelines
Zu dieser Zeit mussten die Daten kostspielig über Satellit übertragen werden
Aus diesem Grund wurde MQTT mit den oben genannten Eigenschaften entwickelt
Danach Nutzung/Weiterentwicklung von MQTT als proprietäres Protokoll bei IBM
2010 Freigabe der Spezifikation, Ökosystems um MQTT, Eclipse Paho etc.
2013 Beginn der Standardisierung der Protokollversion 3.1.1
2014 Offizieller finaler OASIS Standard v3.1.1
2016 Offizieller Standard ISO/IEC 20922:2016
Alternative zum traditionellen Request/Response Ansatz
Pub/Sub entkoppelt Nachrichtensender von -empfängern
Sender ist der Publisher
, Empfänger sind Subscriber
Sender um Empfänger kennen sich nicht
Beide verwenden einen Vermittlerdienst, den Broker
3 Dimensionen der Entkopplung
Räumlich: Publisher und Subscriber müssen sich nicht kennen
Zeitlich: Publisher und Subscriber müssen nicht zur gleichen Zeit laufen
Synchronisation: Versand/Empfang blockiert keine laufenden Operationen
Höhere Skalierbarkeit als bei klassischem Client/Server Modell
Operationen parallelisierbar, ereignisgetrieben
Caching und intelligentes Routing
Bei sehr vielen Geräten Load-Balancing und Clustering erforderlich
Effiziente Filterung (über Topics)
Nachrichten ohne Subscriber können i.d.R. verworfen werden
Broker kann für Clients zwischenspeichern, wenn sie
sie sich bereits einmal angemeldet haben
eine persistente Sitzung haben
ein Topic mit QoS Level >0 abonniert haben
Verwirrung um MQ im Namen MQTT.
Stammt von dem IBM Produkt MQseries,
hat nichts mit "message queue" zu tun
Eine Message Queue speichert Nachrichten, bis sie konsumiert werden
Eine Nachricht wird von einem Client konsumiert
Queues sind benannt und müssen explizit erzeugt werden
Publisher oder Subscriber
Jedes Gerät/Software, die eine MQTT Bibliothek für eine Broker-Verbindung nutzt
Wegen MQTT Einfachheit auch mit eingeschränkten Geräten möglich
MQTT Client Bibliotheken verfügbar für viele Programmiersprachen
Gegenstück zum Client, Kern der Pub/Sub Infrastruktur
Tausende gleichzeitig verbundene Clients möglich
verantwortlich für Empfang, Filterung und Zustellung zu Clients
verwaltet Sitzungen für Clients
Authentifizierung und Autorisierung von Clients
muss entsprechend leistungsfähig sein
Das MQTT Protokoll baut auf dem TCP/IP Stack auf
Jeder Client ist mit dem Broker, nicht mit anderen Clients verbunden
Client sendet eine CONNECT Nachricht
Broker antwort mit CONNACK
Die Verbindung bleibt offen bis DISCONNECT
Nur der Client initiiert die Verbindung per CONNECT
Die Verbindung bleibt für bidirektionale Kommunikation offen
Daher keine Probleme mit Clients hinter einem NAT
Clients benötigen keine öffentliche Adresse
Client Id: Client-Identifizierung, leer u.U. möglich
Clean Session Flag: Persistente Sitzung nein/ja
speichert Subscriptions und u.U. verpasste Nachrichten
Username/Password: einfache Authentifizierung/Autorisierung
Will Message: Benachrichtung anderer Clients bei unerwartetem Ende
Keep alive: Zeitintervall für PING Nachricht
Der Broker muss auf CONNECT mit CONNACK antworten
Session Present Flag: Zeigt dem Client eine persistente Sitzung an
Connect acknowledge Flag: Informiert über Erfolg oder Details der Ablehnung
Client sendet Nachrichten mit PUBLISH
Jede Nachricht benötigt einen topicName
für die Subscriber
Jede Nachricht enthält den payload
im als Menge von Bytes
MQTT ist daten-agnostisch, das Format hängt vom Usecase ab.
Der Sender bestimmt die Datenstruktur (binary, text, json etc.)
Der Client ist mit dem Versand an den Broker fertig
Der Broker bestätigt nur bei QoS Level > 0
Nur der Broker sorgt für die Auslieferung an Subscriber
Es gibt kein Feedback zu Existenz und Anzahl der Subscriber
PUBLISH
NachrichtTopic Name: UTF-8 String, hierarchisch strukturiert mit /
Beispiel: "home/kitchen/temperature" oder "attraktor/door"
QoS: Quality of Service Level (0,1,2) zur Garantie der Übertragung
Retain-Flag: Als letzte Nachricht am Broker speichern ja/nein
Neue Subscriber erhalten diese Nachricht direct nach dem Subscribe
PUBLISH
NachrichtPayload: beliebige Binärdaten
Packet Identifier (intern): Eindeutige Id der Nachricht für QoS 1 oder 2
DUP Flag (intern): Nachricht wird erneut gesendet
wichtig für QoS 1 oder 2 bei erneutem Versand unbestätigter Nachrichten.
Client abonniert Topics mit SUBSCRIBE
Die Nachricht besteht PacketId und beliebigen Subscriptions
Eine Subscription besteht aus Topic-Name und QoS-Level
Bei Überlappungen zählt das höchste QoS Level
Der Broker bestätigt mit SUBACK
Für jede Subscription meldet der Broker einen Status
Bei Erfolg wird je Topic das QoS Level zurückgemeldet
Der Client erhält danach PUBLISH
Nachrichten vom Broker
Client ruft sein Abonnement zurück mit UNSUBSCRIBE
Die Nachricht besteht PacketId und den Topic-Namen
Der Broker bestätigt mit UNSUBACK
Die Abonnenments des Clients sind danach am Broker gelöscht
Control Packet | Beschreibung |
---|---|
CONNECT | Client fordert Verbindung an |
CONNACK | Server bestätigt Anfrage |
PUBLISH | Nachricht veröffentlichen |
PUBACK | Server bestätigt PUBLISH |
Control Packet | Beschreibung |
---|---|
PUBREC | Bestätigt PUBLISH (QoS 2, Teil 1) |
PUBREL | Bestätigt PUBREC (QoS 2, Teil 2) |
PUBCOMP | Bestätigt PUBREL (QoS 2, Teil 3) |
Control Packet | Beschreibung |
---|---|
SUBSCRIBE | Topic abonnieren |
SUBACK | Server bestätigt Abonnement |
UNSUBSCRIBE | Server bestätigt Anfrage |
UNSUBACK | Server bestätigt Abbestellung |
Control Packet | Beschreibung |
---|---|
PINGREQ | PING Anfrage |
PINGRESP | PING Antwort |
DISCONNECT | Benachrichtigung über Verbindungsabbruch |
UTF-8 Zeichenkette
Zum Filtern von Nachrichten für verbundene Clients
Ein Topic besteht aus 1 oder mehr Topic Leveln
Jedes Level ist separiert durch ein Forward Slash (/
)
Leichtgewichtig: dynamisch, ohne vorherige Initialisierung
home/groundfloor/kitchen/temperature
tinkerforge/bricklet/segment_display_4x7/pUj/segments/set
v1/715e44c0-e260-11e6-a446-0d180dc59d42/things/7c236110-e260-11e6-bac1-91ed518c84d3/data/0
Jedes Topic hat mindestens 1 Zeichen
Leerzeichen sind erlaubt
Topic-Name ist case-sensitiv
Ein einzelner Forward-Slash /
ist erlaubt.
Ein Client kann mehrere Topics auf einmal abonnieren
Wildcards sind nicht beim Publishing erlaubt
Single Level Wildcard: +
Match für irgendeine Zeichenkette in diesem Level
Multi Level Wildcard: #
Match für beliebige Topic-Levels
+
home/groundfloor/+/temperature
MATCH: home/groundfloor/kitchen/temperature
MATCH: home/groundfloor/bathroom/temperature
NO MATCH: home/firstfloor/kitchen/temperature
NO MATCH: home/groundfloor/kitchen/fridge/temperature
#
home/groundfloor/#
MATCH: home/groundfloor/kitchen/temperature
MATCH: home/groundfloor/bathroom/temperature
NO MATCH: home/firstfloor/kitchen/temperature
MATCH: home/groundfloor/kitchen/fridge/temperature
$
PräfixDie Benennung von Topics ist frei, ausgenommen Topics mit $
Präfix
Nicht standardisiert, interne Statistiken am MQTT Broker
Kein Publish, bei Subscription auf #
ausgeblendet
$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime
Verwende kein führendes Forward Slash (/
)
Verwende keine Leerzeichen im Topic
Topic kurz und prägnant benennen
Verwende nur ASCII, vermeide nicht druckbare Zeichen
Nutze eine Id oder ClientId im Topic-Namen
Abonniere nicht #
Berücksichtige die Erweiterbarkeit
Verwende spezifische Topics statt zu allgemein gehaltener
Es gibt eine "opinionated" Konvention, die für SmartHome praktisch erscheint
A lightweight MQTT convention for the IoT
Ein Versuch, für Smarthome Topic-Namen zu standardisieren
Eine Vereinbarung zw. Sender und Empfänger über die Garantie der Zustellung
MQTT kennt 3 QoS Level:
(0) At most once - bestenfalls einmal
(1) At least once - mindestens einmal
(2) Exactly once - genau einmal
Eines der zentralen Features von MQTT
Erleichtert Kommunikation in unzuverlässigen Netzwerken
Behandelt erneuten Versand und Zustellgarantie
Erlaubt dem Client eine für ihn passende Wahl
Anwendungslogik und Zuverlässigkeit seines Netzwerks
Zustellung wird nicht garantiert, es können Verluste auftreten
Beispielsweise sinnvoll für kontinuierliche Sensordaten
Ausreichend für viele Anwendungsfälle
Client sendet PUBLISH, keine Server-Antwort
Zustellung wird garantiert, aber Duplikate sind möglich
Client sendet PUBLISH, Server antwort mit PUBACK
Es wird die einmalige Zustellung sichergestellt
Auch für kritische Geschäftsabläufe sinnvoll
Client sendet PUBLISH mit QoS 2, Server antwortet mit PUBREC
Client reagiert mit PUBREL, Server antwortet mit PUBCOMP
Der Sender ist verantwortlich für erneuten Versand
Der Empfänger muss für QoS jeweils korrekt antworten
Packet Id sind eindeutig je Client
Downgrade von QoS bei unterschiedlichen Leveln der clients
bei einer in der Regeln stabilen Verbindung zw. Sender und Empfänger
Beispiel: Test client oder Frontend über LAN
einige verlorengegangene Nachrichten nicht relevant sind
Beispiel: in kurzen Intervallen gesendete Daten
kein Queing erforderlich ist
Für abgekoppelte Clients mit QoS 1,2 und persistenter Sitzung
jede Nachricht erforderlich ist und Duplikate behandelt werden können
QoS 1 ist das am häufigsten verwendete Level
der Overhead von QoS 2 nicht akzeptabel ist
es zwingend erforderlich ist, jede Nachricht nur genau einmal zu erhalten
Beispiel: Buchungsdaten eines Kunden dürfen nicht mehrfach verarbeitet werden
Hinweis: Qos 2 hat deutlichen Overhead und verzögert den Ablauf
Subscriptions werden normalerweise bei Reconnect verworfen
Der Client muss die Topics daher erneut abonnieren
Problematisch für eingeschränkte Geräte bei Verbindungsverlust
Eine Persistent Session
speichert diese Information für den Client
Bei Reconnect erhält der Client alle Information
Existenz einer Sitzung, auch ohne Subscriptions
Alle Subscriptions
Alle QoS 1,2-Nachrichten ohne Client-Bestätigung
Alle neuen QoS 1,2-Nachrichten, die der Client verpasst hat
Alle empfangenen QoS 2-Nachrichten ohne Betätigung für den Client
Steuerung bei CONNECT über das cleanSession
Flag
cleanSession
= true: keine persistenze Sitzung
alle Nachrichten gehen bei DISCONNECT verloren
cleanSession
= false: persistenze Sitzung
bei Reconnect werden die vorhandenen Informationen geliefert
Client erkennt eine vorhandene Sitzung bei CONNACK am sessionPresent
flag
Alle QoS 1,2-Nachrichten ohne Broker-Bestätigung
Alle empfangenen QoS 2-Nachrichten ohne Betätigung für den Broker
Wann sollte eine persistente Sitzung verwendet werden und wann nicht
Ein Client muss alle Nachrichten erhalten, selbst wenn er offline ist.
Der Broker soll die Nachrichten in einer Warteschlange solange vorhalten
Ein Client hat eingeschränkte Ressourcen und der Broker soll seine Subscription halten
zur schnelle Wiederaufnahme der Kommunikation nach der Unterbrechung
Der Client soll nach dem Reconnect alle Qos 1 und 2 Nachrichten verarbeitet.
Ein Client abonniet nicht, sondern sendet nur Nachrichten an Topics
Er benötigt keinerlei Sitzungsinformationen, auch nicht für QoS 1,2
Ein Client soll explizit keine Nachrichten für seine Offline-Zeit erhalten
Bei Subscriptions ist unklar, ob und wann eine Nachricht eintreffen wird
Der Client ist im Unklaren über den aktuellen Status.
Hierfür sind sog. Retained Messages
nützlich
Eine Retained Message ist eine normale MQTT Nachricht mit retained
Flag
Der Broker speichert die letzte Retained Message und QoS Level für das Topic
Jeder Subscriber erhält die Nachricht direkt nach SUBSCRIBE
Gilt auch für Wildcard Subscriptions, das retained
Flag wird mitgeliefert
Kein Zusammenhang mit persistenten Sitzungen
Löschung durch Senden einer Retained Message mit 0-byte Payload
Wenn neue Subscriber ohne Wartezeit sofort eine Nachricht erhalten sollten
Nützlich bei Status-Updates auf geräte-individuellen Topics
Ähnliches gilt bei Clients, die Daten in Intervallen senden
Ohne Retained Messages müssen neue Subscriber ein Publish Interval abwarten
MQTT wird oft in Szenarien mit unzuverlässigen Netzen genutzt.
Daher wird angenommen, dass Clients ab und zu unsauber abbrechen
durch Verbindungsverlust, leere Batterie etc.
Daher wäre eine Information hilfreich über DISCONNECT oder unsauberem Ende
Hierfür ist Last Will and Testament
(LWT) nützlich
LWT wird zur Benachrichtung anderer Clients über unsaubere Abbrüche verwendet
Jeder Client kann seinen LWT mit einer normalen CONNECT spezifizieren
Der Broker benachrichtigt die Subscriber auf das LWT Topic bei abruptem Abbruch
Die gespeicherte LWT Nachricht wird bei korrektem DISCONNECT verworfen
Ein I/O Fehler oder Netzwerkfehler wird vom Server festgestellt
Der Client konnte nicht innerhalb der KeepAlive
Zeit kommunizieren
Der Client beendet die Verbindung ohne vorherige DISCONNECT Nachricht
Der Server beendet die Verbindung aufgrund eines Protokollfehlers
Benachrichtigung interessierter Clients über Verbindungsverluste
In realen Projekten verwendet mit Retained Messages zur Statusüberwachung
Client meldet seinen Status mit retained
und setzt LWT retained
auf dasselbe Topic
Mit der Retained Message online
und der LWT Nachricht offline
ist der Status
stets aktuell.
Über TCP wird garantiert dass Pakete "zuverlässig, geordnet und geprüft" transferiert werden
Es ist möglich, dass ein Kommunikationspartner mit dem anderen aus dem Tritt kommt
Oft durch einen Crash auf einer Seite oder durch Übertragungsfehler
Dieser Status wird halb-offene Verbindung genannt
Entscheidend: der funktionierende Part ist nicht darüber informiert wird
Er sendet weiterhin Daten oder warten auf Bestätigung
Problem verschärft durch Behandlung von TCP in mobile Netzwerke und Satelliten-Links
MQTT bietet keep alive
zur Sicherstellung der offenen Verbindung zwischen Broker und Client
Client setzt ein Intervall in Sekunden und meldet es dem Broker bei CONNECT
Das Intervall ist der längste mögliche Zeitraum ohne Nachrichtenverstand
Client ist verantwortlich und muss bei Fehlen anderer Nachrichten ein PINGREQ senden
Broker muss dann mit PINGRESP antworten
Der Broker sendet LWT, wenn kein PINGREQ oder andere Nachrichten eintreffen
Der Broker muss die Verbindung bei Ausbleiben von Nachrichten schließen
Der Client ist verantwortlich für das Setzen des richtigen keep alive
Werts.
Die längste keep alive
Zeit ist 18h 12m 15s (65535 Sekunden)
Mit 0
wird der Keep Alive Mechanismus deaktiviert
Ein DISCONNECTED Client wird meist versuchen, sich erneut zu verbinden
Der Broker könnte eine halb-offene Verbindung zum gleichen Client haben
MQTT wird dann einen sog. Client Take-Over ausführen
Der Broker schließt die vorherige Verbindung und verbindet den neuen Client
Damit wird eine Blockade durch halb-offene Verbindungen verhindert
Internes Netzwerk mit Sensoren
Eine Gruppe Sensoren mit Gateway (Raspi)
Übergabe an Cloud über IoT-Gateway (Raspi)
Keine Zugriffe von innen auf externen Broker.
Keine Zugriffe von außen auf interne Geräte.
MQTT.fx - http://mqttfx.org/
Android Play Store - IoT MQTT Dashboard
Raspberry Pi
Standard Jessie Lite Image
Mosquitto (MQTT Broker)
optional: Avahi Daemon (Multicast DNS)
⇒ "attraktor-gw0.local:1883"
keine direkten Zugriffspfade aus dem Internet auf Geräte
Entkopplung aller Geräte über Publish/Subscribe Paradigma
Sicherung gegen Abhören/Verändern mit Verschlüsselung
Sicherung gegen unbekannte Clients mit Authentifizierung
Sicherung gegen unerlaubte Zugriffe mit Autorisierung.
Security is a not a product, but a process.' It’s more than designing strong cryptography into a system; it’s designing the entire system such that all security measures, including cryptography, work together.
Authentifizierung
Autorisierung
Verschlüsselung
Absicherung
Authentifizierung mit Username und Passwort
Autorisierung
Verschlüsselung mit TLS / SSL
Authentication is the act of conforming the truth of an attribute of a single piece of data or entity.
Konfigurationen am Broker
Autorisierung kann den Zugriff auf Topics für Publish/Subscribe beschränken
Black- und Whitelists
Charakteristiken von Nachrichten ebenfalls einschränkbar (Retained, QoS)
OAuth 2.0 (Autorisierung mit Access Tokens über Autorisierungsserver)
TLS v1.2 - Transport Layer Security
TLS mit X.509 Zertifikaten
TLS-PSK (Pre-shared Keys)
in Bytes | QoS 0 | Qos 1 | QoS 2 |
---|---|---|---|
ohne Verschlüsselung | 72 | 78 | 86 |
TLS-PSK | 1172 | 1224 | 1331 |
TLS/SSL | 3742 | 3777 | 3843 |
TLS mit selbst signierten Zertifikaten
TLS mit Let’s Encrypt Zertifikaten für öffentliche Broker
$ wget https://github.com/owntracks/tools/raw/master/TLS/generate-CA.sh .
$ bash ./generate-CA.sh
Let's Encrypt für Mosquitto: https://goo.gl/hFYrtH
$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ ./certbot-auto certonly --manual
# Enter your domain name (you need to own it & have access to the webserver)
# Follow the instruction for the ACME challenge
# Wait for the certificate generation
# copy ca-, cert- und privkey- Files to the respective mosquitto folder.
Lösen mit einer HTTP over MQTT Fassade
bieten Clouddienstleister an.
Es würde am Gateway ein kleiner Node-Server genügen, der HTTP-Anfragen in MQTT übersetzt.
Die Wetterdaten ändern sich in 2 Minuten
Also ist das Polling und die direkte Anzeige per HTTP OK.
CoAP als leichtgewichtigere Alternative lohnt sich aufgrund fehlender Hochfrequenz nicht.
MQTT sorgt für Entkopplung, liefert in diesem Fall keinen Vorteil.
Sobald mehrere Datenempfänger vorgesehen sind, lohnt sich eine Entkopplung mit MQTT
Ideal ist die Verschaltung für eine Funktion möglich physikalisch nah.
Herausforderungen für ein Wearable und entkoppelter nicht blockierender Aufzeichnung
MQTT ist leichtgewichtig genug und publiziert sehr schnell
Ein weiterer Prozess zeichnet kontinuierlich auf (Zeitreihen-DB)
Weitere Prozesse für Anzeige von Stichproben, etwa auf einem OLED des Wearable.
UC: Verteilter optischer und akustischer Tür-Alarm
Bewegungssensor, Mikrofon für Türklingel oder einfacher
Private Benachrichtigung im Haus und unterwegs per App
TinkerForge: Raspi, Brickd, Mosquitto, NodeRed
Raspberry Pi mit Sound-Ausgabe, Zero mit OLED-Alarmanzeige.
Technische Lösung für die Erkennung Türklingel ist zweitrangig.
Der Sensor hat nicht die Aufgabe, die interessierten Client zu kennen.
Wir möchten nicht ständig den Sensor auf Klingelstatus abfragen.
Anwendungsfall direkt realisierbar mit MQTT und den Aktoren.
Prototyping mit Node-Red, später ersetzen durch technische Erkennung.
Einfacher (dummer) Sensor, der ein Gateway benötigt.
Leichgewichtige MQTT-Nachricht genügt, Interpretation auf dem Client.
Die Clients teilen sich eine Schnittstellenvereinbarung und ein Topic.
Senden an App über verschlüsselt per Bridge angeschlossenen Broker.
Alternativ Nutzen bestehender Kanäle, Einsatz von MQTTwarn für Telegram etc.
Einfach bleiben: Es wird keine Aufzeichnung für Langzeitauswertung benötigt.
Entscheidung über Alarm-Verlässlichkeit mittels QoS-Level
Den Zustand der Anlage kann man über LWT überwachen.
Letzter bekannter Alarm-Status beim Client-Start mit Retained Message.
UC: Küchenrezepte halb-automatisch zusammenstellen
Zutaten abwiegen und gemessenes Gewicht kontinuierlich senden
Per Knopfdruck Gewicht und Zutat speichern,
Wägezelle und Dual Button
TinkerForge: Raspi, Brickd, Mosquitto, NodeRed, Datenbank, UI
Protokoll, Rezeptdatenbank öffentlich, privates Netzwerk
UC: Wetter-Dashboard mit MyDevices Cayenne
Mit MyDevices App Wetterdaten darstellen
Öffentliche Oberfläche, privates Netzwerk
Temperatur, Luftfeuchtigkeit üer Sense-Hat
Cayenne Account und UI-Widgets
Manuelle Versorgung mit MQTT
Proxy Dienst für Sense-Hat Übersetzung in Cayenne-Topics
Entkopplung über MQTT Bridge
Test mit MQTT.fx und Javascript Test-Script
Alternativ Transformation und Entsorgung mit Node-RED
UC: Dashboard für Tinkerforge-Sensoren
Prototyping mit Node-RED (https://nodered.org)
Sensor-Gateway mit TinkerForge MQTT Proxy
MQTT-Komponente mit Eclipse Paho (https://eclipse.org/paho/)
Asynchrone MQTT Kommunikation für Charts auf einer Vaadin-UI (https://vaadin.com)
Öffentliche Charts, privates Netzwerk
ESP-8266 und MQTT: https://github.com/knolleary/pubsubclient
MQTT Brokers: https://github.com/mqtt/mqtt.github.io/wiki/server-support
Awesome MQTT: https://github.com/hobbyquaker/awesome-mqtt
Awesome Open IoT: https://github.com/Agile-IoT/awesome-open-iot
Node.js und MQTT: https://www.cloudmqtt.com/docs-nodejs.html
MyDevices Cayenne: https://mydevices.com
Xively
InitialState.com + Flowthings.io
Amazon AWS IoT
IBM Bluemix Message Hub
E-mail: klaus@pittig.de
Twitter: @jforge