MQTT for the impatient
Wat is dit nieuwerwets ding? Lichtgewicht berichtenprotocol op basis van TCP/IP Voor het eerst beschreven in 1999 Andy Stanford-Clark (IBM) en Arlen Nipper (CirrusLink) Monitoren pijpleidingen over satelliet verbindingen Door IBM in 2013 als standaard ingediend bij OASIS (met MQTT-sn voor niet TCP/IP) Nu ondergebracht bij Eclipse (van die IDE)
Wat is dit nieuwerwets ding? Basis voor een aantal chat-clients Facebook bekendste DeltaRail stuurt seinen en wissels aan CENELEC approved safety system Amazon WS IoT platform is MQTT egeltje’s huisautomatisering/foon tracking
Clients → Broker Broker is centrale hub Client initieert sessie MQTT poort 1883 MQTTS poort 8883 TLS layer met X.509 certs
Clients → Broker
Publish / Subscribe Publish berichten naar een broker Subscribe op berichten bij een broker Als er een bericht gepublished wordt in een topic, kijkt de broker wie een subscription op dat topic heeft en forward het bericht.
Bekende brokers Mosquitto ActiveMQ HiveMQ RabbitMQ IBM MessageSight Node/js mqtt
Messages Message bestaat uit twee delen Msg.topic Msg.content En wat meta-stuff QoS Retain LWT ...
Msg.topic Geeft context van het bericht Hierarchische vorm met levels Levelscheiding door slash “/” hack42/flexlab/lamp/status “Leading slash” geeft extra overhead /hack42/defcon = <leeg level>/hack42/defcon level level
Msg.topic + is een wildcard voor een level hack42/flexlab/+/status hack42/flexlab/schakelaar/status hack42/flexlab/lamp/status Meerdere level-wildcards mogelijk # is een wildcard voor alle volgende levels hack42/flexlab/#
Speciale topics LWT (Last Will and Testament) Broker houdt sessie open met clients. Als client wegvalt, stuurt broker LWT.content op LWT.topic hack42/device/03c59812 disconnected Birth (nieuw) $SYS Alle content, inclusief broker-client communicatie
Keuzes, keuzes, keuzes Topic per per geografie per functie nog wat anders <gebouw>/<kamer>/<locatie>/<functie> <device>/<functie> ?
Msg.content Max 1024 byte Kan letterlijk van alles zijn, MQTT geeft 0 fscks hack42/weer/wind/richting ZW hack42/weer/wind/snelheid 4 JSON met context kan hack42/weer/wind {wind {richting: “ZW”, snelheid: 4} }
Msg.content “QoS” Drie niveau’s van QoS 0 fire-and-forget Als udp 1 ontvangstbevestiging van broker Als tcp 2 afleverbevestiging van alle subscribed clients Als WhatsApp-blauwe-vinkjes
Msg.content “Retain” Broker onthoudt laatste message en stuurt dit naar nieuwe subscriptions Op sessie niveau: “clean” vs “persistent”
Demo
Nog even... Brokers / Bridges Van de ene naar de andere broker, gebaseerd op het topic
Nog even...
Nog even...
ESP8266
Sonoff
Sonoff
egeltje’s set-up Broker Mosquitto in een FreeBSD jail op een PCengines APU platform (opvolger ALIX) Waarvan 1 intern, 1 in DMZ en 1 op vps Clients paho python-client op Rpi esp_mqtt op Sonoff (esp8266) OwnTracks op foon Brains Node-Red / Node-Red-Dashboard in andere FreeBSD jail
Node-Red Node.js “app” Lijm tussen inputs en outputs Dat klinkt breed en dat is het ook...
Node-Red
Node-Red # pkg update # pkg install node npm # npm install -g node-red <ctrl + c> # cd .node-red # npm install node-red-contrib-bigtimer \ > node-red-dashboard \ > node-red-contrib-owntracks \ > node-red-node-geofence \ > node-red-contrib-buienradar \ > node-red-node-email \ > node-red-node-openweathermap \ > node-red-node-irc # _
Node-Red Auto start via pm2 (node module) of screen
egeltje’s toolchain Mosquitto http://www.mosquitto.org Node-Red http://nodered.org/
egeltje’s toolchain Eclipse CDT https://www.eclipse.org ESP-open-sdk https://github.com/pfalcon/esp-open-sdk esp_mqtt https://github.com/tuanpmt/esp_mqtt Eclipse Paho http://www.eclipse.org/paho/ OwnTracks http://owntracks.org/
“Where do we go from here?” http://www.mqtt.org http://www.hivemq.com/mqtt-essentials/ http://tech.scargill.net/
Demo