Deel 8: Laat je ‘things’ met elkaar praten via MQTT

Het versturen en ontvangen van data is de basis van het Internet of Things. Zou dat niet kunnen, dan kunnen de apparaten niet op elkaar reageren. Zoals ik in de blauwdruk al schreef zijn er veel manieren om data te versturen. Naast het versturen van data via radiosignalen (433 MHz) is het ook mogelijk om gebruik te maken van je bestaande wifi-netwerk. Maar: welk protocol gebruik je daar dan voor?

Protocollen

Er zijn honderden manieren om data over het wifi-netwerk te versturen. Je kunt bijvoorbeeld een e-mail sturen of een webpagina opvragen. Het zijn allebei manieren om een stuk data over te brengen van het ene apparaat naar het andere. Maar: wat is nu de simpelste manier, die bovendien zo min mogelijk energie en geld kost? Een van die oplossingen is MQTT.

MQTT

MQTT is al in 1999 ontwikkeld door onder andere IBM. Het is een voorbeeld van communicatie tussen apparaten (M2M-communicatie). Het protocol werd (en wordt) vaak gebruikt voor telemetrie. De afkorting MQTT stond dan ook voor Message Queue Telemetry Transport. Het protocol is ‘lichtgewicht’ en uitermate geschikt voor het versturen van kleine hoeveelheden data (en het maakt niet uit wat voor soort data!). Bovendien is het ontwikkeld met onbetrouwbare verbindingen in het achterhoofd. Ideaal voor het Internet of Things dus!

In 2013 werd MQTT open source gemaakt en sindsdien waakt OASIS over deze open standaard. Met de snelle groei van het Internet of Things kwam ook MQTT opnieuw in de aandacht. Omdat MQTT inmiddels niet meer alleen wordt gebruikt voor telemetrie, is de naam niet langer een afkorting.

Hoe werkt MQTT?

In een notendop: MQTT werkt met een ‘broker’ (een server) en clients. Die clients kunnen data versturen naar een ‘topic’ of zich abonneren op een topic. Zo kan data worden uitgewisseld. Bovendien is er een aantal slimme foefjes bedacht, zoals het bewaren van berichten en het instellen van QoS (Quality of Service).  Voor een uitgebreidere uitleg over het protocol kun je hier terecht of op de Github-pagina van MQTT.

MQTT gevisualiseerd
MQTT gevisualiseerd door HiveMQ, een commerciële aanbieder van MQTT-diensten. Via: http://www.hivemq.com/wp-content/uploads/publish_flow.png

Waarom MQTT zo nuttig is, komt in een andere post aan de orde. Dan leg ik uit hoe je sensors kunt toevoegen aan Homebridge.

Installeren

Het installeren van MQTT op een Raspberry Pi Zero is uitermate eenvoudig. Er zijn meerdere programma’s beschikbaar, maar ik heb gekozen voor Mosquitto.

Stap 1: Voeg Mosquitto toe aan de repositories. De laatste versie van Mosquitto zit niet in de repositories (simpel gezegd: de database met programma’s) van Raspbian Jessie. Om toch de laatste versie te kunnen installeren voegen we de ‘repository’ van Mosquitto toe. Daartoe moeten we eerste de gpg-sleutel toevoegen. Als dat is gebeurd verversen we de lijst met repositories op de Pi. Let op: iedere regel is een commando dat moet worden afgesloten met een Enter.

Stap 2: Installeer Mosquitto. Naast de server voegen we ook de clients toe en de Python-bindings.

Stap 3: Configureer Mosquitto. Om dat te doen moet de server (die meteen na het installeren wordt gestart) eerst worden gestopt.

Dan pas je het configuratiebestand aan:

Voeg na de regel log_dest topic de volgende regels toe:

Stap 4: Sla het configuratiebestand op.

Sla het bestand op met Ctrl + X, Y en Enter.

Stap 5: Start de Mosquitto-broker.

Voila: Mosquitto draait nu en kan gebruikt worden.

Authenticatie

Standaard hoef je je niet aan te melden met een gebruikersnaam en wachtwoord op een MQTT-broker. Vanuit het oogpunt van de veiligheid is dat wel gewenst. Daarom is het verstandig om dit in te schakelen. Dat doe je als volgt:

Stap 1: Stop de Mosquitto-broker.

Stap 2: Maak een wachtwoord-bestand aan. Let op: pas onderstaande voorbeeld aan met je eigen gebruikersnaam. In dit geval is gekozen voor gebruiker pi. Er wordt twee keer gevraagd om een wachtwoord. Wil je meerdere gebruikers aanmaken? Herhaal dan het commando met een andere gebruikersnaam.

Stap 3: Pas de configuratie van Mosquitto aan.

Voeg de volgende regels toe aan het configuratiebestand:

De laatste regel maakt het onmogelijk in te loggen zonder gebruikersnaam en wachtwoord.

Stap 4: Sla het configuratiebestand op.

Sla het bestand op met Ctrl + X, Y en Enter.

