Protocol: MQTT¶
MQTT is een publish-subscribe-protocol dat je in allerlei omgevingen kunt gebruiken. In het bijzonder is MQTT geschikt voor het Internet of Things. In die context zijn zowel IoT-knopen als IoT-toepassingen (apps) clients van de MQTT-broker. De interactie is symmetrisch: zowel een IoT-knoop als een IoT-toepassing kan een bericht publiceren naar de broker.
Een typisch gebruik van MQTT voor IoT-toepassingen:
- een IoT-knoop publiceert zijn sensordata naar de broker
als de sensordata veranderd zijn, of met een vaste regelmaat;
met een topic dat gekoppeld is aan de identiteit van de IoT-knoop;
- een IoT-knoop abonneert zich op de actuatordata voor de eigen actuatoren
met een topic dat gekoppeld is aan de identiteit van de knoop;
een IoT-app abonneert zich op de sensordata van de relevante knopen;
- een IoT-app stuurt een actuator in een IoT-knoop aan door een “publish”
van een bericht met het actuator-topic van de IoT-knoop.
Voorbeeld
Uitleg:
IoT-knoop A publiceert zijn sensordata onder topic
A/sensors
IoT-knoop A (na “subscribe(A/led)”) ontvangt de berichten voor het aansturen van de eigen LED
analoog voor IoT-knoop B
- toepassing (app) C ontvangt (na “subscribe(+/sensors)”) de sensordata van A en van B
“+” is hierin een wildcard-teken: dit past op alle strings (node-id’s)
toepassing C stuurt de LED van de node A aan.
- analoog voor app D
deze communiceert alleen met node B.
de broker stuurt de sensordata door naar de apps, en de led-aansturing naar de IoT-knopen.
Protocolstack¶
MQTT gebruikt het TCP-protocol;
voor beveiligde verbindingen kan TLS gebruikt worden (tussen TCP en MQTT);
MQTT-brokers bieden soms ook MQTT via het websockets-protocol; dit werkt naast HTTP, op basis van TCP (en eventueel TLS).
Adressering: topic¶
Door middel van een topic adresseert een MQTT-client de berichtenstroom voor een publish- of subscribe-actie.
Een MQTT-topic bestaat uit een aantal strings gekoppeld door /
,
bijvoorbeeld abd
, abc/def
, abc/123/def
.
Dit lijkt op de padnaam in een URL.
Bij een subscribe kun je in de topic-string ook wildcards opnemen:
+
staat voor een willekeurige string zonder /
;
#
voor een willekeurige string waarin ook het koppelteken /
mag voorkomen.
voorbeeld:
node/+/sensors
matcht metnode/12/sensors
ennode/432/sensors
.voorbeeld:
node/#
matcht metnode/12/sensors
ennode/432/led
Gebruik van topics in de voorbeelden
We gebruiken in de software bij deze module een aantal vaste afspraken voor MQTT-topics. Hierdoor kunnen we de verschillende soorten IoT-knopen combineren met de verschillende toepassingen.
voor sensoren:
node/<nodeid>/sensors
voor actuatoren:
node/<nodeid>/actuators
Hierin is <nodeid>
de identificatie (string) van de IoT-knoop.
Payload: JSON¶
Er is geen vast voorgeschreven payload-formaat voor MQTT. Een formaat dat veel gebruikt wordt is JSON: JavaScript Object Notation. Dit is een tekst-gebaseerd formaat voor objecten. Ook in de voorbeelden gebruiken we JSON als MQTT-payload.