Wat is MQTT?
MQTT is een afkorting van Message Queuing Telemetry Transport. Het is een lichtgewicht netwerkprotocol dat wordt gebruikt voor publish/subscribe messaging tussen apparaten. Het is ontworpen om open en eenvoudig te zijn. Bovendien is het gemakkelijk te implementeren, waardoor duizenden lichtgewicht clients door één enkele server kunnen worden ondersteund. Een ideale oplossing voor Machine to Machine-communicatie en Internet of Things-contexten waar een kleine code-voetafdruk van groot belang is.
IBM naar OASIS
In 1999 heeft Andy Stanford-Clark van IBM en Arlen Nipper van Arcom de eerste versie van het protocol geschreven. De oorspronkelijke toepassing was om sensoren op oliepijpleidingen te koppelen aan satellieten. Eind 2014 werd het officieel een OASIS-open standaard en zijn er meerdere open source-implementaties te vinden voor een aantal populaire programmeertalen. Later in deze blog vindt u een voorbeeld dat gebruik maakt van een JavaScript-implementatie van de standaard genaamd MQTT.js.
Vergelijking met HTTP
HTTP is een bekend en veelgebruikt protocol dat bijvoorbeeld wordt gebruikt om deze webpagina weer te geven. Het is de basis van datacommunicatie voor het wereldwijde web. Het is een synchroon protocol, terwijl MQTT een asynchroon protocol is. De client wacht niet tot de server reageert, wat het geval is met HTTP. Integendeel, met HTTP gebruikt MQTT geen headers en regels die niet geschikt zijn voor beperkte netwerken. In het algemeen heeft MQTT een snellere reactietijd en een lager batterij- en bandbreedtegebruik.
Berichten
Een bericht in het kader van MQTT bestaat minimaal uit een onderwerp en een payload.
Een topic is een string die bestaat uit één of meerdere topicniveaus. Elk topicniveau wordt gescheiden door een voorwaartse schuine streep. Hier zijn enkele voorbeelden van onderwerpen:
- jidoka/mechelen/temperature
- myhome/groundfloor/livingroom/temperature
- Belgium/Antwerp/Wilrijk
De payload van een bericht is data. Dit kunnen tekst, getallen, image blobs en nog verschillende andere dataformaten zijn. Berichten worden door clients (publishers) verstuurd naar een broker die ze naar andere clients (subscribers) stuurt.
Clients en brokers
In de breedste zin van het woord is een client een apparaat/machine die gegevens binnenhaalt of gegevens publiceert. Het kan eender welk apparaat zijn dat een MQTT-bibliotheek beheert en verbinding maakt met een MQTT-broker via een netwerk.
Een computer die is gekoppeld aan een temperatuursensor die de temperatuur regelmatig doorstuurt is de zogenoemde publisher. Een smartphone met een webpagina die de temperatuur van een sensor weergeeft, is de zogenoemde subscriber.
Een broker is het hart van een MQTT-implementatie. De broker moet berichten ontvangen, filteren en bepalen welke clients geabonneerd zijn op welk bericht. Hij moet ook berichten naar deze geabonneerde clients sturen.
Internet of Things
MQTT stelt ons in staat om eenvoudig sensoren en apparaten te overbruggen via het web, waar het Internet of Things in principe om draait: “Verbind apparaten/machines met het web”. Denk aan slimme lampen, slimme deurbellen, thermostaten, maar ook zogenaamde ‘smart cities’ waarin deze technologie is verwerkt. De verwachting is dat het Internet of Things een impact zal hebben op de overheid, het onderwijs, de financiën en het transport.
Met een beetje fantasie zijn de mogelijkheden eindeloos. Dit brengt ons bij de volgende vraag: “Moeten we nu echt alles verbinden met het web?” Als we even kijken naar een parodie van Internet of Things op Twitter, @internetofshit, dan is het antwoord nee. Bij deze apparaten/functies is het Internet of Things echt te ver gegaan.
Een Tesla-auto met een “Find My Car”-app die maar blijft toeteren en knipperen, waardoor de eigenaar niet kan instappen. Log in op je kerstboom om de lampjes te bedienen. De toch-niet-zo verbonden thermostaten omdat de servers plat liggen waardoor mensen hun verwarming niet kunnen aanzetten.
MQTT voorbeeld
Ons hoofdkantoor is gevestigd in Hasselt, op de Corda Campus, maar we hebben ook een mooi kantoor in Mechelen. Laten we het kantoor in Mechelen gebruiken om een MQTT-implementatie als voorbeeld te demonstreren.
We maken een online dashboard voor ons kantoor in Mechelen dat medewerkers kunnen raadplegen om de temperatuur te controleren en te zien of er een collega aanwezig is. De temperatuur kan gemeten worden met een DHT22 temperatuursensor en de aanwezigheid van een collega met een PIR-bewegingssensor. Beide sensoren zijn aangesloten op een Raspberry Pi die met GPIO-pins de gegevens van de sensoren kan uitlezen. Een broker wordt aan een server in de cloud gekoppeld zodat de sensoren data kunnen publiceren.
Ons dashboard is een eenvoudige frontend applicatie/website die zich abonneert op twee onderwerpen:
- jidoka/mechelen/temperature
- jidoka/mechelen/motion
De infraroodsensor wordt elke keer geactiveerd als hij beweging detecteert. De temperatuur wordt elke 5 minuten gemeten. Het dashboard leest deze waarden af van de broker. Hij verstuurt deze waarden wanneer een sensor gegevens publiceert of wanneer deze is geconfigureerd, zodat de broker gegevens van de sensor moet opslaan en weergeven wanneer een client zich hierop abonneert. Deze laatste is het meest geschikt voor een temperatuursensor omdat je niet elke keer 5 minuten wilt wachten totdat de sensor nieuwe data publiceert.
Zo ziet de opstelling eruit:
Bovenop zie je een Raspberry Pi waarvan de GPIO-pins zijn aangesloten op een breadboard waar onze 2 sensoren op zijn aangesloten. Het kleine witte vierkantje in het midden van het bord is onze DHT22-sensor die de temperatuur en de vochtigheid kan meten. De passieve infrarood sensor (PIR), die beweging detecteert, is te vinden onderaan de foto.
Laten we eens kijken naar de code
Hier zijn enkele vereenvoudigde codefragmenten in JavaScript met MQTT.js die onze use case illustreren. We zullen Mosca gebruiken voor onze broker.
Broker
CLIENT- Temperatuursensor – PUBLISHER
CLIENT – Infrarood bewegingssensor – PUBLISHER
CLIENT – Dashboard frontend-app – SUBSCRIBER
De volledige code van deze voorbeelden is te vinden op Github.
ESP8266
Op de foto van de opstelling heb je misschien een klein apparaatje naast de Raspberry Pi gezien. Het is een NodeMCU-microcontroller met een ESP8266 chip. Dit is een goedkope chip die microcontrollers in staat stelt om verbinding te maken met een Wi-Fi-netwerk. En weet je wat echt cool is? Dat dit kleine apparaat met GPIO-pins wordt uitgerust. Dit wilt zeggen dat je gemakkelijk eender welke sensor eraan kunt koppelen. Daarnaast is het apparaatje zeer goedkoop en is het stroomverbruik redelijk laag. We kunnen onze Raspberry Pi vervangen door dit kleine apparaatje, wat het zeer geschikt maakt voor Internet of Things-toepassingen.
2 microcontrollers die uitgerust zijn met een ESP8266-chip naast een muntstuk van 2 eurocent voor de schaal.
Conclusie
MQTT is een lichtgewicht publish/subscribe-protocol. In de context van ‘Internet of Things’ is het een geldige optie als je apparaten nodig hebt om met elkaar te communiceren. Vooral als je snel sensordata naar meerdere clients wilt sturen. Het feit dat het een open standard is die door OASIS en meerdere programmeertalen wordt ondersteund, maakt MQTT een voorkeursprotocol.
Heb je vragen hebt over MQTT in het algemeen? Of heb je leuke ideeën die je graag zou willen delen? Aarzel dan niet om contact met mij op te nemen via mike.henderyckx@jidoka.be.
Bekijk hier ook de 11-delige blogserie van HiveMQ als je een diepere duik in MQTT wilt nemen.