Stap 5: Herstart de Mosquitto-broker.

Mosquitto draait nu met ingeschakelde authenticatie. Om te testen of alles werkt kun je gebruikmaken van een MQTT-app op bijvoorbeeld je telefoon. Ik gebruik daarvoor MQTT Tool voor iOS.

Side note: echt veilig is de combinatie gebruikersnaam/wachtwoord allang niet meer. Het zou beter zijn om bijvoorbeeld met certificaten te werken. Dat is met MQTT ook mogelijk, maar let op: niet elke client kan met certificaten overweg. Het is bijvoorbeeld ingewikkelder als je een ESP8266 gebruikt.

Lees verder in Deel 9: Het gebruik van de sensors in HomeKit.

7 antwoorden op “Deel 8: Laat je ‘things’ met elkaar praten via MQTT”

  1. Hallo
    Heb net je uitleg gevolgd voor het instellen van wachtwoord en gebruikersnaam
    Heb op mijn iPhone 6 MQTT Tool staan maar ik kan geen verbinding maken
    De Raspberry Pi heeft als IP adres 192.168.2.15 ,de poort is 1883
    Dan staat er dit Client ID: MQTTT-485
    Gebruikersnaam .. en ook een wachtwoord
    Als ik op Connect druk gaat hij zoeken maar dan krijg ik de melding Undefined error: 0
    Waar zit de fout dat i geen verbinding krijg
    Ik hoop dat je me kunt helpen
    Vriendelijke groeten Auke van Foeken

  2. Ik ga er vanuit dat je ook met je iPhone 6 op het WiFi-netwerk zit? Dit werkt alleen als beide apparaten op hetzelfde WiFi-netwerk zitten. Heb je eerst in de MQTT-configuratie een gebruiker en een wachtwoord ingesteld? En gebruik je die ook in MQTT Tool?

    Om te testen kun je even kijken of je wel verbinding kunt maken als je in deze regel in het passwd-bestand: allow_anonymous false de laatste waarde (‘false’) aanpast naar ‘true’. Dan kun je ook zonder wachtwoord inloggen en weet je in ieder geval dat MQTT goed ingesteld is. Hoop dat dit je op weg helpt!

  3. Bedankt voor je reactie
    Ik heb de laatste waarde aangepast van false naar true en geprobeerd om te contacten met de tool
    Hij geeft nu aan connection refused
    Mijn file ziet er als volgt uit
    #Place your local configuration in /etc/mosquitto/conf.d/
    #
    #A full description of the configuration fie is at
    # /usr/share/doc/mosquitto/examples/mosquitto.conf.example
    pid_file /var/run/mosquitto.pid

    persistence true
    persistence_location /var/lib/mosquitto/

    log_dest file /var/log/mosquitto/mosquitto.log
    log_type error
    log_type warning
    log_type notice
    log_type information

    connection_messages true
    log_times true

    include_dir /etc/mosquitto/conf.d
    password_file /etc/mosquitto/passwd
    allow_anonymous ‘true’

    In de tool op de Iphone vul ik in bij host het IP adres van de Pi in
    Bij poort 1883
    Bij client ID: MQTT-3971 heb ik niks ingevuld
    Username niks en bij Password ook niks
    Als ik nu connect staat er connection refused
    De broker heb ik gestart op de Pi
    Wat gaat er hier fout?
    Ik wacht je reactie af
    Vriendelijke groeten
    Auke van Foeken

  4. Goedenavond,
    Ik heb de tekens bij true weggehaald en weer geprobeerd om te connecten maar er gebeurt niets
    Ik vul mijn Ip adres van de Pi in 192.168.2.15 en dan bij port 1883
    Bij Client ID vul ik niets in ook geen username en password
    Als ik dan connect geeft hij aan Undefined error:0
    Waar kan het aan liggen nu
    Ik hoop dat je me weer kunt helpen
    Vriendelijke groeten
    Auke van Foeken

  5. Hallo ,
    Ik heb de tests gedaan maar geen resultaat
    Dus heb ik maar de sd kaart geformatteerd en opnieuw geïnstalleerd op de Pi
    Dat werkt weer behalve het overnemen van de Pi met ssh
    Ik krijg het volgende te zien@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
    It is also possible that a host key has just been changed.
    The fingerprint for the ECDSA key sent by the remote host is
    SHA256:/hxwggnOPwwvlB9nGNuk7e+5KeHFDbvvDrBFRj+9jYc.
    Please contact your system administrator.
    Add correct host key in /Users/arvanfoeken/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /Users/arvanfoeken/.ssh/known_hosts:1
    ECDSA host key for 192.168.2.15 has changed and you have requested strict checking.
    Host key verification failed
    Weet jij daar ook raad mee
    Wat moet ik nu doen om de MQTT goed geïnstalleerd te krijgen
    De installatie volgen uit je antwoord van 3 december met http://www.instructables.com of zoals jij het hebt beschreven in je bovenstaande verhaal
    Ik wacht je reactie af
    Vriendelijke groeten
    Auke van Foeken

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *